读书人

指针无故有关问题

发布时间: 2012-04-28 11:49:53 作者: rapoo

指针无故问题,求助啊
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();} 



用的是VC++ 6.0,都成功编译和运行了,测试几次都是去到有p=p->next p!=NULL这些地方出现问题,求怎么解决啊???保存、删除和修改,一进去就弹出错误了。。。

[解决办法]
太长了,单步调试下。
[解决办法]
在while(p!=NULL) 这里设下断点。调试下啊。
[解决办法]
程序崩溃时,可以看调用栈,查看当前是什么情况导致的崩溃.

读书人网 >C语言

热点推荐