新手求教c语言链表程序!编译通过但是运行不出来!谢谢啦
各位大神们,小妹乃大二学生,现有一链表程序编成后实在找不出错误,但一直出现联机解决的框框,晚上就要交~求解哇!初来乍到,没有分,望谅解,如能回答,小妹感激不尽请大家多多指教~
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define NULL 0
#define LEN sizeof(struct person)
struct person
{ char num[3];
char name[8];
char age[2];
char tele[11];
char addr[20];
char email[20];
struct person *next;
}; //建立结构体//
int n;
struct person *head;
struct person *creat(void) //录入信息,生成链表的函数//
{
head=NULL;
struct person *p,*q;
int flag=1,n=0;
while(flag==1)
{ p=(struct person *)malloc(LEN);
n++;
printf("请输入成员编号:");
scanf("%s",p->num);
printf("请输入成员姓名:");
scanf("%s",p->name);
printf("请输入成员年龄:");
scanf("%s",p->age);
printf("请输入成员电话:");
scanf("%s",p->tele);
printf("请输入成员地址:");
scanf("%s",p->addr);
printf("请输入成员邮箱:");
scanf("%s",p->email);
if(n==1)
q=head=p;
else
{q->next=p;
q=p;}
printf("继续录入输入1,否则输入0:");
scanf("%d",&flag);
}
return(head);
}
void print(struct person *t) //以表格方式打印链表的函数//
{
printf("|—————————————————通讯录—————————————————|\n");
printf("| 编号 | 姓名 | 年龄 | 电话 | 地址 | 邮箱 |\n");
do
{printf(" %8s %10s %6s %10s %17s %16s",t->num, t->name, t->age, t->tele,
t->addr, t->email);
t=t->next;
}while(t!=NULL);
printf("|—————————————————————————————————————|\n");
}
struct person *insert(struct person * t) //增加记录的函数//
{
struct person *p,*a;
a=(struct person*)malloc(sizeof(struct person));
printf("请输入成员编号:");
scanf("%s",a->num);
printf("请输入成员姓名:");
scanf("%s",a->name);
printf("请输入成员年龄:");
scanf("%s",a->age);
printf("请输入成员电话:");
scanf("%s",a->tele);
printf("请输入成员地址:");
scanf("%s",a->addr);
printf("请输入成员邮箱:");
scanf("%s",a->email);
if(t==NULL)//若链表为空,则建立一个结点的链表//
{t=a;
p=a;
p->next=NULL;
}
else//链表不为空
{ p=t;
while(p->next!=NULL)p=p->next;//查找链表最后一个结点//
a->next=NULL;
p->next=a; // a的next不指向任何地址,而p的next指向a,使a成为链表最后一个结点//
}
return t;
}
struct person * delect(struct person *t) // 删除记录 //
{ int m=0;
char name[10];
struct person *p=t,*q;
printf("请输入需要删除的姓名:");
scanf("%s",name);
for(;p!=NULL;q=p,p=p->next)
if(strcmp(p->name,name)==0) //比较两个字符串的大小,相同则将跳出循环//
{ m++;
break;
}
if(p==t)
t=t->next;
else
{
q->next =p->next ;
free(p);
}
if(m==0)
printf("对不起,删除失败.\n");
else
printf("删除成功!\n");
return t;
}
void nameseek(struct person *t) // 按人名查找显示记录//
{ int m=0;
struct person *p=t;
char name[10];
printf("请输入需要查找的姓名:");
scanf("%s",name);
for(;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0) //比较两个字符串的大小,相同则将跳出循环//
{ m++;
printf("序号\t姓名\t年龄\t电话\t地址\temail\n");
printf("%s\t%s\t%d\t%s\t%s\t%s\n",p->num,p->name,p->age,p->tele,p->addr,p->email);
break;
}
}
if(m==0)
printf("对不起,您要查找的内容不存在!\n");
}
void teleseek(struct person *t) // 按电话号码查找显示记录//
{ int n=0;
struct person *p=t;
char tele[12];
printf("请输入需要查找的电话:");
scanf("%s",tele);
for(;p!=NULL;p=p->next)
{
if(strcmp(p->tele,tele)==0) //比较两个字符串的大小,相同则将跳出循环//
{ n++;
printf("序号\t姓名\t年龄\t电话\t地址\temail\n");
printf("%s\t%s\t%d\t%s\t%s\t%s\n",p->num,p->name,p->age,p->tele,p->addr,p->email);
break;
}
}
if(n==0)
printf("对不起,您要查找的内容不存在!\n");
}
void modify(struct person *t)// 修改记录//
{
struct person *p=t;
int c,a=0;
char name[10];
printf("请输入需要修改的记录的姓名:");
scanf("%s",name);
for(;p!=NULL;p=p->next)
{
if(!strcmp(p->name,name)) //比较两个字符串的大小,相同则将跳出循环//
{ a++;
break;
}
}
if(a==0)
{printf("要修改的记录不存在.\n");
return;
}
while(1)
{
printf("\n8修改序号 9修改姓名 10修改年龄 11修改电话 12修改地址 13修改邮编 14退出修改:\n");
printf("请选择需要修改的内容:");
scanf("%d",&c);
switch(c)
{ case 8:
printf("\n请输入修改后的序号:");
scanf("%s",p->num);
break;
case 9:
printf("\n请输入修改后的姓名:");
scanf("%s",p->name);
break;
case 10:
printf("\n请输入修改后的年龄:");
scanf("%s",p->age);
break;
case 11:
printf("\n请输入修改后的电话:");
scanf("%s",p->tele);
break;
case 12:
printf("\n请输入修改后的地址 :");
scanf("%s",p->addr);
break;
case 13:
printf("\n请输入修改后的email:");
scanf("%s",p->email);
break;
case 14:
printf("修改完毕!\n");
break;
default:
break;
}
}
}
void save(struct person *t)// 保存为文件//
{ struct person *p=t;
FILE *fp;
if((fp=fopen("contact.dat","wb"))==NULL)
{printf("无法打开此文件\n");
return;
}
else
while(p!=NULL)
{ fwrite(p,sizeof(struct person),1,fp);
p=p->next;
}
printf("文件已保存!\n");
fclose(fp);
}
void main() //主功能函数//
{struct person *k=NULL;
int key;
while(1)
{printf("||******************欢迎使用通讯录管理系统*****************||\n");
printf("||**********************系统功能菜单**********************||\n");
printf("||———————————————————————————||\n");
printf("||———————————————————————————||\n");
printf("\t1.录入信息\t\n");
printf("|---------------------------|\n");
printf("\t2.以表格方式排列\t\n");
printf("|---------------------------|\n");
printf("\t3.增加记录\t\n");
printf("|---------------------------|\n");
printf("\t4.删除记录\t\n");
printf("|---------------------------|\n");
printf("\t5.按姓名查找\t\n");
printf("|---------------------------|\n");
printf("\t6.按电话查找\t\n");
printf("|---------------------------|\n");
printf("\t7.修改记录\t\n");
printf("|---------------------------|\n");
printf("\t8.保存文件\t\n");
printf("|---------------------------|\n");
printf("\t0.退出\t\n");
printf("|---------------------------|\n");
printf("\t请输入服务序号:");
scanf("%d",&key);
switch(key)
{ case 1:k=creat();break;
case 2:print(k);break;
case 3:k=insert(k);break;
case 4:k=delect(k);break;
case 5:nameseek(k);break;
case 6:teleseek(k);break;
case 7:modify(k);break;
case 8:save(k);break;
case 0:printf("谢谢使用");break;
default:break;
}
}
}