c语言 打印不出来?文件用得对吗 5C

#include
#include
#include
#include
#define max 100
//定义全局变量
int isEmpty=0;//标志,判断链表是否为空

//!!!定义单链表结构体!!! <货物类型>
typedef struct Node{
char NAME[100];//各类型名称
int NUM; //各类型下的货物总数
struct Node*next;
}Node;

// 定义单个货物
typedef struct Goods{
char name[100];//货物名称
double price;//货物价格
int num;//货物库存
int id;//所属类型的id
}Goods;

//函数声明
void Create_File_List(); //创建文件
void add_kinds();//将种类信息录入文件中
Node*CreateList();//创建链表(将信息放到链表中)
void Print_List(Node*head);//打印链表

//主函数
void main()
{
int x;
Node head;
if(!(head=(Node *)malloc(sizeof(Node)))) //分配空间
{
printf("\n");
exit(1);
}
Create_File_List();//创建文件
printf("欢迎使用我的仓库管理系统!\n");
while(1)
{
//主菜单开始
printf("==========================\n");
printf("1.显示货物类型列表\n");
printf("2.增加货物类型\n");
printf("3.删除货物类型\n");
printf("4.货物入库\n");
printf("5.货物出库\n");
printf("6.库存显示\n");
printf("7.退出\n");
printf("==========================\n");
//主菜单结束
printf("选择1-7:");
scanf("%d",&x);
switch(x)
{
case 1:Print_List(head);break;
case 2:add_kinds();
CreateList();
break;
case 3:printf("
*****请输入要删除货物类型的编号:******\n");
break;
case 4:;break;
case 5:;break;
case 6:;break;
case 7:printf("bye!see you next time!\n");
exit(0);
break;
default:printf("input error!\nplaese input1-7");
}

}

}

//函数
//创建文件是否成功
void Create_File_List()
{
FILE fp;//需要在每个函数写这句吗
if ((fp = fopen("storehouse.txt","r"))==NULL) /
如果此文件不存在*/
{
if ((fp = fopen("student.txt","w"))==NULL)
{
printf( "无法建立文件!");

}
}
}
//录入货物信息到文件中
void add_kinds()
{
FILE*fp;
struct Node Node;
fp = fopen("storehouse.txt","a+");
Create_File_List();
printf("请输入货物名称:");
scanf("%s",&Node.NAME);
printf("请输入货物总数:");
scanf("%d",&Node.NUM);
fwrite(&Node,sizeof(Node),1,fp);//这两个fwrite有区别吗
fclose(fp);
}

//从已经写入的文件中读到链表中(函数功能:创建链表)
Node*CreateList()
{
Node*p,*head,*q;//p指针总是指向新申请的节点,q总是指向尾节点
p=(Node*)malloc(sizeof(Node));
head=p;//开辟头/尾节点内存 (头结点没有信息)
q=p;
q->next=NULL;//标志链表的结束
FILE*fp;
fp=fopen("storehouse.txt","r");
struct Node Node;
while(fread(&Node,sizeof(Node),1,fp)!=0)//从文件中读结构块体
{
//p=(Node*)malloc(sizeof(Node));
strcpy(p->NAME,Node.NAME);
p->NUM=Node.NUM;
//下面两句没看懂
q->next=p;//把新节点挂到尾节点后

q=q->next;//q指针指向新的尾节点
//第二句不就是q=p吗?
}
q->next=NULL;//标志链表的结束
fclose(fp);
return head;
}

//从链表中输出打印到屏幕中数据(输出链表)
void Print_List(Node*head)
{
Node*p;
p=head->next;//跳过无数据的头结点
while(p!=NULL)
{
printf("%s",p->NAME);
printf("%d",p->NUM);
p=p->next;//指向下一个节点
}
}
图片说明

5个回答

让你用fscanf和fprintf,起码你试试看吧。

图片说明
数据结构都快忘完le

这种程序我写过你可以找一下可能是文件的逻辑错了,提前结束或者肯本就没有执行

最好先搞清楚其中的逻辑关系,比如插入和删除节点,打印节点信息就比较清楚了

  1. 当你没有选择2添加商品信息的时候,你的链表只有一个头结点,而且没有初始化,它的next不是NULL,但是它指向的内存不合法,所以你调用Print_List()的时候由于访问了head->next->NAME,导致程序异常退出。
  2. 当你选择2添加了商品信息的时候,调用了CreateList,但是不管这个函数具体做了什么,这是个无参函数,你也没有接收它的返回值,函数体也没有操作任何全局变量,所以你调用它和没调用它是没区别的,接下来的过程就和1一样了。
  3. 如果你回复我,我可以给你写一份带注释的没错误的版本。不是我在小白面前装x,只是我看你基础很差,这些代码就是复制粘贴。我不太相信:一个会写单链表的人却看不出来一个函数调用没有实际效果。
tmsc123
透明水彩 回复cara_celia: 在VC6和VS下正常运行,有什么问题可以跟我说。
大约 2 年之前 回复
tmsc123
透明水彩 回复cara_celia: 链接:https://pan.baidu.com/s/1l_D31lWdGMVmB93FpLYsMQ密码:lfgy
大约 2 年之前 回复
tmsc123
透明水彩 回复cara_celia: 我尽快整理好发给你,别急。
大约 2 年之前 回复
cara_celia
cara_celia 真的是晕死了TnT
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