user-0 提问: 小白做了个学生信息管理系统，但是不知道为什么就是运行的界面不对

回复:
user: user-0
content: 引用 8 楼 学码就是爱好 的回复:十多年前学过C，最新重新看了一部分，文件和结构体还没系统看，但是我个人理解，这个程序伪代码这样： 首先读取文件，然后根据文件内数据结构的多少（具体实现还没想过是通过历遍还是在文件开头存储结构体数量）申请结构体内存； 将文件内的数据与申请的结构体关联； 然后所有的增加、删除、修改、查询都在结构体链表中进行； 退出程序时，检查是否进行过增加、删除、修改的，如果是 将新的结构体链表存入文件，如果不是直接退出。  另外程序中应该是文件的打开与关闭 ，内存的申请与释放 一一对应。 可能说的不对，请包涵。谢谢大佬！很久没上csdn，今天才看到您的回复，真的很感谢您的指正！

user: user-1
content: 十多年前学过C，最新重新看了一部分，文件和结构体还没系统看，但是我个人理解，这个程序伪代码这样： 首先读取文件，然后根据文件内数据结构的多少（具体实现还没想过是通过历遍还是在文件开头存储结构体数量）申请结构体内存； 将文件内的数据与申请的结构体关联； 然后所有的增加、删除、修改、查询都在结构体链表中进行； 退出程序时，检查是否进行过增加、删除、修改的，如果是 将新的结构体链表存入文件，如果不是直接退出。  另外程序中应该是文件的打开与关闭 ，内存的申请与释放 一一对应。 可能说的不对，请包涵。

user: user-1
content: 测试，除了新增与查询的功能正确，修改与删除都不能保存到文件

