指针无故有关问题,

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

}