首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

程序异常,求支援

2013-04-02 
程序错误,求支援# includestdio.h# includemalloc.h# include stdlib.h# includestring.htypedef

程序错误,求支援

# 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,对比一下就容易理解

热点排行