user: user-1
content: 修改代码如下： #include <stdio.h> #include <string.h> #include <malloc.h>  struct stud {     int num;     char name[30];     char classnum[30];     int score[4];     struct stud *next; };  struct stud *head=NULL;  void InsertStud() {     char s[10];     do      {          int tmp;          printf("请输入学号：");          scanf("%d",&tmp);          struct stud *q,*p;          p=head;           while(p!=NULL)            {             if(p->num==tmp)               {                 printf("该学生已存在！\n");                 return;                }               p=p->next;             }            q=(struct stud*)malloc(sizeof(struct stud));            if(q==NULL)              {                printf("申请内存失败\n");                return;              }              q->num=tmp;             printf("请输入姓名：");             scanf("%s",q->name);             printf("请输入班级：");             scanf("%s",&q->classnum);             printf("请输入四门课的成绩：");             scanf("%d %d %d %d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);             q->next=NULL;              p=head;             if(p==NULL)                 {                     head=q;                 }             else                 {                     while(p->next!=NULL)                         {                             p=p->next;                         }                     p->next=q;                 }             printf("学生增加成功！\n");              printf("你还需要继续输入学生信息吗？(no退出)：");             scanf("%s",s);           }         while(strcmp(s,"no")!=0);  }   void DelStud() { int flag=1; int num; printf("请输入要删除的学生学号：\n"); scanf("%d",&num); struct stud *p,*q; q=p=head; while(p!=NULL&&flag==1) { if(p->num==num) { if(p==head)//删除首节点 { head=p->next; free(p); } else { q->next=p->next; free(p); } flag=0; printf("删除学生信息成功！\n"); return; } else { q=p; p=p->next; }  } if(flag==1) { printf("没有找到可以删除的学生学号！\n"); } }   void UpdateStud() { int flag=1; int num; printf("请输入要修改的学生的学号：\n"); scanf("%d",&num);  struct stud *p; p=head; while(p!=NULL&&flag==1) { if(p->num==num) { printf("请输入新学号：\n"); scanf("%d",&p->num); printf("请输入新姓名：\n"); scanf("%s",p->name); printf("请输入新班级：\n"); scanf("%s",p->classnum); printf("请输入新成绩：\n"); scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]); flag=0; printf("学生信息修改操作成功\n"); } else { p=p->next; }  } if(flag==1) { printf("没有找到要修改的记录\n"); }  } void QueryStud() { int flag=1; int num; printf("请输入要查询的学号：\n"); scanf("%d",&num);  struct stud *p; p=head; while(p!=NULL&&flag==1) { if(p->num==num) { printf("姓名：%s\n",p->name); printf("学号：%d\n",p->num); printf("班级：%s\n",p->classnum); printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d\n",p->score[0],p->score[1],p->score[2],p->score[3]); flag=0; } else { p=p->next; } } if(flag==1) { printf("没有查询到要查询的信息！"); } }  /*void StaticStud() { } */ void SaveStud() { FILE *fp;  fp=fopen("stud.dat","ab+");//打开文件stud.dat //{ //printf("文件打开失败\n"); //return;//打开失败退出 //} struct stud *p; p=head; while(p!=NULL) { fwrite(p,sizeof(struct stud),1,fp); p=p->next; }  fclose(fp);//关闭文件 printf("学生信息保存成功！\n"); }  int fileexist(const char *filename) { FILE *fp; if((fp=fopen(filename,"rb"))==NULL) return 0; else { fclose(fp); return 1; } } void load() { if(fileexist("stud.dat")==0) return;  FILE *fp; if((fp=fopen("stud.dat","rb"))==NULL) { printf("文件打开失败!\n"); return; }  struct stud *p,*q; p=head;  while(!feof(fp)) { q=(struct stud *)malloc(sizeof(struct stud)); if(q==NULL) { printf("申请内存失败!\n"); return; } fread(q,sizeof(struct  stud),1,fp); q->next=NULL; if(head==NULL) // if(P==NULL) { //head=p; head=q; p=q; } else { while(p->next!=NULL) { p=p->next; } p->next=q; }  } fclose(fp);  }  int main() {     int i;     load();     do     {         printf("\n\n\n");         printf("\t\t*****************************************\n");         printf("\t\t**                                     **\n");         printf("\t\t**       欢迎来到学生信息管理系统      **\n");         printf("\t\t*****************************************\n");         printf("\t\t** 1、增加学生信息      2、删除学生信息**\n");         printf("\t\t** 3、修改学生信息      4、查询学生信息**\n");         printf("\t\t** 5、基本信息统计      6、保存学生信息**\n");         printf("\t\t** 7、退出                             **\n");         printf("\t\t**                                     **\n");         printf("\t\t*****************************************\n");         printf("请选择操作：");         scanf("%d",&i);         switch(i)         {             case 1 : InsertStud();break;             case 2 : DelStud();break;             case 3 : UpdateStud();break;             case 4 : QueryStud();break;                      // case 5 : StaticStud();break;             case 6 : SaveStud();break;             case 7 : break;             default : printf("选择错误，请重选");break;         }     }while(i!=7);     return 0; }   做更新 删除 增加的操作 如果不进行6 保存操作 所做的操作实际上都没有保存，再次打开程序读文件 数据没有变化，因此要么在做以上三个动作要么直接接保存动作，要么提示用户保存。

