指针无故有关问题,
指针无故问题,求助啊
main.c
data.c
main.c
- C/C++ code
#include<stdio.h> #include<stdlib.h> #include<string.h> #include"data.c" void menu() { int mark; printf("\n\n\n\n\n\n\n"); printf(" |********** 学 生 证 管 理 系 统 **********|\n"); printf(" |-------------------------------------------|\n"); printf(" | 请输入(0-6)选择相应的功能: |\n"); printf(" |-------------------------------------------|\n"); printf(" | 1--添加学生的学生证信息 |\n"); printf(" | 2--修改学生的学生证信息 |\n"); printf(" | 3--删除学生的学生证信息 |\n"); printf(" | 4--查找学生的学生证信息 |\n"); printf(" | 5--查找班级学生的学生证信息 |\n"); printf(" | 6--统计学生的人数 |\n"); printf(" | 0--退出 |\n"); printf(" |-------------------------------------------|\n"); printf("\n\n\n\n\n\n\n"); printf("请输入:"); scanf("%d",&mark); switch(mark) { case 1:add();break; case 2:update_data();break; case 3:delete_a();break; case 4:search_stu();break; //case 5:print2();break; case 6:tongji();break; default:printf("输入错误\n");menu();break; case 0:exit(0); } } int main() { intit(); load_data(); menu(); return 0; }
data.c
- C/C++ code
#include<stdio.h> #include<stdlib.h> #include<string.h> struct STUDENT { char num[13]; char sex[3]; char name[20]; }; struct STU_P { struct STUDENT stu; struct STU_P *next; }; #define DATA_FILE "data_file.dat" extern void menu(); struct STU_P* FIRSTofP=NULL; void intit() { FILE *fp; fp=fopen(DATA_FILE,"rb"); if(fp==NULL) { fp=fopen(DATA_FILE,"wb"); if(fp==NULL) { printf("无法新建储存文件!\n"); exit(0); } } fclose(fp); } struct STU_P *getlast_p() { struct STU_P *p=FIRSTofP; if(p==NULL) { return p; } while((p!=NULL)&&(p->next!=NULL)) { p=p->next; } return p; } void load_data() { struct STU_P *p=NULL; struct STU_P *last=NULL; FILE* fp=NULL; int count =0; p=(struct STU_P*)malloc(sizeof(struct STU_P)); p->next=NULL; fp=fopen(DATA_FILE,"rb"); while(fread(&(p->stu),sizeof(struct STUDENT),1,fp)==1) { if(FIRSTofP==NULL) { FIRSTofP=p; } else { last=getlast_p();//寻找尾指针 last->next=p; } count++; fseek(fp,count * (sizeof(struct STUDENT)),SEEK_SET); p=(struct STU_P*)malloc(sizeof(struct STU_P)); p->next=NULL; } free(p); p=NULL; fclose(fp); } void save() { struct STU_P *p=FIRSTofP; FILE *fp=fopen(DATA_FILE,"wb"); while(p!=NULL) { fwrite(&(p->stu),sizeof(struct STUDENT),1,fp); p=p->next; } printf("学生信息保存完毕!\n"); } void add() { struct STU_P *p; struct STU_P *p1; char mark='y'; while(mark=='Y'||mark=='y') { p=(struct STU_P*)malloc(sizeof(struct STU_P)); p->next=NULL; printf("请输入学生名字(如:李某某):"); flushall(); gets(p->stu.name); printf("请输入学生学号(12位,如:201130000101):"); flushall(); gets(p->stu.num); printf("请输入学生性别(男或女):"); flushall(); gets(p->stu.sex); if(FIRSTofP==NULL) { FIRSTofP=p; } else { p1=getlast_p(); p1->next=p; } free(p); printf("如需继续添加学生信息,请输入Y,否则输入N\n"); scanf("%c",&mark); } save(); menu(); } void delete_a() { struct STU_P *p; struct STU_P *p1; char mark='y'; char de_num[13]; int markin; int mark_de; if(FIRSTofP==NULL) { printf("无学生记录!请按回车返回!"); flushall(); getchar(); menu(); } while(mark=='Y'||mark=='y') { p=FIRSTofP; p1=FIRSTofP; markin=0; mark_de=0; printf("请输入需要删除的学号(12位):"); gets(de_num); while(p!=NULL) { if(strcmp(p->stu.num,de_num)==0) { if(p==FIRSTofP) { FIRSTofP=FIRSTofP->next; ++mark_de; break; } else { p1->next=p->next; ++mark_de; free(p); } } ++markin; if(markin!=1) p1=p1->next; p=p->next; } if(mark_de==0) printf("此学号无记录\n"); else printf("删除成功!\n"); printf("如需继续删除学生信息,请输入Y,否则输入N\n"); scanf("%c",&mark); } save(); menu(); } void update_data() { struct STU_P *p; char mark='y'; char de_num[13]; int markin; int mark_de; if(FIRSTofP==NULL) { printf("无学生记录!请按回车返回!"); flushall(); getchar(); menu(); } while(mark=='Y'||mark=='y') { p=FIRSTofP; markin=0; mark_de=0; printf("请输入需要修改的学号(12位):"); flushall(); gets(de_num); while(p!=NULL) { if(strcmp(p->stu.num,de_num)==0) { if(p==FIRSTofP) { printf("请输入学生名字(如:李某某):"); flushall(); gets(FIRSTofP->stu.name); printf("请输入学生学号(12位,如:201130000101):"); flushall(); gets(FIRSTofP->stu.num); printf("请输入学生性别(男或女):"); flushall(); gets(FIRSTofP->stu.sex); ++mark_de; break; } else { printf("请输入学生名字(如:李某某):"); flushall(); gets(p->stu.name); printf("请输入学生学号(12位,如:201130000101):"); flushall(); gets(p->stu.num); printf("请输入学生性别(男或女):"); flushall(); gets(p->stu.sex); ++mark_de; } } ++markin; p=p->next; } if(mark_de==0) printf("此学号无记录\n"); else printf("修改成功!\n"); printf("如需继续修改学生信息,请输入Y,否则输入N\n"); scanf("%c",&mark); } save(); menu(); } void search_stu() { struct STU_P *p; char mark='y'; int markin; char stu_num[13]; if(FIRSTofP==NULL) { printf("无学生记录!请按回车继续!"); flushall(); getchar(); menu(); } while(mark=='y'||mark=='Y') { p=FIRSTofP; markin=0; printf("请输入查询的学号:"); flushall(); gets(stu_num); while(p!=NULL) { if(strcmp(p->stu.num,stu_num)==0) { printf("学生信息:\n学号:%s\n姓名:%s\n性别:%s\n",p->stu.num,p->stu.name,p->stu.sex); markin++; } p=p->next; } if(markin==0) printf("此学号无记录!"); printf("如需继续查询学生信息,请输入Y,否则输入N\n"); scanf("%c",&mark); } menu(); } void tongji() { struct STU_P *p=FIRSTofP; int count=0; if(FIRSTofP==NULL) { printf("总共有0人!按回车返回"); flushall(); getchar(); menu(); } while(p!=NULL) { count++; p=p->next; } printf("总共有%d人!按回车返回!",count); flushall(); getchar(); menu(); }