编写了一个通讯录程序,创建通讯录后就段错误,求大神指点
#include "stdio.h"#include "string.h"
#include "stdlib.h"
typedef struct
{
char name[15];
char phone[13];
char adrr[20];
}datatype;
typedef struct node
{
datatype data;
struct node *next;
}listnode;
typedef listnode *linklist;
linklist head;
listnode *p;
//===============================================声明函数==================================================
int menu(); //菜单
linklist Creat(void); //创建通讯录
void Insert(linklist head,listnode *p); //插入联系人(创建会覆盖掉原本的,所以插入)
listnode *Find(linklist head); //查找联系人
void Delete(linklist head); //删除结点(联系人)
void Print(linklist head); //遍历打印
//===============================================主函数=====================================================
int main()
{
for(;;)
{
switch(menu())
{
case 1:
printf("****************************************\n");
printf("* 通讯信息的创建 *\n");
printf("****************************************\n");
head=Creat();
break;
case 2:
printf("****************************************\n");
printf("* 通讯信息的添加 *\n");
printf("****************************************\n");
printf(" 姓名 号码 地址\n");
printf("****************************************\n ");
p=(listnode *)malloc(sizeof(listnode)); //申请新的结点
scanf("%s%s%s",&p->data.name,&p->data.phone,&p->data.adrr);
Insert(head,p);
break;
case 3:
printf("***************************************\n");
printf("* 通讯信息的查询 *\n");
printf("***************************************\n");
p=Find(head);
if(NULL != p)
{
printf("姓名 号码 地址\n");
printf("***********************************\n");
printf("%s %s %s\n",p->data.name,p->data.phone,p->data.adrr);
printf("***********************************\n");
}
else
{
printf("没有查到要查询的通讯者!\n");
}
break;
case 4:
printf("***************************************\n");
printf("* 通讯信息的删除 *\n");
printf("***************************************\n");
Delete(head);
break;
case 5:
printf("***************************************\n");
printf("* 通讯信息的输出 *\n");
printf("***************************************\n");
Print(head);
break;
case 0:
printf(" 谢谢使用,再见!\n");
return 0;
}
}
return 0;
}
//===============================================子函数=====================================================
//---------------------------建立菜单--------------------------------
int menu()
{
int sel;
printf("\n 通讯录管理系统\n");
printf("========================================\n");
printf(" 1.通讯信息的建立\n");
printf(" 2.通讯信息的添加\n");
printf(" 3.通讯信息的查询\n");
printf(" 4.通讯信息的删除\n");
printf(" 5.通讯信息的输出\n");
printf(" 0.退出\n");
printf("========================================\n");
printf(" 请选择:(0-5) ");
for( ; ; )
{
scanf("%d",&sel);
if(sel>5 || sel<0)
{
printf("input error! please input 0-5!\n");
}
else
break;
}
return sel;
}
//----------------------用尾插法建立链表函数-------------------------
linklist Creat(void)
{
linklist head=(listnode *)malloc(sizeof(listnode)); //申请头结点
listnode *p,*q;
int flag=0;
q=p;
while(0==flag)
{
p=(listnode *)malloc(sizeof(listnode));
printf("姓名 手机号码 地址\n");
printf("****************************************\n");
scanf("%s%s%s",&p->data.name,&p->data.phone,&p->data.adrr);
q->next=p;
q=p;
// p=p->next;
// q=p;
printf(" 是否结束创建 ? (0/1) ");
scanf("%d",&flag);
}
q->next=NULL;
return head;
}
//-------------------------插入通讯信息------------------------------
void Insert (linklist head,listnode *p)
{
listnode *p1,*p2;
p1=head;
p2=p1->next;
while ((NULL != p2) && strcmp(p2->data.name,p->data.name))
{
p1=p2;
p2=p2->next;
}
p1->next=p; //插入p所指向的结点
p->next=p2; //连接表中剩余的结点
}
//-----------------------------查找----------------------------------
listnode *Find(linklist head)
{
listnode *p;
char name[15];
printf("***************************************\n");
printf(" 请输入待查找通讯人的姓名: \n");
p=head->next;
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!=0)
p=p->next;
return p;
}
//------------------------通讯信息的删除-----------------------------
void Delete(linklist head)
{
char del;
listnode *p,*q;
p=Find(head);
if(NULL == p)
{
printf("没有查到要删除的通讯者!\n");
}
q=head;
while ((q!=NULL) &&(q->next!=p))
{
q=q->next;
} q->next=p->next; //删除结点
free(p); //释放被删结点空间
printf("通讯者已被删除!\n");
}
//--------------------------遍历输出通讯录---------------------------
void Print(linklist head)
{
listnode *p;
p=head->next;
printf("姓名 号码 地址\n");
while (p!=NULL)
{
printf("%s\t%s\t%s\n",p->data.name,p->data.phone,p->data.adrr);
printf("---------------------------------------------------------------------------------\n");
p=p->next; //后移一个结点
}
}