user: user-0
content: 引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <string.h> #include <malloc.h>  struct stud {     int num;     char name[30];     int classnum;     int score[4];     struct stud *next; };  struct stud *head=NULL;  void InsertStud() {      char s[10];     do     {         int tmp;         printf("请输入学号：\n");         scanf("%d",&tmp);          struct stud *q,*p;         p=head;          while(p!=NULL)         {             if(p->classnum==tmp)             {                 printf("该学生已存在！\n");                 return;             }             p=p->next;         }         q=(struct stud*)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败\n");             return;         }          q->classnum=tmp;         printf("请输入姓名：");         scanf("%s",q->name);         printf("请输入学号：");         scanf("%d",&q->num);         //printf("请输入班级："); //还要输入班级吗？上面不是已经赋值了吗？         //scanf("%s",&q->classnum);         printf("请输入四门课的成绩：");         scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);         q->next=NULL;          p=head;         if(p==NULL)         {             head=q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }         printf("学生增加成功！\n");          printf("你还需要继续输入学生信息吗？(no退出)：");         scanf("%s",s);     }     while(strcmp(strupr(s),"NO")!=0);  }   void DelStud() {     int flag=1;     int num;     printf("请输入要删除的学生学号：\n");     scanf("%d",&num);     struct stud *p,*q;     p=q=head;     while(p!=NULL&&flag==1)     {         if(p->classnum==num)         {             if(p==head)//删除首节点             {                 head = p->next;                 free(p);             }             else             {                 q->next=p->next;                 free(p);             }             flag=0;             printf("删除学生信息成功！\n");             return;         }         else         {             q=p;             p=p->next;         }      }     if(flag==1)     {         printf("没有找到可以删除的学生学号！\n");     } }   void UpdateStud() {     int flag=1;     int num;     printf("请输入要修改的学生的学号：\n");     scanf("%d",&num);      struct stud *p;     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("请输入新学号：\n");             scanf("%d",&p->num);             printf("请输入新姓名：\n");             scanf("%s",p->name);             printf("请输入新班级：\n");             //scanf("%s",p->classnum);             scanf("%d", &p->classnum);             printf("请输入新成绩：\n");             scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             flag=0;             printf("学生信息修改操作成功\n");         }         else         {             p=p->next;         }      }     if(flag==1)     {         printf("没有找到要修改的记录\n");     }  } void QueryStud() {     int flag=1;     int num;     struct stud *p;     printf("请输入要查询的学号：\n");     scanf("%d",&num);     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("姓名：%s",p->name);             //printf("学号：%d",&p->num);    //为什么要加&?             printf("学号：%d", p->num);             //printf("班级：%s",p->classnum);             printf("班级：%d",p->classnum);             //printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d", p->score[0], p->score[1], p->score[2], p->score[3]);             flag=0;         }         else         {             p=p->next;         }     }     if(flag==1)     {         printf("没有查询到要查询的信息！");     } }  /*void StaticStud()   {   }   */ void SaveStud() {     FILE *fp;      if((fp=fopen("stud.dat","wb"))==NULL);//打开文件stud.dat     {         printf("文件打开失败\n");         return;//打开失败退出     }     struct stud *p;     p=head;     while(p!=NULL)     {         fwrite(p,sizeof(struct stud),1,fp);         p=p->next;     }      fclose(fp);//关闭文件     printf("学生信息保存成功！\n"); }  //int fileexist(char *filename) int fileexist(const char *filename) {     FILE *fp;     if((fp=fopen(filename,"rb"))==NULL)         return 0;     else     {         fclose(fp);         return 1;     } } void load() {     if(fileexist("stud.dat")==0)         return;      FILE *fp;     if((fp=fopen("stud.dat","rb"))==NULL)     {         printf("文件打开失败!\n");         return;     }      struct stud *p,*q;     p=head;      while(!feof(fp))     {         q=(struct stud *)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败!\n");             return;         }         fread(q,sizeof(struct  stud),1,fp);         q->next=NULL;          //if(p==NULL)         if(head==NULL)         {             //head=p;             head = q;   //如果把p赋值给head，那么这里是有问题的;             p = q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }      }     fclose(fp); }  int main() {     int i;     load();     do     {         printf("\n\n\n");         printf("\t\t*****************************************\n");         printf("\t\t**                                     **\n");         printf("\t\t**       欢迎来到学生信息管理系统      **\n");         printf("\t\t*****************************************\n");         printf("\t\t** 1、增加学生信息      2、删除学生信息**\n");         printf("\t\t** 3、修改学生信息      4、查询学生信息**\n");         printf("\t\t** 5、基本信息统计      6、保存学生信息**\n");         printf("\t\t** 7、退出                             **\n");         printf("\t\t**                                     **\n");         printf("\t\t*****************************************\n");         printf("请选择操作：");         scanf("%d",&i);         switch(i)         {             case 1 : InsertStud();break;             case 2 : DelStud();break;             case 3 : UpdateStud();break;             case 4 : QueryStud();break;                      // case 5 : StaticStud();break;             case 6 : SaveStud();break;             case 7 : break;             default : printf("选择错误，请重选");break;         }     }while(i!=7);     return 0; } 供参考～ 感谢大牛！经过修改以后我的代码如下，但是每当我按6想要保存文件的时候，总是提示文件打开失败，由于我对文件的操作非常的不熟悉，所以不知道到底是什么问题导致这种情况，求解答  #include <stdio.h> #include <string.h> #include <malloc.h> struct stud { 	int num; 	char name[30]; 	char classnum[30]; 	int score[4]; 	struct stud *next; };  struct stud *head=NULL;  void InsertStud() {  	char s[10]; 	do 	{	 		int tmp; 		printf("请输入学号：\n"); 	    scanf("%d",&tmp);  	    struct stud *q,*p; 		p=head;  		while(p!=NULL) 		{ 			if(p->num==tmp) 			{ 				printf("该学生已存在！\n"); 				return; 			} 			p=p->next; 		} 		q=(struct stud*)malloc(sizeof(struct stud)); 		if(q==NULL) 		{ 			printf("申请内存失败\n"); 			return; 		}  		q->num=tmp; 		printf("请输入姓名："); 		scanf("%s",q->name); 		printf("请输入学号："); 		scanf("%d",&q->num); 		printf("请输入班级："); 		scanf("%s",&q->classnum); 		printf("请输入四门课的成绩："); 		scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]); 		q->next=NULL;  		p=head; 		if(p==NULL) 		{ 			head=q; 		} 		else 		{ 			while(p->next!=NULL) 			{ 				p=p->next; 			} 			p->next=q; 		} 		printf("学生增加成功！\n");  		printf("你还需要继续输入学生信息吗？(no退出)："); 		scanf("%s",s); 	} 		while(strcmp(strupr(s),"NO")!=0);  }   void DelStud() { 	int flag=1; 	int num; 	printf("请输入要删除的学生学号：\n"); 	scanf("%d",&num); 	struct stud *p,*q; 	q=p=head; 	while(p!=NULL&&flag==1) 	{ 		if(p->num==num) 		{ 			if(p==head)//删除首节点 			{ 				head=p->next; 				free(p); 			} 			else 			{ 				q->next=p->next; 				free(p); 			} 			flag=0; 			printf("删除学生信息成功！\n"); 			return; 		} 		else 		{ 			q=p; 			p=p->next; 		}  	} 	if(flag==1) 	{ 		printf("没有找到可以删除的学生学号！\n"); 	} }   void UpdateStud() { 	int flag=1; 	int num; 	printf("请输入要修改的学生的学号：\n"); 	scanf("%d",&num);  	struct stud *p; 	p=head; 	while(p!=NULL&&flag==1) 	{ 		if(p->num==num) 		{ 			printf("请输入新学号：\n"); 			scanf("%d",&p->num); 			printf("请输入新姓名：\n"); 			scanf("%s",p->name); 			printf("请输入新班级：\n"); 			scanf("%s",p->classnum); 			printf("请输入新成绩：\n"); 			scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]); 			flag=0; 			printf("学生信息修改操作成功\n"); 		} 		else 		{ 			p=p->next; 		}  	} 	if(flag==1) 	{ 		printf("没有找到要修改的记录\n"); 	}  } void QueryStud() { 	int flag=1; 	int num; 	printf("请输入要查询的学号：\n"); 	scanf("%d",&num);  	struct stud *p; 	p=head; 	while(p!=NULL&&flag==1) 	{ 		if(p->num==num) 		{ 			printf("姓名：%s\n",p->name); 			printf("学号：%d\n",p->num); 			printf("班级：%s\n",p->classnum); 			printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d\n",p->score[0],p->score[1],p->score[2],p->score[3]); 			flag=0; 		} 		else 		{ 			p=p->next; 		} 	} 	if(flag==1) 	{ 		printf("没有查询到要查询的信息！"); 	} }  /*void StaticStud() { } */ void SaveStud() { 	FILE *fp;  	if((fp=fopen("stud.dat","wb"))==NULL);//打开文件stud.dat 	{ 		printf("文件打开失败\n"); 		return;//打开失败退出 	} 	struct stud *p; 	p=head; 	while(p!=NULL) 	{ 		fwrite(p,sizeof(struct stud),1,fp); 		p=p->next; 	}  	fclose(fp);//关闭文件 	printf("学生信息保存成功！\n"); }  int fileexist(const char *filename) { 	FILE *fp; 	if((fp=fopen(filename,"rb"))==NULL) 	return 0; 	else 	{ 		fclose(fp); 		return 1; 	} } void load() { 	if(fileexist("stud.dat")==0) 	return;  	FILE *fp; 	if((fp=fopen("stud.dat","rb"))==NULL) 	{ 		printf("文件打开失败!\n"); 		return; 	}  	struct stud *p,*q; 	p=head;  	while(!feof(fp)) 	{ 		q=(struct stud *)malloc(sizeof(struct stud)); 		if(q==NULL) 		{ 			printf("申请内存失败!\n"); 			return; 		} 		fread(q,sizeof(struct  stud),1,fp); 		q->next=NULL; 		if(head==NULL) 	//	if(P==NULL) 		{ 			//head=p; 			head=q; 			p=q; 		} 		else 		{ 			while(p->next!=NULL) 			{ 				p=p->next; 			} 			p->next=q; 		}  	} 	fclose(fp);  } 感谢大牛！经过修改以后我的代码如下，但是每当我按6想要保存文件的时候，总是提示文件打开失败，由于我对文件的操作非常的不熟悉，所以不知道到底是什么问题导致这种情况，求解答

