哪位高手能帮忙看看这个程序那里出有关问题了?

谁能帮忙看看这个程序那里出问题了??
main.c

C/C++ code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"user.c"
#include"cash_updata.c"
#include"search.c"
#define DATA_FILE "data_main.dat"


cash *first_data=NULL;//整个程序中的财务数据头指针

cash *get_last_cash()
{
    cash *p=first_data;
    if(p==NULL)
    {
        return p;
    }
    while((p!=NULL)&&(p->next!=NULL))
    {
        p=p->next;
    }
    return p;
}//获取指针中的最后一个。

void init_cash()
{
    FILE* fp=NULL;
    fp=fopen(DATA_FILE,"r");
    if(fp==NULL)
    {
        fp=fopen(DATA_FILE,"w");
        if(fp==NULL)
        {
            printf("新建财务数据保存文件失败,请按任意键退出...");
            getchar();
            exit(0);
        }
    }
    fclose(fp);
}//初始化财务数据保存的文件。


void load_cash()
{
    cash *p=NULL;
    cash *last=NULL;
    FILE* fp=NULL;
    int count =0;
    p=(cash*)malloc(sizeof(cash));
    p->next=NULL;
    fp=fopen(DATA_FILE,"rb");
    while(fread(&(p->all_about),sizeof(cash_data),1,fp)==1)
    {
        if(first_data==NULL)
        {
            first_data=p;
        }
        else
        {
            last=get_last_cash();//寻找尾指针
            last->next=p;
        }
        count++;
        fseek(fp,count*sizeof(cash_data),SEEK_SET);
        p=(cash*)malloc(sizeof(cash));
        p->next=NULL;
    }
    free(p);
    p=NULL;
    fclose(fp);
}//读取财务数据,并且形成链表



//VVVVVV============以下为菜单部分================VVVVVV

void menu_admin()
{
    int act;
    printf("欢迎使用班级财务管理系统!您的身份为管理员!\n");
    printf("================================================\n");
    printf("==============******管理菜单******==============\n");
    printf("====================用户管理====================\n");
    printf("==              1.浏览班级成员信息            ==\n");
    printf("==              2.新建班级成员信息            ==\n");
    printf("==              3.修改班级成员信息            ==\n");
    printf("==              4.删除班级成员信息            ==\n");
    printf("================================================\n");
    printf("\n\n");
    printf("================================================\n");
    printf("====================财务管理====================\n");
    printf("==              5.查询财务信息                ==\n");
    printf("==              6.增加财务信息                ==\n");
    printf("==              7.修改财务信息                ==\n");
    printf("==              8.删除财务信息                ==\n");
    printf("================================================\n");
    printf("====================9.退出======================\n");
    printf("================================================\n");
    printf("请输入操作(1-9):");
    scanf("%d",&act);
    switch(act)
    {
/*    case 1:see_user();break;
    case 2:add_user();break;
    case 3:update_user();break;
    case 4:delete_user();break;*/
    case 5:see_cash();break;//完成
    case 6:add_cash();break;//完成
/*    case 7:update_cash();break;
    case 8:delete_cash();break;*/
    case 9:exit(0);
    }
}//管理员菜单

void menu_user()
{
    int act;
    printf("欢迎使用班级财务管理系统!您的身份为普通用户!\n");
    printf("================================================\n");
    printf("==============******查询菜单******==============\n");
    printf("================================================\n");
    printf("==              1.查询财务信息                ==\n");
    printf("================================================\n");
    printf("====================2.退出======================\n");
    printf("================================================\n");
    printf("请输入操作(1-2):");
    scanf("%d",&act);
    switch(act)
    {
    case 1:see_cash();break;//完成
    case 2:exit(0);
    }
}//普通用户菜单

void see_cash()
{
    int mark;
    printf("================================================\n");
    printf("==============******财务查询******==============\n");
    printf("================================================\n");
    printf("==                1.按年查询                  ==\n");
    printf("==                2.按月查询                  ==\n");
    printf("==                3.详细账单                  ==\n");
    printf("================================================\n");
    printf("================================================\n");
    printf("==============******财务统计******==============\n");
    printf("================================================\n");
    printf("==              4.学期财务统计                ==\n");
    printf("==              5.每月财务统计                ==\n");
    printf("==              6.用途分类统计                ==\n");
    printf("================================================\n");
    printf("====================7.退出======================\n");
    printf("================================================\n");
    printf("请输入操作选项(1-7):");
    scanf("%d",&mark);
    switch(mark)
    {
    case 1:see_year();break;//完成
    case 2:see_month();break;////完成
    case 3:see_all();break;//完成
/*    case 4:see_term();break;*/
    case 5:see_month_all();break;//完成
    case 6:see_use();break;//完成
    case 7:exit(0);
    }
}

//^^^^^^^^^================以上为菜单部分==========^^^^^






int main()
{
    int id_in,te;
    init_user();
    load_user();

    init_cash();
    load_cash();
    id_in=login_user();
    if(id_in==5)exit(0);
    if(id_in==1)
    {
        menu_admin();
    }
    if(id_in==0)
    {
        menu_user();
    }
}




search.c

C/C++ code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"data.h"

//VVVVVVVVV============以下为查询函数===========VVVVVVVVVV

