/*****************************************************************
*
*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *menu[]={"*******************************",\
"*** 1.添加一位通讯录成员。 ***",\
"*** 2.查询一位通讯录成员。 ***",\
"*** 3.删除一位通讯录成员。 ***",\
"*** 4.修改一位通讯录成员。 ***",\
"*** 5.显示所有通讯录成员。 ***",\
"*** 6.删除通讯录。 ***",\
"*** 0.退出通讯录。 ***",\
"*******************************"};
typedef struct{
char name[20];
char tel[11];
}DataType;
typedef struct node{
DataType data;
struct node *next;
}LNode,*Linklist;
//定义结点
int CreatLinklist(Linklist *L)
{
(*L)=(Linklist)malloc(sizeof(LNode));
if((*L) == NULL)
{
printf("malloc error\n");
return 0;
}
(*L)->next=NULL;
return 1;
}
//创建空单链表
Linklist L;
void Destroy_Linklist(Linklist *H) //注意传入的参数是头指针的地址,否则无法修改单链表的值(无法销毁单链表)。
{
Linklist p,q;
p=*H;
while(p)
{
q=p;
p=p->next;
free(q);
}
*H=NULL;
}
//销毁单链表
int Lenth_Linklist(Linklist H)
{
Linklist p=H;
int count=-1;//存在头结点
while(p)
{
p=p->next;
count++;
}
return (count);
}
//求单链表的表长
int Check_Linklist_name(Linklist H,char *x)
{
Linklist p=H->next;
int i=1;
while(p)
{
if(strcmp((p->data).name,x)==0)
{
break;
}
else
{
p=p->next;
i++;
}
}
if(p == NULL)
{
printf("未找到联系人!\n");
return 0;
}
return i;
}
//用姓名查询单链表
int Check_Linklist_tel(Linklist H,char *x)
{
Linklist p=H->next;
int i=1;
while(p)
{
if(strcmp((p->data).tel,x)==0)
{
break;
}
else
{
p=p->next;
i++;
}
}
if(p == NULL)
{
printf("未找到联系人!\n");
return 0;
}
return i;
}
//用电话号码查询单链表
int Insert_Linklist(Linklist H,int i,char *ch,char *x)
{
Linklist p,q;
int j=1;
if(H==NULL)
{
printf("菜单不存在!\n");
return 0;
}
if(i<1||i>Lenth_Linklist(H)+1)
{
printf("插入位置错误!\n");
return 0;
}
p=H;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
q=(Linklist)malloc(sizeof(LNode));
if(q == NULL)
{
printf("分配空间出错!\n");
return 0;
}
strcpy(q->data.name,ch);
strcpy(q->data.tel,x);
q->next=p->next;
p->next=q;
return 1;
}
//插入信息
int Delete_Linklist(Linklist H,int i)
{
Linklist p,q;
int j=1;
if(H==NULL)
{
printf("链表不存在!\n");
return 0;
}
if(i<1||i>Lenth_Linklist(H))
{
printf("选择位置错误!\n");
return 0;
}
p=H;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);
return 1;
}
//删除第i个结点
void printmenu()
{
int i;
for(i=0;i<9;i++)
{
printf("%s\n",*(menu+i));
}
printf("请选择你需要的功能:");
}
void choosenum();
void display()
{
int i;
Linklist p;
p=L;
system("clear");
for(i=1;p->next!=NULL;i++)
{
p=p->next;
printf("第%d位联系人信息如下:\n",i);
printf("姓名:%s\n",p->data.name);
printf("电话号码:%s\n\n",p->data.tel);
}
getchar();
getchar();
system("clear");
printmenu();
choosenum();
}//功能5
void fun1()
{
char name[20];
char tel[11];
system("clear");
printf("请输入姓名:");
scanf("%s",name);
putchar('\n');
printf("请输入电话:");
scanf("%s",tel);
Insert_Linklist(L,1,name,tel);
system("clear");
printmenu();
choosenum();
}//功能1
void fun2()
{
system("clear");
char name[20];
char tel[11];
Linklist p;
p=L;
int i,j;
printf("根据姓名查找请输入 1\n");
printf("根据电话号码查询请输入 2\n");
scanf("%d",&i);
if(1 == i)
{
system("clear");
printf("请输入姓名:");
scanf("%s",name);
j=Check_Linklist_name(L,name);
for(i=0;i<j;i++)
{
p=p->next;
}
printf("姓名为:%s\n",p->data.name);
printf("电话号码为:%s\n",p->data.tel);
getchar();
getchar();
system("clear");
printmenu();
choosenum();
}
else if(2 == i)
{
system("clear");
printf("请输入电话号码:");
scanf("%s",tel);
j=Check_Linklist_tel(L,tel);
for(i=0;i<j;i++)
{
p=p->next;
}
printf("姓名为:%s\n",p->data.name);
printf("电话号码为:%s\n",p->data.tel);
getchar();
getchar();
system("clear");
printmenu();
choosenum();
}
else
{
printf("输入的选择错误!\n");
system("clear");
printmenu();
choosenum();
}
}//功能2
void fun3()
{
system("clear");
char name[20];
char tel[11];
Linklist p;
p=L;
int i,j;
printf("根据姓名删除请输入 1\n");
printf("根据电话号码删除请输入 2\n");
scanf("%d",&i);
if(1 == i)
{
system("clear");
printf("请输入姓名:");
scanf("%s",name);
j=Check_Linklist_name(L,name);
Delete_Linklist(L,j);
getchar();
system("clear");
printmenu();
choosenum();
}
else if(2 == i)
{
system("clear");
printf("请输入电话号码:");
scanf("%s",tel);
j=Check_Linklist_tel(L,tel);
Delete_Linklist(L,j);
getchar();
system("clear");
printmenu();
choosenum();
}
else
{
printf("输入的选择错误!\n");
system("clear");
printmenu();
choosenum();
}
}//功能3
void fun4()
{
int i,j;
char name[20],newname[20];
char tel[11],newtel[11];
system("clear");
printf("根据姓名修改信息请输入 1\n");
printf("根据电话号码修改信息请输入 2\n");
scanf("%d",&i);
if(1 == i)
{
printf("请输入姓名:");
scanf("%s",name);
j=Check_Linklist_name(L,name);
Delete_Linklist(L,j);
printf("请输入新的姓名:");
scanf("%s",newname);
printf("请输入新的电话号码:");
scanf("%s",newtel);
Insert_Linklist(L,1,newname,newtel);
getchar();
system("clear");
printmenu();
choosenum();
}
else if(2 == i)
{
printf("请输入电话号码:");
scanf("%s",tel);
j=Check_Linklist_tel(L,tel);
Delete_Linklist(L,j);
printf("请输入新的姓名:");
scanf("%s",newname);
printf("请输入新的电话号码:");
scanf("%s",newtel);
Insert_Linklist(L,1,newname,newtel);
getchar();
system("clear");
printmenu();
choosenum();
}
else
{
printf("输入的选择错误!\n");
system("clear");
printmenu();
choosenum();
}
}//功能4
void fun6()
{
Destroy_Linklist(&L);
system("clear");
printf("删除成功\n");
getchar();
getchar();
Linklist L;
CreatLinklist(&L);
system("clear");
printmenu();
choosenum();
}//功能6
void choosenum()
{
int i;
scanf("%d",&i);
switch(i){
case 1: fun1(); break;
case 2: fun2(); break;
case 3: fun3(); break;
case 4: fun4(); break;
case 5: display(); break;
case 6: fun6(); break;
case 0: printf("thank\n"); exit(0); break;
default: printf("请输入正确的功能选项\n");getchar();getchar();getchar(); system("clear");printmenu();choosenum();
}
}
int main(int argc,char *argv[])
{
CreatLinklist(&L);
system("clear");
printmenu();
choosenum();
return 0;
}