user: user-2
content: 好厉害哦。。

user: user-0
content: 引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <string.h> #include <malloc.h>  struct stud {     int num;     char name[30];     int classnum;     int score[4];     struct stud *next; };  struct stud *head=NULL;  void InsertStud() {      char s[10];     do     {         int tmp;         printf("请输入学号：\n");         scanf("%d",&tmp);          struct stud *q,*p;         p=head;          while(p!=NULL)         {             if(p->classnum==tmp)             {                 printf("该学生已存在！\n");                 return;             }             p=p->next;         }         q=(struct stud*)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败\n");             return;         }          q->classnum=tmp;         printf("请输入姓名：");         scanf("%s",q->name);         printf("请输入学号：");         scanf("%d",&q->num);         //printf("请输入班级："); //还要输入班级吗？上面不是已经赋值了吗？         //scanf("%s",&q->classnum);         printf("请输入四门课的成绩：");         scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);         q->next=NULL;          p=head;         if(p==NULL)         {             head=q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }         printf("学生增加成功！\n");          printf("你还需要继续输入学生信息吗？(no退出)：");         scanf("%s",s);     }     while(strcmp(strupr(s),"NO")!=0);  }   void DelStud() {     int flag=1;     int num;     printf("请输入要删除的学生学号：\n");     scanf("%d",&num);     struct stud *p,*q;     p=q=head;     while(p!=NULL&&flag==1)     {         if(p->classnum==num)         {             if(p==head)//删除首节点             {                 head = p->next;                 free(p);             }             else             {                 q->next=p->next;                 free(p);             }             flag=0;             printf("删除学生信息成功！\n");             return;         }         else         {             q=p;             p=p->next;         }      }     if(flag==1)     {         printf("没有找到可以删除的学生学号！\n");     } }   void UpdateStud() {     int flag=1;     int num;     printf("请输入要修改的学生的学号：\n");     scanf("%d",&num);      struct stud *p;     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("请输入新学号：\n");             scanf("%d",&p->num);             printf("请输入新姓名：\n");             scanf("%s",p->name);             printf("请输入新班级：\n");             //scanf("%s",p->classnum);             scanf("%d", &p->classnum);             printf("请输入新成绩：\n");             scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             flag=0;             printf("学生信息修改操作成功\n");         }         else         {             p=p->next;         }      }     if(flag==1)     {         printf("没有找到要修改的记录\n");     }  } void QueryStud() {     int flag=1;     int num;     struct stud *p;     printf("请输入要查询的学号：\n");     scanf("%d",&num);     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("姓名：%s",p->name);             //printf("学号：%d",&p->num);    //为什么要加&?             printf("学号：%d", p->num);             //printf("班级：%s",p->classnum);             printf("班级：%d",p->classnum);             //printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d", p->score[0], p->score[1], p->score[2], p->score[3]);             flag=0;         }         else         {             p=p->next;         }     }     if(flag==1)     {         printf("没有查询到要查询的信息！");     } }  /*void StaticStud()   {   }   */ void SaveStud() {     FILE *fp;      if((fp=fopen("stud.dat","wb"))==NULL);//打开文件stud.dat     {         printf("文件打开失败\n");         return;//打开失败退出     }     struct stud *p;     p=head;     while(p!=NULL)     {         fwrite(p,sizeof(struct stud),1,fp);         p=p->next;     }      fclose(fp);//关闭文件     printf("学生信息保存成功！\n"); }  //int fileexist(char *filename) int fileexist(const char *filename) {     FILE *fp;     if((fp=fopen(filename,"rb"))==NULL)         return 0;     else     {         fclose(fp);         return 1;     } } void load() {     if(fileexist("stud.dat")==0)         return;      FILE *fp;     if((fp=fopen("stud.dat","rb"))==NULL)     {         printf("文件打开失败!\n");         return;     }      struct stud *p,*q;     p=head;      while(!feof(fp))     {         q=(struct stud *)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败!\n");             return;         }         fread(q,sizeof(struct  stud),1,fp);         q->next=NULL;          //if(p==NULL)         if(head==NULL)         {             //head=p;             head = q;   //如果把p赋值给head，那么这里是有问题的;             p = q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }      }     fclose(fp); }  int main() {     int i;     load();     do     {         printf("\n\n\n");         printf("\t\t*****************************************\n");         printf("\t\t**                                     **\n");         printf("\t\t**       欢迎来到学生信息管理系统      **\n");         printf("\t\t*****************************************\n");         printf("\t\t** 1、增加学生信息      2、删除学生信息**\n");         printf("\t\t** 3、修改学生信息      4、查询学生信息**\n");         printf("\t\t** 5、基本信息统计      6、保存学生信息**\n");         printf("\t\t** 7、退出                             **\n");         printf("\t\t**                                     **\n");         printf("\t\t*****************************************\n");         printf("请选择操作：");         scanf("%d",&i);         switch(i)         {             case 1 : InsertStud();break;             case 2 : DelStud();break;             case 3 : UpdateStud();break;             case 4 : QueryStud();break;                      // case 5 : StaticStud();break;             case 6 : SaveStud();break;             case 7 : break;             default : printf("选择错误，请重选");break;         }     }while(i!=7);     return 0; } 供参考～大佬多谢！！！

