求修改一下这个程序,有两个小问题

主要问题是:1、插入新的事件时,原有事件的优先级变化出错,例如,在原有优先级分别为1、2的事件中,插入另一个优先级为2的事件,前者应变为1,3,而程序结果为3,3
2、关闭运行程序的窗口,再打开,无法读取之前的数据

程序如下:

c语言实验报告:电子记事本的实现

代码贴出来才好修改啊

#include
#include
#include
#define N 100

struct date

{

int year;

int month;

int day;
};
struct event //event:事件信息结构

{

char describe[50]; //describe:事件简要说明

struct date eventdate; //eventdate:事件处理日期
int level; //level:事件优先级,表示事件处理的顺序
int flag; //flag:事件处理状态
}
stud[N];

int nSize;
int mode; //mode:执行的命令
int i;
int Exist;
int t;

void printshijian() //显示事件
{

if(nSize==0)     //判断记录是否为空
{ 

    printf("事件列表为空!\n");  
    return;  
} 

for( i=0;i<nSize;i++) //循环输出所有记录
{

 printf("\n************************\n");   
 printf("事件说明:%s\n",stud[i].describe);   
 printf("事件处理日期:%d年%d月%d日\n",stud[i].eventdate.year,stud[i].eventdate.month,stud[i].eventdate.day); 
 printf("事件优先级:%d\n",stud[i].level);   
 printf("事件状态:");  
 switch(stud[i].flag)   
 { 
 case 0: 
     printf("待处理");   
     break;   
 case 1: 
     printf("已处理");    
     break;   
 case 2: 
     printf("延缓处理");    
     break;    
 }   

}

}

void searchshijian() //查找事件
{
int i,mode;
int year,month,day;

int flag,level;
printf("请输入查找类型:\n 1时间\n 2是否处理\n 3优先级\n");

scanf("%d",&mode);

switch(mode)

{
default:
printf("输入类型错误!\n");

return;

break;

case 1:
printf("请输入时间:\n");

printf("年:");

scanf("%d",&year);

while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");

scanf("%d",&year);
}

            printf("月:"); 
            scanf("%d",&month);  
            while (month<1||month>12) 
    { 
                printf("输入的状态有误,请重新输入状态(1-12)\n");  
                scanf("%d",&month); 
    } 

            printf("日:");   
            scanf("%d",&day); 
            while (day<1||day>31) 
    { 
                printf("输入的状态有误,请重新输入状态(1-31)\n");  
                scanf("%d",&day); 
    } 
            break;  
case 2: 
    printf("请输入状态:(0/1/2表示待处理/已处理/延缓处理)\n");   
    scanf("%d",&flag);   
    break;  
    printf("请输入优先级:\n");   
    scanf("%d",&level);   
    break;  
} 
for(i=0;i<nSize;i++)     //按时间输出全部记录
{   
    if((1==mode&&stud[i].eventdate.day==day
        &&stud[i].eventdate.month==month
        &&stud[i].eventdate.year==year)||2==mode
        &&flag==stud[i].flag||3==mode
        &&level==stud[i].level) 
    { 
        printf("\n************************\n");    
        printf("事件说明:%s\n",stud[i].describe);    
        printf("事件处理日期:%d年%d月%d日\n",stud[i].eventdate.year,stud[i].eventdate.month,stud[i].eventdate.day); 
        printf("事件优先级:%d\n",stud[i].level);    
        printf("事件状态:");    
        switch(stud[i].flag)    
        { 
        case 0: 
            printf("待处理");    
            break;    
        case 1: 
            printf("已处理");     
            break;    
        case 2: 
            printf("延缓处理");     
            break;      
        }   
    }  
} 

}

void newshijian() //插入事件
{

int bExist=0;

int i;
int day,month,year;

int flag,level;
char *des=(char *)malloc(sizeof(char)*20); //给简要说明分配存储空间
printf("请输入时间:\n");

printf("年:");

scanf("%d",&year);

while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");

scanf("%d",&year);
}

    printf("月:"); 
scanf("%d",&month); 
while (month<1||month>12) 
{ 
    printf("输入的状态有误,请重新输入状态(1-12)\n");  
    scanf("%d",&month); 
} 

    printf("日:");  
scanf("%d",&day); 
while (day<1||day>31) 
{ 
    printf("输入的状态有误,请重新输入状态(1-31)\n");  
    scanf("%d",&day); 
} 
printf("请输入优先级:\n");  
scanf("%d",&level);   
for(i=0;i<nSize;i++)  
{   
    if(stud[i].eventdate.day==day
        &&stud[i].eventdate.month==month
        &&stud[i].eventdate.year==year
        &&stud[i].level==level)      //判断时间和优先级是否重复
    { 
        bExist=1;        
    }     
    if(bExist)  
    { 
        printf("该时间和优先级事件已存在!下面所有事件的优先级往后顺移\a\a\a\n");   
        for(i=0;i<nSize;i++)   
        {
            do    
            {    
                if(stud[i].eventdate.day==day
                    &&stud[i].eventdate.month==month
                    &&stud[i].eventdate.year==year) 
                    stud[i].level = stud[i].level+1;         
            }   
            while(stud[i].eventdate.day==day
                &&stud[i].eventdate.month==month
                &&stud[i].eventdate.year==year
                &&stud[i].level==level); 
        }  
    }     
}  
printf("请输入状态:(0/1/2表示待处理/已处理/延缓处理)\n");  
scanf("%d",&flag); 
while (flag!=0&&flag!=1&&flag!=2) 
{ 
    printf("输入的状态有误,请重新输入状态(0/1/2表示待处理/已处理/延缓处理)\n");  
    scanf("%d",&flag); 
}   
getchar(); 
printf("请输入事件描述:\n");  
gets(des);   
strcpy(stud[nSize].describe,des);  
free(des); 
stud[nSize].eventdate.day=day;
stud[nSize].eventdate.month=month;  
stud[nSize].eventdate.year=year;  
stud[nSize].flag=flag;  
stud[nSize].level=level;  
nSize++; 
printf("插入事件成功!\n"); 

}

