#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define Name_Size 20
#define Gender_Size 10
#define Tel_Size 20
#define City_size 30
#define Eip_Size 10
typedef struct {
char Name[Name_Size];
char Gender[Gender_Size];
char Tel[Tel_Size];
char City[City_size];
char Eip[Eip_Size];
}Person;
typedef struct Node{
Person data;
struct Node *next;
}Node,*LinkList;
void Menu(); //菜单
void Quit(); //退出选单
Node *Create(); //创建新的通讯录
LinkList Add(); //在通讯录的末尾,写入新的信息,并返回选单
void Find(){} //查询某人的信息,如果找到了,则显示该人的信息,如果未找到,则提示通讯录中没有此人的信息,并返回选单
void Alter(){} //修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单
void Delete(){} //删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息,并返回选单
void List(); //显示通讯录中的所有记录
void Menu(){
printf("***************************\n");
printf(" 通讯录 \n");
printf("***************************\n");
printf("---------------------------\n");
printf("1.创建通讯录\n");
printf("2.增添个人通讯信息\n");
printf("3.查询个人通讯信息\n");
printf("4.修改个人通讯信息\n");
printf("5.删除个人通讯信息\n");
printf("6.显示所有通讯信息\n");
printf("0.退出\n");
printf("---------------------------\n");
}
/*退出*/
void Quit(){
printf("---------------------------\n");
printf(" 再见! \n");
printf("---------------------------\n");
}
/*创建通讯录*/
Node *Create(LinkList L){
L=(LinkList)malloc(sizeof(Node));
strcpy( (L)->data.City,"NULL");
strcpy( (L)->data.Eip,"NULL");
strcpy( (L)->data.Gender,"NULL");
strcpy( (L)->data.Name,"NULL");
strcpy( (L)->data.Tel,"NULL");
(L)->next=NULL;
printf("---------------------------\n");
printf("创建通讯录成功!\n");
printf("---------------------------\n");
return L;
}
LinkList Add(LinkList L){
Node *h,*r;
r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
char flag='Y';
while(flag=='Y'||flag=='y'){
h=(Node*)malloc(sizeof(Node));
printf("请输入姓名:");
scanf("%s",&h->data.Name);
printf("请输入性别:");
scanf("%s",&h->data.Gender);
printf("请输入电话:");
scanf("%s",&h->data.Tel);
printf("请输入城市:");
scanf("%s",&h->data.City);
printf("请输入邮编:");
scanf("%s",&h->data.Eip);
r->next=h; /*连接首尾结点*/
r=h; /*更新表尾*/
printf("是否继续增添信息?(Y/N):");
scanf("%s",&flag);
}
r->next=NULL;
return r;
}
/*求链表长度*/
int LenList(LinkList L){
Node *p;
int length=0;
p=L->next;
while(p){
length++;
p=p->next;
}
return length;
}
void List(LinkList s){
Node *t;
if(s==NULL||s->next==NULL){
printf("此通讯录为空!\n");
return ;
}
t=s->next;
while(t!=NULL){
printf("姓名:%19s 性别:%9s 电话:%19s 城市:%29s 邮编:%9s\n",t->data.Name,t->data.Gender,t->data.Tel,t->data.City,t->data.Eip);
t=t->next;
}
}
int main(){
LinkList L;
Node *p,*s;
p=L;s=L;
int op,bit=1;
Menu();
while(bit){
Option:
printf("请输入您选择的功能:");
scanf("%d",&op);
switch(op)
{
case 1 :
p=Create(L);
break;
case 2 :
p=Add(p);
break;
case 3 :
Find();
break;
case 4 :
Alter();
break;
case 5 :
Delete();
break;
case 6 :
List(s);
break;
case 0 :
Quit();
break;
default :
printf("您的选择有误!\n");
printf("请重新选择!\n");
goto Option;
}
printf("是否继续其他功能?\n");
printf("1.是 2.否\n");
scanf("%d",&bit);
if(bit==1){
system("cls");
Menu();
}else{
Quit();
break;
}
}
system("pause");
return 0;
}
我的引用List()函数后会出现Segementation Fault,并且直接推出终端系统
但是编译并未出错
List()函数访问链表里存的数
请问一下哪里出现问题了??