程序错误,求支援
# include<stdio.h>
# include<malloc.h>
# include <stdlib.h>
# include<string.h>
typedef struct node
{
char name[20];//姓名(name )
char city[20];//城市(city)
char phone[20];//电话(tel)
char qq[20];//QQ号(qq)
struct node *next;
}list;
void initilist(list *head)
{
head=(list *)malloc(sizeof(list));
head->next=NULL;
}
void enter(list *head)
{
list *p,*r;
int n=1;
char name[20],city[20],phone[20],qq[20];
p=(list *)malloc(sizeof(list));
head=p;
p->next=NULL;
r=p;
while(n)
{
printf("名字: ");
scanf("%s",name);
printf("城市: ");
scanf("%s",city);
printf("电话: ");
scanf("%s",phone);
printf("QQ: ");
scanf("%s",qq);
printf("\n");
p=(list *)malloc(sizeof(list));
strcpy(p->name,name);strcpy(p->city,city);strcpy(p->phone,phone);strcpy(p->qq,qq);
p->next=NULL;
r->next=p;
r=p;
printf("是否继续按1输入,按0结束");
scanf("%d",&n);
getchar();
}
}
void display(list *head)
{
list *p;
int i;
char *menu[]={"姓名","城市","电话", "QQ"};
p=head;
printf("--------------------------------\n");
for(i=0;i<4;i++)
printf("%-20s",menu[i]);
printf("\n");
if (head!=NULL)
while(p->next!=NULL)
{
puts(p->next->name);
puts(p->next->city);
puts(p->next->phone);
puts(p->next->qq);
printf("\n");
p=p->next;
}
else
printf("不好意思,列表为空\n");
printf("--------------------------------\n");
}
void search(list *head )
{
list *p1;//定义临时指针变量
char check_name[20]; //定义存储查找人的姓名
printf("请输入要查找的姓名\n");
scanf("%s",check_name); //输入要查找的人的姓名
if(head==NULL)
{
printf("\n不好意思,列表为空\n");
}
p1=head;
while(p1!=NULL&&strcmp(check_name,p1->name)!=0)
{
p1=p1->next;
}
if(p1!=NULL&&strcmp(check_name,p1->name)==0) //找到了用strcmp比较两个字符串
{
printf(" 姓名: %s ",p1->name);
printf(" 城市: %s ",p1->city);
printf(" 电话: %s ",p1->phone);
printf(" QQ : %s ",p1->qq);
printf("\n");
}//输出结点数据
else
printf("\n没有%s的通讯信息\n",check_name);//否则提示没有此人的通讯信息
}
void del(list *head)
{
list *p1,*p2;//定义临时指针
char delname[20];//保存要删除人的姓名
FILE *fp;//文件指针
int i;
printf("请输入要删除人的姓名:");
scanf("%s",delname);//输入要删除人的姓名
if(head==NULL)//如果头指针为空,则输出提示语:通讯录为空
{
printf("\n ====通讯录为空====\n");
}
p1=head; //通讯录不为空时,把头指针赋值给p1
while(p1&&(i=strcmp(delname,p1->name))) //p1指向的不是所要找的结点,且p1不是最后一个结点
{
p2=p1; //保存前驱结点地址
p1=p1->next; //p1后移一个结点
}
if(i==0) //找到了用strcmp比较两个字符串
{
printf("删除人为:%s\n",p1->name);
if(p1==head)
{
head=p1->next; //若p1指向的是首结点,指第二个结点的地址给P1
}
else
{
p2->next=p1->next;//修改指针域
}
printf("刚刚删除的是:%s\n",delname); //提示刚才删除的人的姓名
free(p1); //把此人的信息所占内存释放
}
else if(p1==NULL)
printf("\n姓名为%s的通讯信息没有被找到!\n",delname);//否则没有找到此人
}
void change(list *head )
{
list *p1,*p2; //定义临时指针变量
char change_name[20]; //定义存储修改人的姓名数组
FILE *fp; //文件指针
printf("请输入要修改的姓名\n");
scanf("%s",&change_name); //输入要修改的人的姓名
getchar();
if(head==NULL)
{
printf("\n不好意思,列表为空\n");
}
p1=head;
while(p1!=NULL &&strcmp(change_name,p1->name)!=0)//p1不是要找的名字,而且后面还有
{
p2=p1;
p1=p1->next;
}//p2=p1后面如果要用到P1时会起到作用
if(p1!=NULL && strcmp(change_name,p1->name)==0)
{
printf("名字: ");
gets(p1->name);
printf("城市: ");
gets(p1->city);
printf("电话: ");
gets(p1->phone);
printf("QQ: ");
gets(p1->qq);
printf("\n");
save(head,fp);//把改好的信息重新写到文件里去,改变原文件记录
}
else
printf("\n%s没有被找到\n",change_name);
}
int save(list *head,FILE *fp)
{
list *p0;//定义移动指针
p0=head;
fp=fopen("通讯录.ini","w+");//打开方式为只写
while(p0!=NULL)
{
fwrite(p0,sizeof(list),1,fp);//写入数据
p0=p0->next;
}
fclose(fp);//关闭打开的文件
return 0;
}
void main()
{
list *head;//头指针初始化
FILE *fp;//定义文件指针
int m;//功能代号吗
initilist(&head);
do{
printf("\n #############################请选择################################\n");
printf(" # 1、信息输入 ");
printf(" 2、显示信息 #\n");
printf(" # 3、查找姓名 ");
printf(" 4、删除信息 #\n");
printf(" # 5、修改信息 ");
printf(" 6、打开通讯录 #\n");
printf(" # 7、添加信息 ");
printf(" 8、 保存 #\n");
printf(" # 9、清屏 ");
printf(" 0、退出 #");
printf("\n ###################################################################\n");
printf(" 提示:信息输入和添加信息时最好存入字符,否则,在打开存储文件时,可能会出现乱码!\n");
printf("==输入要执行的功能代号:_");
scanf("%d",&m);
switch(m)
{
case 1:enter(head);break;
case 2:display(head); break;
case 3:search(head); break;
case 4:del(head); break;
case 5:change(head);break;
case 8:save(head,fp);printf("==保存成功==\n");break;
case 9:system("cls");break;
}
}
while(m!=0);
}
[解决办法]
void enter(list *head)
{
list *p,*r;
int n=1;
char name[20],city[20],phone[20],qq[20];
p=(list *)malloc(sizeof(list));
head=p; // 想更新head?用*head=p;函数定义也相应改变为void enter(list **head)
p->next=NULL;
r=p;
...
[解决办法]
因为形参改变不会影响实参,在enter函数调用完毕后,head的值维持原值。
或者你也可以改动函数调用:head=enter(list* head);
再改动enter函数:
list* enter(list* head)
{
...
return head;
}
后一种写法繁琐,都是为了改变head,对比一下就容易理解