此程序插入函数有问题,在插入多组数据后,不能插入到正确位置,求解
#include<stdio.h>#include<malloc.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
int num;
int age;
char pc[20];
char name[20];
struct student *link;
}stud;
stud* creat(int n)
{
stud *h,*p,*q;
int i,main();
stud *load3();//文件检测函数定义//
load3();
h=(stud *)malloc(sizeof(stud));
if(h==NULL)
{
printf("not enough memory!");
return(0);
}
printf("学号\t年龄\t姓名\t电脑型号");
h=NULL;
for(i=0;i<=n;i++)
{
if((p=(struct student *)malloc(sizeof(stud)))==NULL)
{
printf("内存不足!");
return(0);
}
printf("\n");
scanf("%d",&p->num);
scanf("%d",&p->age);
scanf("%s",&p->pc);
scanf("%s",&p->name);
p->link=h;
h=p;
}
return(h);
}
stud* insert(stud *h)
{
stud *p,*q,*d,*i;
p=h;
int n;
q=h->link;
d=(stud *)malloc(sizeof(stud));
if(d==NULL)
{
printf("内存不足!");
}
printf("请输入位置后的学号!\n");
scanf("%d",&n);
if(n!=p->num||n!=p->age)//如果插入节点不是头结点,则显示相关信息//
printf("学号\t年龄\t姓名\t电脑型号\n");
if(n==p->num||n==p->age)
{
printf("对不起,这里不能插入!\n");
}
else if
(n==q->num||q->age)
{
scanf("%d",&d->num);
scanf("%d",&d->age);
scanf("%s",&d->pc);
scanf("%s",&d->name);
d->link=p->link;
p->link=d;
}
else if(n!=p->num&&n!=q->num)
{
while(q->num!=NULL&&p->num!=NULL)
{
p=p->link;
q=q->link;
if(n==q->num)
{
printf("请输入要插入的信息!");
scanf("%d",&d->num);
scanf("%d",&d->age);
scanf("%s",&d->pc);
scanf("%s",&d->name);
d->link=p->link;
p->link=d;
}
break;
}
}
return(h);
}
void search(stud *h)
{
stud *p;
int m;
printf("请输入需查学号!");
scanf("%d",&m);
printf("查找中...\n");
system("cls");
p=h;
while(p!=NULL)
{
if(m==p->num||m==p->age)
{ printf("学号\t年龄\t姓名\t电脑型号\n");
printf("%d\t %d\t%s\t%s\n",p->num,p->age,p->pc,p->name);
break;
}
else
{
p=p->link;
}
}
if(p==NULL)
printf("无该生信息!\n");
}
stud *delet(stud *h)
{
stud *q,*p,*I,*d;//指针变量定义//
stud *creat(int n);//定义链表创建函数//
stud *load2();//定义文件检测函数//
FILE *fp,*fp1;//定义文件指针//
int main();//定义主函数//
p=h;
int n;
q=h->link;
printf("请输入要删除的学号!");
scanf("%d",&n);
if(n==p->num||n==p->age)
{if(p->link!=NULL)
*h=*(p->link);
else
free(p);
}
else if(n==q->num||n==q->age)
p->link=q->link;
else if(n!=p->num&&n!=q->num)
while(q->link!=NULL&&p->link!=NULL)
{
p=p->link;
q=q->link;
if(n==q->num||n==q->age)
p->link=q->link;
}
return(h);
}
void print(stud *h)
{
stud *p;
p=h;
while(p!=NULL)
{
printf("%3d %d\n",p->num,p->age);
p=p->link;
}
}
void save(stud *h) //保存函数//
{
stud *p;
FILE *fp;
p=h;//头指针赋给p//
fp=fopen("d:\\KKK","w+");
printf("保存中...\n");
if(fp==NULL)
{
printf("memeory error!");
}
while(p!=NULL)
{
fwrite(p,sizeof(stud),1,fp);
p=p->link;
}
fclose(fp);
printf("save successful !\n");
}
stud *load()
{
stud *p,*q,*h;
FILE *fp;
printf("读取中...");
fp=fopen("d:\\KKK","r");//打开一个文件//
if(fp==NULL)//检测文件能否打开//
{
printf("can not open file!");
return(0);
}
h=NULL;//初始化头指针//
system("cls");
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
h=h->link;
if(h==NULL)
printf("无记录!\n");
else
{
printf("学号\t年龄\t姓名\t电脑型号\n");
while(h!=NULL)
{
printf(" %2d",h->num);
printf("%8d\t",h->age);
printf("%s\t",h->pc);
printf("%s",h->name);
h=h->link;
printf("\n");
}
fclose(fp);
}
}
stud *load2()//文件检测函数,检测文件是否为空////
{
stud *p,*q,*h;
FILE *fp;
int main();
printf("读取中...");
fp=fopen("d:\\KKK","r");//打开一个文件//
if(fp==NULL)//检测文件能否打开//
{
printf("can not open file!");
return(0);
}
h=NULL;//初始化头指针//
system("cls");
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
h=h->link;
if(h==NULL)
{
printf("无数据,请输入内容!\t");
printf("按任意键返回主菜单\n");
getchar();
if(getchar()!='\n')
main();
}
fclose(fp);
}
stud *load3()//文件检测函数//
{
stud *p,*q,*h;//结构体指针声明//
FILE *fp;//文件指针声明//
int main(),n;//主函数定义//
printf("读取中...");
fp=fopen("d:\\KKK","r");//打开一个文件//
if(fp==NULL)//检测文件能否打开//
{
printf("can not open file!");
return(0);
}
h=NULL;//初始化头指针//
system("cls");
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
h=h->link;
if(h!=NULL)
{
printf("已有数据,您写入将会覆盖,继续? y n\n");
}
getchar();
if(getchar()=='y')
system("cls");
return(0);
fclose(fp);
}
stud *cbc()
{
stud *p,*q,*h;
FILE *fp;
fp=fopen("d:\\KKK","r");//打开一个文件//
if(fp==NULL)//检测文件能否打开//
{
printf("can not open file!");
return(0);
}
h=NULL;//初始化头指针//
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
h=h->link;
p=h;//头指针赋给p//
fp=fopen("d:\\KKK","w+");
if(fp==NULL)
{
printf("memeory error!");
}
while(p!=NULL)
{
fwrite(p,sizeof(stud),1,fp);
p=p->link;
}
fclose(fp);
}
stud *DEL()
{
stud *p,*q,*h;
FILE *fp;
stud *load2();//定义文件检测函数//
static n=0;
printf("读取中...");
fp=fopen("d:\\KKK","r");//打开一个文件//
if(fp==NULL)//检测文件能否打开//
{
printf("can not open file!");
return(0);
}
h=NULL;
system("cls");
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
h=h->link;
load2();
delet(h);
printf("保存修改? y n\n");
getchar();
if(getchar()=='y')
save(h);
fclose(fp);
}
stud *INF()
{
stud *p,*q,*h;//结构指针定义//
stud *load2();//检测函数定义//
FILE *fp;//文件指针定义//
load2();
printf("读取中...");
fp=fopen("d:\\KKK","r");//打开一个文件//
if(fp==NULL)//检测文件能否打开//
{
printf("can not open file!");
return(0);
}
h=NULL;
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
system("cls");
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
h=h->link;
insert(h);//接到返回指针,执行插入任务//
printf("保存修改? y n\n");
getchar();
if(getchar()=='y')
save(h);//接到插入函数返回指针,执行保存任务//
fclose(fp);
}
stud *SER()
{
stud *p,*q,*h;
FILE *fp;
printf("读取中...");
fp=fopen("d:\\KKK","r");//打开一个文件//
if(fp==NULL)//检测文件能否打开//
{
printf("can not open file!");
return(0);
}
h=NULL;
system("cls");
while(!feof(fp))
{
p=(stud *)malloc(sizeof(stud));
fread(p,sizeof(stud),1,fp);
p->link=h;
h=p;
}
h=h->link;
search(h);//获取返回指针,执行查找任务//
fclose(fp);
}
int main()
{
printf("载入中...\n");
system("cls");
int c,b,a,e,g,I,Q;
static n=3;
struct student *h;
printf("\t********************欢迎使用学生宿舍管理系统***********************\n");
printf(" \t\t0 添加记录\n");
printf(" \t\t1 删除记录\n");
printf(" \t\t2 显示所有记录\n");
printf(" \t\t3 插入新记录\n");
printf(" \t\t4 查找记录\n");
printf(" \t\t5 退出\n");
printf("请输入选项!\n");
do
{
scanf("%d",&c);
if(c!=0&&c!=1&&c!=2&&c!=3&&c!=4&&c!=5)
printf("无相关选项,请重新选择!\n");
}while(c!=0&&c!=1&&c!=2&&c!=3&&c!=4&&c!=5);//如果选项不在所列范围,则循环提示重新输入//
switch(c)
{//
case 0:load3();
h=creat(2);
printf("5 保存\n6 返回\n");
scanf("%d",&g);
if(g!=5&&g!=6)
do//判断是否有对应选项,否则提示重新输入//
{
printf("没有对应选项,请重新选择!");
scanf("%d",&g);
}while(g!=5&&g!=6);
switch(g)
{
case 5:save(h);main();break;
case 6: main();break;
};break;
case 1:DEL();
n++;//记录调用DEL()函数的次数//
if(n>3)//如果存储次数与3相除余数不为0,说明链表顺序相发,执行cbc()函数,该函数功能是再读取所存链表,然后再写入磁盘以使链表顺序恢复正常//
cbc();
printf("8 退出\n");
scanf("%d",&I);
do//判断是否有对应选项,否则提示重新输入//
{
if(I!=8)
printf("没有对应选项,请重新选择!");
}while(I!=8);
switch(I)//作出选择,若为7则保存修改,为8则返回主菜单//
{
case 8:main();break;
};break;
case 2:load();
printf("9 返回上一层\n");
scanf("%d",&g);
switch(g)
{
case 9:main();break;//选择9,调用主函数,返回主菜单//
};break;
case 3:INF();
n++;
if(n>3)
cbc();
printf("11 退出\n");
scanf("%d",&a);//输入选择值//
switch(a)
{
case 11:main();break;//选择11则直接回到主菜单//
};break;
case 4:SER();
printf("12 返回上一层\n");
scanf("%d",&Q);//输入选择的数//
switch(Q)
{
case 12:main();break;//如果所选数为12,调用主函数,返回主菜单//
};break;
case 5:printf("您确定退出吗? y n\n");
getchar();
if(getchar()=='y')
{
if(getchar()!='\n')
return(0);break;//退出,按任意键//
}
else
{
system("cls");
main();break;
}
}//
}
还有一个问题,为什么我创建时按y得按两遍才可以呢?