void editshijian() //修改事件
{
int i,pos=-1;
int day,month,year;

int level,flag;
char *des=(char *)malloc(sizeof(char)*30);

printf("请输入时间:\n");

printf("年:");

scanf("%d",&year);

while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");

scanf("%d",&year);
}
printf("月:");
scanf("%d",&month);
while (month12)
{
printf("输入的状态有误,请重新输入状态(1-12)\n");

scanf("%d",&month);
}
printf("日:");

scanf("%d",&day);
while (day31)
{
printf("输入的状态有误,请重新输入状态(1-31)\n");

scanf("%d",&day);
}
printf("请输入优先级:\n");

scanf("%d",&level);

for(i=0;i<nSize;i++)

{

if(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year
&&stud[i].level==level)
{
pos=i;

break;

}

}
if(pos==-1)

{
printf("未找到相关事件!\n");

return;

}
printf("请输入需要修改的事件状态:(0/1/2表示待处理/已处理/延缓处理)\n");

scanf("%d",&flag);
while (flag!=0&&flag!=1&&flag!=2)
{
printf("输入的状态有误,请重新输入状态(0/1/2表示待处理/已处理/延缓处理)\n");

scanf("%d",&flag); //修改事件处理状态
}
stud[pos].eventdate.day=day;
stud[pos].eventdate.month=month;

stud[pos].eventdate.year=year;

stud[pos].flag=flag;

stud[pos].level=level;
printf("编辑成功结束!\n");

}

void delshijian() //删除事件
{
int i,pos=-1; //pos:用于查找记录
int day,month,year;

int level;
struct event tmp; //tmp:用于交换记录
printf("请输入时间:\n");
printf("年:");

scanf("%d",&year);

while (year2020)
{
printf("输入的状态有误,请重新输入状态(2015-2020)\n");

scanf("%d",&year);
}
printf("月:");
scanf("%d",&month);
while (month12)
{
printf("输入的状态有误,请重新输入状态(1-12)\n");

scanf("%d",&month);
}
printf("日:");

scanf("%d",&day);
while (day31)
{
printf("输入的状态有误,请重新输入状态(1-31)\n");

scanf("%d",&day);
}
printf("请输入优先级:\n");

scanf("%d",&level);

for(i=0;i<nSize;i++) //判断是否查找到记录
{
if(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year

&&stud[i].level==level)

{
pos=i;

break;

}

}
if(pos==-1)

{
printf("未找到相关事件!\n");

return;

}
for(i=pos;i<nSize-1;i++) //将需删除记录后的记录依次前移
{
tmp=stud[i];
stud[i]=stud[i+1];

stud[i+1]=tmp;

}
nSize--;
printf("成功删除事件!\n");
}

void save() //保存事件
{

int i;
FILE *fp;
fp=fopen("stud.txt","w");

for(i=0;i<nSize;i++)

{
fwrite(&stud[i],sizeof(struct event),1,fp);

}
fclose(fp);
printf("事件保存成功!\n");
}

void read() //读取事件
{
int i=0;

FILE *fp;
fp=fopen("stud.txt","r");

while(!feof(fp))
{
fread(&stud[i++],sizeof(struct event),1,fp);

}
nSize=i-1;

fclose(fp);
printf("事件读取成功!\n");
}

void main()
{
nSize=0;

while(1)

{
system("cls");
printf("***************************************************\n");

printf("**** 电子记事本 ****\n");

printf("**** 1.添加事件 2.查找事件 ****\n");

printf("**** 3.修改事件 4.删除事件 ****\n");

printf("**** 5.显示事件 6.退出程序 ****\n");

printf("**** 7.保存事件 8.读取事件 ****\n");
printf("***************************************************\n");

printf("请输入功能代码:\n");

scanf("%d",&mode);

while (mode8)
{
printf("输入的功能代码有误,请重新输入功能代码(1-8)\n");

scanf("%d",&mode);
}

switch(mode)

{
case 1:
newshijian();

break;

case 2:
searchshijian();

break;

case 3:
editshijian();

break;

case 4:
delshijian();

break;
case 5:
printshijian();

break;

case 6:

exit(0);

case 7:

save();

break;

case 8:

read();

break;

default:
printf("输入错误!\n");

break;

}
fflush(stdin); //清空输入缓存
getchar(); //停留,便于看清输出
}
}

while(stud[i].eventdate.day==day
&&stud[i].eventdate.month==month
&&stud[i].eventdate.year==year
&&stud[i].level==level);

这个要写在前面