关于链表指针的一些问题
增加,修改,查找那里的信息怎么会空了1个出来的程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define bool int #define true 1 #define false 0 #define LEN sizeof(struct System) struct System /*存放学生信息*/ { char name[20]; /*姓名*/ char num[10]; /*学号*/ char c[5]; /*c语言成绩*/ char match[5]; /*数学成绩*/ char english[5]; /*英语成绩*/ struct System *next; /*下个结点*/ }; typedef struct System sys; sys *head = NULL; void ShowMenu(); /*菜单*/ void Find(); /*输出单个信息*/ void Display(); /*输出全部信息*/ void Addition(); /*增加学生信息*/ void Modify(); /*修改学生信息*/ void Delete(); /*删除学生信息*/ void Aver(); void Save(); /*输出信息到文件*/ void Open(); /*文件信息输出到链0表*/ sys *FindMessage(); /*查找信息*/ int main() { char x; bool quit = false; /*创建并设置退出循环的条件为假*/ Open(); while(!quit) { ShowMenu(); /*显示菜单*/ scanf("%s", &x); switch(x) { case'0': quit = true; Save(); break; case'1': Addition(); break; case'2': Modify(); break; case'3': Delete(); break; case'4': Find(); break; case'5': Display(); break; default: break; } } return 0; } /*菜单显示*/ void ShowMenu() { printf("\n********************************************* \n"); printf("1.增加学生 "); printf("2.修改学生 "); printf("3.删除学生 "); printf("4.查找学生 "); printf("5.显示全部学生 "); printf("0.退出\n"); printf("********************************************* \n"); printf("请选择 "); } /*增加信息*/ void Addition() { sys *p1 = NULL, *p2 = NULL; p1 = (sys * )malloc(sizeof(sys)); printf("输入姓名:"); scanf(" %s ",p1->name); printf("输入学号:"); scanf(" %s ",p1->num); printf("输入c语言成绩:"); scanf(" %s ",p1->c); printf("输入数学成绩:"); scanf(" %s ",p1->match); printf("输入英语成绩:"); scanf(" %s ",p1->english); p1->next = NULL; if(NULL == head) { head = (sys * )malloc(sizeof(sys)); head->next=p1; }else { for(p2 = head;p2->next!=NULL;p2=p2->next); p2->next=p1; } } /*查找用户*/ void Find() { sys *p = FindMessage(); if(NULL==p) printf("对不起,没有找到该学生!\n"); else printf("找到该学生:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english); } /*查找用户函数*/ sys *FindMessage() { char name[20]; sys *p = NULL; printf("请输入姓名!\n"); scanf(" %s ",name); if(head == NULL) { printf("学生管理系统没有记录,请输入记录后,再使用功能!\n"); return NULL; } for(p = head; p->next!= NULL; p = p->next) if(!strcmp(p->next->name,name)) return p; return NULL; } /*显示所有信息*/ void Display() { sys * p = NULL; if(head==NULL) { printf("学生管理系统没有记录,请输入记录后,再使用功能!\n"); return; } for(p = head->next;p!=NULL;p=p->next) printf("姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->name, p->num, p->c, p->match, p->english); } /*修改信息*/ void Modify() { sys *p=FindMessage(); if(NULL==p) printf("对不起,没有找到该学生!\n"); else { printf("要修改学生的信息:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english); printf("请输入新的姓名:\n"); scanf("%s",p->next->name); printf("请输入新的学号:\n"); scanf("%s",p->next->num); printf("请输入新的c语言成绩:\n"); scanf("%s",p->next->c); printf("请输入新的数学成绩:\n"); scanf("%s",p->next->match); printf("请输入新的英语成绩:\n"); scanf("%s",p->next->english); p->next->next=NULL; } } /*删除信息*/ void Delete() { sys *temp = NULL; sys *p=FindMessage(); if(NULL==p) printf("对不起,没有找到该学生!\n"); else { printf("要删除学生的信息:\n姓名:%s 学号:%s c语言成绩:%s 数学成绩:%s 英语成绩:%s\n", p->next->name, p->next->num, p->next->c, p->next->match, p->next->english); temp=p->next; p->next=p->next->next; free(temp); } } /*输出信息到文件,并释放链表空间*/ void Save() { sys *p=NULL; FILE *fp; char *filename="book.txt"; if(head==NULL) { printf("\n记录为空!\n"); return; } else p=head->next; if((fp=fopen(filename,"w"))==NULL) /*出错检测*/ { printf("\n打不开文件!\n"); return; } while(p!=NULL) { fprintf(fp, "%s\t %s\t %s\t %s\t %s\t\n",p->name, p->num, p->c, p->match, p->english); p=p->next; } printf("保存完毕!\n"); fclose(fp); for(;head->next!=NULL;) { p=head->next; head->next=head->next->next; free(p); } free(head); } /*读取文件信息输出到链表*/ void Open() { FILE *fp; sys *p1=NULL, *p2=NULL, *temp=NULL; if((fp=fopen("book.txt","r"))==NULL) { printf("\n**************这是一个新的学生管理系统***************"); return; } head=(sys *)malloc(sizeof(sys)); head->next=NULL; temp=p2=head; while(!feof(fp)) /*读取文件信息*/ { p1=(sys *)malloc(LEN); temp=p2; p2->next=p1; p2=p1; fscanf(fp,"%s %s %s %s %s", p1->name, p1->num, p1->c, p1->match, p1->english); } temp->next=NULL; fclose(fp); }