【求助】 关于链表的问题
程序代码:#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#include"string.h"
#define N 3
typedef struct stu
{
char name[20];
long int phone;
char type;
char email;
struct stu*next;
}TONGXUN;
/*菜单函数,返回值为整数*/
int menu_select()
{
char s[3];
int c;
printf("\n ***********主菜单***********\n");
printf(" 1.输入记录\n");
printf(" 2.显示所有记录\n");
printf(" 3.按姓名查找并记录并排序\n");
printf(" 4.插入记录\n");
printf(" 5.删除记录\n");
printf(" 6.将所有记录保存到文件\n");
printf(" 7.从文件中读入所有记录\n");
printf(" 8.退出\n");
printf(" *************************\n\n");
do
{
printf("请选择操作(1-9):");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>9);/*选择项不在0和9之间重输*/
return(c);/*返回选择项,主程序根据该数调用相应的函数*/
}
/*插入模块*/
int insert(TONGXUN *h)
{
TONGXUN *info; /*p指向插入位置,q是其前驱,info指新插入记录*/
int n=0;
printf("\n请添加新记录!\n");
info=(TONGXUN *)malloc(sizeof(TONGXUN)); /*申请空间*/
if(!info)
{
printf("内存分配失败!\n");
return NULL; /*返回空指针*/
}
printf("输入号码:\n");
scanf("%s",info->phone); /*以下是待插入数据的录入和处理,具体同创建模块*/
printf("输入姓名: \n");
scanf("%s",info->name);
printf("输入Email\n");
scanf("%s",info->email);
info->next=h;
h=info;
printf("\n----已添加 %s 到通讯录!----\n",info->name);
return(1);
/*创建链表,完成数据录入功能,新结点在表头插入*/
int create()
{
int i;
float s;
TONGXUN*h=NULL,*info;/*h:头结点指针;info:新结点指针*/
for(;;)
{
info=(TONGXUN*)malloc(sizeof(TONGXUN));/*申请空间*/
if(!info)/*如果指针为空*/
{
printf("\n内存分配失败");
return NULL;/*返回空指针*/
}
printf("\n 请按提示输入信息。\n\n");
printf("输入姓名:");
scanf("%s",info->name)/*输入姓名并校验*/
printf("输入电话号码(输入'#'号结束):");
scanf("%s",info->phone);
if(info->phone[0]=='#')break;/*如果学号首字符为#则结束输入*/
printf("输入类型:");
scanf("%s",info->type);/*输入类型,并校验*/
printf("输入电子邮件地址:");
scanf("%s",info->email);
info->next=h;/*将头结点作为新输入结点的后继结点*/
h=info;/*新输入结点为新的头结点*/
}
return 1;/*返回头指针*/
}
/*删除模块*/
int delete1(TONGXUN *h)
{
char k[5]; /*定义字符串数组,用来确认删除信息*/
TONGXUN *p,*q; /*p为查找到要删除的节点指针,q为其前驱指针*/
char name[20]; /*存放姓名*/
printf("请输入需要删除的姓名:\n"); /*显示提示信息*/
scanf("%s",name); /*输入要删除的姓名*/
q=p=h; /*q和p赋初值头指针*/
while(p!=NULL&&strcmp(p->name,name))/*当记录学好不是要找的,或指针不为空时*/
{
q=p; /*将p指针赋值给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}
if(p==NULL) /*如果p为空,说明链表中没有该节点*/
printf("\n 很遗憾,通讯录中没有你要删除的姓名!\n");
else /*p不为空,显示找到的记录信息*/
{
printf("*************Found***************\n");
printf(" 姓名 号码 类别 Email\n");
printf("-----------------------------------/n");
printf(" %-15s %-15s %-15s %-20s");
printf("***********************************\n");
do{
printf("您确定要删除此记录吗?(y/n):");
scanf("%s",k);
}while(k[0]!='y'&&k[0]!='n');
if(k[0]!='n') /*删除确认判断*/
{ /*如果p==h,说明被删结点时头结点*/
if(p==h)
h=p->next; /*修改头指针指向下一条记录*/
else
q->next=p->next;/*不是头指针,将p的后继结点时头结点*/
free(p); /*释放p所指结点空间*/
printf("\n 已经成功删除! \n",name);
}
}
return(1); /*返回头指针*/
}
/*显示模块*/
void print(TONGXUN *h)
{
int i=0; /*统计记录条数*/
TONGXUN *p; /*移动指针*/
p=h; /*初值为头指针*/
if(p==NULL)
{
printf("\n 很遗憾,空表中没有任何记录可供显示!\n");
}
else /*显示所有已储存信息*/
{
printf("*****************Found*****************");
printf("姓名 号码 类别 E-mile\n");
printf("---------------------------------------");
while(p!=NULL)
{
i++;
printf("%-15s %-15s %-10s %-30s\n",p->name,p->phone,p->type,p->email);
p=p->next;
}
printf("***************************************\n\n");
}
}
/*保存数据到文件模块*/
void save(TONGXUN*h)
{
FILE*fp;/*定义只想文件的指针*/
TONGXUN*p;/*定义移动指针*/
char outfile[20];
print("请输入导出文件名,比如:d:\\xds\\name.txt:\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)/*为输入打开一个二进制文件,如没有建立*/
{
printf("不能打开文件,文件保存失败!\n");
}
else
{
p=h;/*移动指针从头指针开始*/
while(p!=NULL)/*如果p不为空*/
{
fwrite(p,sizeof(TONGXUN),1,fp);/*写入一条记录*/
p=p->next;
}
fclose(fp);
printf("---所有记录已经成功保存至文件%s中!---\n",outfile);/*显示保存成功*/
}
}
/*查找模块*/
void search(TONGXUN *h)
{
TONGXUN *p; /*移动指针*/
char name[20]; /*存放姓名的字符数组*/
printf("请输入您要查找的姓名:\n");
scanf("%s",name); /*输入姓名*/
p=h; /*将头指针赋给p*/
while(p!=NULL&&strcmp(p->name,name)) /*当记录姓名不是要找的,且指针不为空时*/
p=p->next; /*移动指针,指向下一结点,继续查找*/
if(p==NULL) /*指针为空,说明未能找到所要的结点*/
printf("\n 您要查找的是%s,很遗憾,查无此人!\n",name);
else /*显示查找到的记录信息*/
{
printf("**************Found******************\n");
printf(" 姓名 号码 类别 Email\n");
printf("-------------------------------------\n");
printf(" %-15s %-15s %-15s %-20s",p->name,p->phone,p->type,p->email);
printf("*************************************\n");
}
}
/*导入信息模块*/
int load()
{
TONGXUN *p,*q,*h=NULL;/*定义记录指针变量*/
FILE *fp;/*定义指针指向的文件*/
char infile[20];/*保存文件名*/
printf("请输入导入文件名,比如:d:\\xds\\name.txt:\n");
scanf("%s",infile);/*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制文件,为只读方式*/
{
printf("文件打开失败!\n");
return 0;
}
p=(TONGXUN*)malloc(sizeof(TONGXUN)); /*申请空间*/
if(!p)
{
printf("内存分配失败!\n"); /*如果没有分配到,则内存溢出*/
return h; /*返回空头指针*/
}
h=p; /*申请到得空间,将其作为头指针*/
while(!feof(fp)) /*循环数据知道文件结束*/
{
if(1!=fread(p,sizeof(TONGXUN),1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(TONGXUN*)malloc(sizeof(TONGXUN)); /*问下一个结点申请空间*/
if(!p->next)
{
printf("内存分配失败!\n"); /*如果没有申请到,则内存溢出*/
return h;
}
q=p; /*保存当前的结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针尾空*/
fclose(fp); /*关闭文件*/
printf("已经成功从文件%s 导入数据!!!",infile);
return 1; /*返回头指针*/
}
/*********主函数k开始**********/
void main()
{
TONGXUN *head=NULL;/*链表定义头指针*/
system("clor 5e");/*条DOS命令清屏,可用color?命令查看格式*/
for(;;)
{
switch(menu_select())/*调用主菜单,返回值整数作开关语句的条件*/
{
case 1:head=create();break;
case 2:print(head);break;
case 3:search(head);break;
case 4:head=insert(head);break;
case 5:head=delete1(head);break;
case 6:save(head);break;
case 7:head=load();break;
case 8:head=load();break;
case 9:exit(0);
}
}
}









