代码帮你改过了,很小的改动,自己读一下吧
说实话,这个代码写的可真是不怎么样,要好好学习啊
[ 本帖最后由 voidx 于 2011-4-17 21:14 编辑 ]
说实话,这个代码写的可真是不怎么样,要好好学习啊
程序代码:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> struct stu { int number; char name[20]; int age; char sex[10]; struct stu *next; }; FILE *fp = NULL; struct stu *Filetostr()//------------------------不懂 { struct stu *pf=NULL,*pb=NULL,*head=NULL,*p=NULL; if( (fp=fopen("student.txt","r")) == NULL ) { printf("文件之前不存在!\n"); return NULL; } pb=(struct stu *)malloc(sizeof(struct stu));//---------------------不懂 head=pb; while(1) { pf=(struct stu *)malloc(sizeof(struct stu));//--------------------不懂 if( fread(pf,sizeof(struct stu),1,fp) ) { pb->number = pf->number; strcpy(pb->name, pf->name); pb->age = pf->age; strcpy(pb->sex, pf->sex); pb->next=(struct stu *)malloc(sizeof(struct stu));//---------------------不懂 p=pb; pb=pb->next; free(pf); } else { p->next=NULL; //free(pb); // 这里不可以 free break; } } //pb=NULL; free(pb); // 应该放在这里 fclose(fp); return head; } void Strtofile(struct stu *head)//-----------------不懂 { if(!head) return; struct stu *pb=NULL; pb=head; if((fp=fopen("student.txt","w"))==NULL) { printf("无法打开文件!\n"); exit(-1); } while(pb) { fwrite(pb,sizeof(struct stu),1,fp); pb=pb->next; } fclose(fp); printf("保存成功!\n"); } // 添加模块 struct stu *Add(struct stu *head) { struct stu *pf=NULL,*pb=NULL,*p=NULL; int num; printf("请输入学生信息\n"); printf("请输入学生的学号:"); scanf("%d",&num); pf = head; pb = (struct stu *)malloc(sizeof(struct stu)); //设计应该是插入的时候就依照学号的从小到大来进行排序的 if(head!=NULL)//不是第一次的插入新的元素 { pb = (struct stu *)malloc(sizeof(struct stu));//-----------------不懂 /*while( (pf->number<num) && (pf->next!=NULL) )如果只有一个结点的情况下 * 即使前面的条件成立 后面的也不成立 总的是不成立的 就不能达到目的 * { * p=pf; * pf=pf->next; }*/ while( pf && (pf->number<num))//表示过滤掉比这个学号小的人 { p = pf;//p 指向的是比num 小的学号 或 NULL pf = pf->next; }//pf 出来指向的是不比num小的学号的结点 或 最后一个结点 // 必须先处理 pf == NULL 的情况,不然当 pf == NULL 时,程序依然会试图读取 pf->number,,也就是 NULL->number,自然会引发 segment error. if( pf == NULL )//pf当前指向最后一个结点 { /*pf->next = pb; * pb->next=NULL;*/ pb->next = pf; //pf = pb; //改变 pf 的值对链表没有任何影响; p->next = pb; } else if(pf->number==num)//pf当前指向相等的情况 { printf("你要添加的学生之前已经存在!\n"); return head; } else if(pf->number>num)//pf当前指向大于num的情况 { if(head==pf)//第一个结点就大于num { /*head=pb; * pb->next=pf;*/ pb->next = head; head = pb;//保证head总是指向第一个结点 } else { p->next = pb; pb->next = pf; } } //pb=(struct stu *)malloc(sizeof(struct stu)); } else//第一次的插入 { head = pb; pb->next = NULL;//进行未结点的处理 } pb->number=num; printf("请输入学生的姓名:"); scanf("%s",pb->name); printf("请输入学生的年龄:"); scanf("%d",&pb->age); printf("请输入学生的性别(\"man\"表示男性, \"woman\"表示女性):"); scanf("%s",pb->sex); printf("添加成功!\n"); return head; } //查找模块 struct stu *Choose(struct stu *head) { //加判断语句 if( !head ) { printf("未存有学生信息!\n"); return NULL; } struct stu *pb=NULL; int num; printf("请输入你要查找的学生的学号:"); scanf("%d",&num); pb = head; while( (pb->number!=num) && (pb->next!=NULL) ) { pb = pb->next; } if(pb->number==num) return pb; else if( (pb->number!=num) && (pb->next==NULL) ) printf("你要查找的学生不存在!\n"); return NULL; } //删除模块 struct stu *Delete(struct stu *head) { //加判断语句 if( !head ) { printf("未存有学生信息!\n"); return NULL; } struct stu *pb=NULL,*pf=NULL; int num; printf("请输入你要删除的学生的学号:"); scanf("%d",&num); pb=head; /*while( (pb->number!=num) && (pb->next!=NULL) ) * { * pf=pb; * pb=pb->next; }*/ while( pb && (pb->number!=num) )//可以一直找到最后一个结点即 可以全部察寻一遍 { pf = pb; pb = pb->next; } //假如找到 则pb就是要删除的 或则 就没有找到 //if(pb->number==num) if( pb )//表示pb不为NULL 即 查询到了 { if(pb==head)//第一个结点就找到 head = pb->next; else pf->next = pb->next; //pf->next = pb->next; free(pb); printf("d删除成功!\n"); return head; } else printf("你要删除的学生不存在!\n"); return head; } struct stu *Update(struct stu *head) { //加判断语句 if( !head ) { printf("未存有学生信息!\n"); return NULL; } struct stu *pb=NULL; int num; printf("请输入你要更改的学生的学号:"); scanf("%d",&num); pb=head; /*while((pb->number!=num)&&(pb->next!=NULL)) * pb=pb->next;*/ while( pb && (pb->number!=num) )//如果pb非NULL 指向要修改的结点 pb=pb->next; if( pb ) { printf("请输入你要更改的学生的姓名:"); scanf("%s",pb->name); printf("请输入修改后的学生的年龄:"); scanf("%d",&pb->age); printf("请输入修改后的学生的性别(“man”表示男性,“woman”表示女性):"); scanf("%s",pb->sex); printf("更改成功!\n"); return head; } else printf("你要修改的学生不存在!\n"); return head; } void Print(struct stu *head) { struct stu *pb=NULL; pb=head; while( pb ) { printf("学号:%d 姓名:%s 年龄:%d 性别:%s\n",pb->number,pb->name,pb->age,pb->sex); pb = pb->next; } } void Window() { printf("--------------------------------------------------------------------------------\n"); printf("|******************************************************************************|\n"); printf("|*************************10计科4学生信息管理系统******************************|\n"); printf("|******************************************************************************|\n"); printf("--------------------------------------------------------------------------------\n"); printf("\n\n"); printf(" 1.添加学生信息\n"); printf(" 2.查找学生信息\n"); printf(" 3.删除学生信息\n"); printf(" 4.修改学生信息\n"); printf(" 5.显示学生信息\n"); printf(" 6.退出!\n"); printf("\n\n"); } int main() { struct stu *head=NULL, *search_head=NULL; int ask; int saveask; int addask; printf("欢迎进入学生信息管理系统...\n"); head = Filetostr(); while(1) { Window(); printf("请进行选择:"); scanf("%d",&ask); switch(ask) { case 1: head = Add(head); while(1) { printf("是否继续进行添加(0表示继续,其他数字表示离开):"); scanf("%d",&addask); if(addask) break; head=Add(head); } break; case 2: search_head=Choose(head); if(search_head!=NULL) printf("学号:%d 姓名:%s 年龄:%d 性别:%s\n",search_head->number,search_head->name,search_head->age,search_head->sex); break; case 3: head=Delete(head); break; case 4: head=Update(head); break; case 6: Print(head); break; case 6: printf("****是否要进行保存:****\n\n"); printf("输入0表示不进行保存退出,其他数字表示进行保存并退出:"); scanf("%d",&saveask); if(saveask) Strtofile(head); exit(0); default: exit(-1); } } }
[ 本帖最后由 voidx 于 2011-4-17 21:14 编辑 ]