user: user-3
content: 楼上很厉害啊

user: user-4
content: #include <stdio.h> #include <string.h> #include <malloc.h>  struct stud {     int num;     char name[30];     int classnum;     int score[4];     struct stud *next; };  struct stud *head=NULL;  void InsertStud() {      char s[10];     do     {         int tmp;         printf("请输入学号：\n");         scanf("%d",&tmp);          struct stud *q,*p;         p=head;          while(p!=NULL)         {             if(p->classnum==tmp)             {                 printf("该学生已存在！\n");                 return;             }             p=p->next;         }         q=(struct stud*)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败\n");             return;         }          q->classnum=tmp;         printf("请输入姓名：");         scanf("%s",q->name);         printf("请输入学号：");         scanf("%d",&q->num);         //printf("请输入班级："); //还要输入班级吗？上面不是已经赋值了吗？         //scanf("%s",&q->classnum);         printf("请输入四门课的成绩：");         scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);         q->next=NULL;          p=head;         if(p==NULL)         {             head=q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }         printf("学生增加成功！\n");          printf("你还需要继续输入学生信息吗？(no退出)：");         scanf("%s",s);     }     while(strcmp(strupr(s),"NO")!=0);  }   void DelStud() {     int flag=1;     int num;     printf("请输入要删除的学生学号：\n");     scanf("%d",&num);     struct stud *p,*q;     p=q=head;     while(p!=NULL&&flag==1)     {         if(p->classnum==num)         {             if(p==head)//删除首节点             {                 head = p->next;                 free(p);             }             else             {                 q->next=p->next;                 free(p);             }             flag=0;             printf("删除学生信息成功！\n");             return;         }         else         {             q=p;             p=p->next;         }      }     if(flag==1)     {         printf("没有找到可以删除的学生学号！\n");     } }   void UpdateStud() {     int flag=1;     int num;     printf("请输入要修改的学生的学号：\n");     scanf("%d",&num);      struct stud *p;     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("请输入新学号：\n");             scanf("%d",&p->num);             printf("请输入新姓名：\n");             scanf("%s",p->name);             printf("请输入新班级：\n");             //scanf("%s",p->classnum);             scanf("%d", &p->classnum);             printf("请输入新成绩：\n");             scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             flag=0;             printf("学生信息修改操作成功\n");         }         else         {             p=p->next;         }      }     if(flag==1)     {         printf("没有找到要修改的记录\n");     }  } void QueryStud() {     int flag=1;     int num;     struct stud *p;     printf("请输入要查询的学号：\n");     scanf("%d",&num);     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("姓名：%s",p->name);             //printf("学号：%d",&p->num);    //为什么要加&?             printf("学号：%d", p->num);             //printf("班级：%s",p->classnum);             printf("班级：%d",p->classnum);             //printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d", p->score[0], p->score[1], p->score[2], p->score[3]);             flag=0;         }         else         {             p=p->next;         }     }     if(flag==1)     {         printf("没有查询到要查询的信息！");     } }  /*void StaticStud()   {   }   */ void SaveStud() {     FILE *fp;      if((fp=fopen("stud.dat","wb"))==NULL);//打开文件stud.dat     {         printf("文件打开失败\n");         return;//打开失败退出     }     struct stud *p;     p=head;     while(p!=NULL)     {         fwrite(p,sizeof(struct stud),1,fp);         p=p->next;     }      fclose(fp);//关闭文件     printf("学生信息保存成功！\n"); }  //int fileexist(char *filename) int fileexist(const char *filename) {     FILE *fp;     if((fp=fopen(filename,"rb"))==NULL)         return 0;     else     {         fclose(fp);         return 1;     } } void load() {     if(fileexist("stud.dat")==0)         return;      FILE *fp;     if((fp=fopen("stud.dat","rb"))==NULL)     {         printf("文件打开失败!\n");         return;     }      struct stud *p,*q;     p=head;      while(!feof(fp))     {         q=(struct stud *)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败!\n");             return;         }         fread(q,sizeof(struct  stud),1,fp);         q->next=NULL;          //if(p==NULL)         if(head==NULL)         {             //head=p;             head = q;   //如果把p赋值给head，那么这里是有问题的;             p = q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }      }     fclose(fp); }  int main() {     int i;     load();     do     {         printf("\n\n\n");         printf("\t\t*****************************************\n");         printf("\t\t**                                     **\n");         printf("\t\t**       欢迎来到学生信息管理系统      **\n");         printf("\t\t*****************************************\n");         printf("\t\t** 1、增加学生信息      2、删除学生信息**\n");         printf("\t\t** 3、修改学生信息      4、查询学生信息**\n");         printf("\t\t** 5、基本信息统计      6、保存学生信息**\n");         printf("\t\t** 7、退出                             **\n");         printf("\t\t**                                     **\n");         printf("\t\t*****************************************\n");         printf("请选择操作：");         scanf("%d",&i);         switch(i)         {             case 1 : InsertStud();break;             case 2 : DelStud();break;             case 3 : UpdateStud();break;             case 4 : QueryStud();break;                      // case 5 : StaticStud();break;             case 6 : SaveStud();break;             case 7 : break;             default : printf("选择错误，请重选");break;         }     }while(i!=7);     return 0; } 供参考～