void see_year()
{
    int mark;
    cash *p=NULL;
    cash_data year_mark_in,year_mark_out;
    year_mark_in.use_all=0;
    year_mark_out.use_all=0;
    printf("请输入你要查询的年份(数字):");
    scanf("%d",&mark);
    p=first_data;
    while(p!=NULL)
    {
        if(p->all_about.year==mark)
        {
            if(p->all_about.inorout==1)
                year_mark_in.use_all+=p->all_about.use_all;
            else
                year_mark_out.use_all+=p->all_about.use_all;
        }
        p=p->next;
    }
    printf("%d年收支状况:",mark);
    printf("收入:%d 元",year_mark_in.use_all);
    printf("支出:%d 元",year_mark_out.use_all);
}//年份查询函数

void see_month()
{
    int mark,markm;
    cash *p=NULL;
    cash_data year_mark_in,year_mark_out;
    year_mark_in.use_all=0;
    year_mark_out.use_all=0;
    printf("请输入你要查询的年份(数字):");
    scanf("%d",&mark);
    printf("请输入你要查询的月份(数字):");
    scanf("%d",&markm);
    p=first_data;
    while(p!=NULL)
    {
        if((p->all_about.year==mark)&&(p->all_about.month==markm))
        {
            if(p->all_about.inorout==1)
                year_mark_in.use_all+=p->all_about.use_all;
            else
                year_mark_out.use_all+=p->all_about.use_all;
        }
        p=p->next;
    }
    printf("%d年%d月收支状况:",mark,markm);
    printf("收入:%d 元",year_mark_in.use_all);
    printf("支出:%d 元",year_mark_out.use_all);
}//按月份查询函数

void see_all()
{
    cash *p=first_data;
    int count;
    count=0;
    printf("=====全部财务报表======\n");
    printf("=======================\n");
    while(p!=NULL)
    {
        printf("%d -----\n",++count);
        printf("时间:%d年%d月\n",p->all_about.year,p->all_about.month);
        if(p->all_about.inorout==1)printf("收入:%d 元\n",p->all_about.use_all);
            else printf("支出:%d 元\n",p->all_about.use_all);
        switch(p->all_about.use_way)
        {
        case 1:printf("费用用途:活动娱乐消费\n");
        case 2:printf("费用用途:工具/书籍经费\n");
        case 3:printf("费用用途:临时消费\n");
        case 4:printf("费用用途:定期费用\n");
        }
        printf("使用人:%s\n",use_who);
        p=p->next;
    }
}//全部输出函数

void see_use()
{
    cash *p=first_data;
    cash_data mark_a,mark_b,mark_c,mark_d;
    mark_a.year=0;
    mark_a.month=0;
    mark_b.year=0;
    mark_b.month=0;
    mark_c.year=0;
    mark_c.month=0;
    mark_d.year=0;
    mark_d.month=0;
    while(p!=NULL)
    {
        if(p->all_about.use_way==1)
        {
            if(p->all_about.inorout==1)
            {
                mark_a.year+=p->all_about.use_all;
            }
            else
            {
                mark_a.month+=p->all_about.use_all;
            }
        }//用途1


        if(p->all_about.use_way==2)
        {
            if(p->all_about.inorout==1)
            {
                mark_b.year+=p->all_about.use_all;
            }
            else
            {
                mark_b.month+=p->all_about.use_all;
            }
        }//用途2


        if(p->all_about.use_way==3)
        {
            if(p->all_about.inorout==1)
            {
                mark_c.year+=p->all_about.use_all;
            }
            else
            {
                mark_c.month+=p->all_about.use_all;
            }
        }//用途3
                                
        
        if(p->all_about.use_way==4)
        {
            if(p->all_about.inorout==1)
            {
                mark_d.year+=p->all_about.use_all;
            }
            else
            {
                mark_d.month+=p->all_about.use_all;
            }
        }//用途4
        p=p->next;
    }
    printf("活动娱乐消费收支:\n");
    printf("收入:%d 元\n",mark_a.year);
    printf("支出:%d 元\n",mark_a.month);
    printf("========================\n");
    printf("工具/书籍经费收支:\n");
    printf("收入:%d 元\n",mark_b.year);
    printf("支出:%d 元\n",mark_b.month);
    printf("========================\n");
    printf("临时消费收支:\n");
    printf("收入:%d 元\n",mark_c.year);
    printf("支出:%d 元\n",mark_c.month);
    printf("========================\n");
    printf("定期费用收支:\n");
    printf("收入:%d 元\n",mark_d.year);
    printf("支出:%d 元\n",mark_d.month);
    printf("========================\n");
}//用途分类统计

void see_month_all()
{
    cash *p=first_data;
    cash_data mark;
    int i;

    for(i=1;i<=12;i++)
    {
        mark.year=0;
        mark.month=0;
        while(p!=NULL)
        {
        if(p->all_about.month==i)
        {
            if(p->all_about.inorout==1)
            {   mark.year+=p->all_about.use_all;
            }
            else
            {
                mark.month+=p->all_about.use_all;
            }

        }
        p=p->next;
        }
        printf("%d月收支:\n",i);
        printf("收入:%d 元\n",mark.year);
        printf("支出:%d 元\n",mark.month);
        printf("================\n");
        p=first_data;
    }
}//每月财务统计







//^^^^^^^^^================以上为查询函数==========^^^^^


------解决方案--------------------
偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。

在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。