C通讯录链表版

来源:互联网 发布:推荐淘宝皮鞋店铺 编辑:程序博客网 时间:2024/05/16 05:03

利用循环双链表实现了通讯录的一些功能,包括添加联系人,查询,修改,删除和显示联系人,尚没有实现文件的读取与保存。

程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//声明联系人结构体
typedef struct contact
{
char name[20];
char telnum[20];
char sex;
char id[20];
struct contact * next;
struct contact * prev;
}Contact;
typedef Contact * CtLink;


void menu();//主菜单
void choice();//选择功能
void create_empty_contacts(CtLink * head);//建立空的通讯录
void create_newcontact(CtLink * new_contact);//创建新的联系人
void is_malloc_ok(CtLink new_contact);//内存是否分配成功
void add_contact();//添加菜单函数
void search_contact();//查询联系人菜单
void search_name();//按姓名查询
void search_telnum();//按电话号码查询
void edit_contact();//修改联系人菜单
void edit_name();//按名字查询修改
void edit_telnum();//按电话号码查询修改
void delete_contact();//删除联系人菜单
void delete_name();//按姓名查询删除
void delete_telnum();//按电话号码查询删除
void display_contacts();//显示所有联系人
void insert_contact_sort(CtLink new_contact,char * name);//按姓名首字母排序联系人
void free_contacts();//清空通讯录


CtLink head = NULL;//定义一个全局头指针


/*主菜单*/
int main()
{
create_empty_contacts(&head);
choice();
free_contacts();
return 0;
}


/*建立空通讯录*/
void create_empty_contacts(CtLink * head)
{
create_newcontact(head);
(*head)->next = (*head)->prev = *head;
}


/*创建新联系人*/
void create_newcontact(CtLink * new_contact)
{
*new_contact = (CtLink)malloc(sizeof(Contact));
is_malloc_ok(*new_contact);
}


/*内存是否分配成功*/
void is_malloc_ok(CtLink new_contact)
{
if (new_contact == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}


/*主菜单*/
void menu()
{
printf("|-----------------------------欢迎使用煜D通讯录管理系统---------------------------|\n");
printf("|-----------------------------输入1~5选择功能 输入q退出---------------------------|\n");
printf("|-----------------------------(1)添加联系人---------------------------------------|\n");
printf("|-----------------------------(2)查询联系人---------------------------------------|\n");
printf("|-----------------------------(3)修改联系人---------------------------------------|\n");
printf("|-----------------------------(4)删除联系人---------------------------------------|\n");
printf("|-----------------------------(5)显示联系人---------------------------------------|\n");
printf("|-----------------------------(q)退出---------------------------------------------|\n");
}


/*功能选择*/
void choice()
{
char selection;
menu();
printf("请选择你需要的服务(enter 0 to 5):");
scanf("%c", &selection);
while (selection != 'q')
{
getchar();
switch (selection)
{
case '1':add_contact(); getchar();
break;
case '2':search_contact(); getchar();
break;
case '3':edit_contact(); getchar();
break;
case '4':delete_contact(); getchar();
break;
case '5':display_contacts();
break;
default:printf("请输入正确的选项!\n");
break;
}
system("cls");
menu();
printf("请选择你需要的服务(enter 0 to 5):");
scanf("%c", &selection);
}
printf("bye!\n");
}


/*添加联系人*/
void add_contact()
{
char selection;
int num,i;
CtLink new_contact = NULL;
selection = 'y';
printf("|--------------------------欢迎使用添加联系人功能---------------------------------|\n");
while (selection == 'y')
{
printf("请输入要添加的人数:\n");
scanf("%d", &num);
for (i = 0; i < num; i++)
{
create_newcontact(&new_contact);
printf("请输入第%d个联系人的姓名:\n", i + 1);
scanf("%s", new_contact->name);
printf("请输入第%d个联系人的电话:\n", i + 1);
scanf("%s", new_contact->telnum);
getchar();
printf("请输入第%d个联系人的性别:\n", i + 1);
scanf("%c", &new_contact->sex);
printf("请输入第%d个联系人的身份:\n", i + 1);
scanf("%s", new_contact->id);
insert_contact_sort(new_contact, new_contact->name);
}
getchar();
printf("数据添加完成 是否继续添加(y/n):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
system("cls");
}


/*按姓名首字母排序联系人*/
void insert_contact_sort(CtLink new_contact,char * name)
{
CtLink p;
p = head->next;
while (p != head &&  strcmp(name,p->name)>0)
{
p = p->next;
}
new_contact->next = p;
new_contact->prev = p->prev;
p->prev->next = new_contact;
p->prev = new_contact;
}


/*显示所有联系人*/
void display_contacts()
{
CtLink p;
p = head->next;
int i;
i = 1;
printf("|--------------------------欢迎使用显示联系人功能---------------------------------|\n");
if (head->next == head)
{
printf("通讯录中没有记录!\n");
}
else
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
while (p != head)
{
printf("       %2d   %10s     %10s     %1c    %10s \n", i, p->name, p->telnum, p->sex, p->id);
i++;
p = p->next;
}
printf("所有联系人显示完毕!\n");
}
getchar();
system("cls");
}


/*查询联系人菜单*/
void search_contact()
{
char selection;
printf("|--------------------------欢迎使用查询联系人功能---------------------------------|\n");
printf("|--------------------------(1)按姓名查找------------------------------------------|\n");
printf("|--------------------------(2)按电话号码查找--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
while (selection != 'q')
{
switch (selection)
{
case '1':search_name(); getchar();
break;
case '2':search_telnum(); getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
}


/*按名字查询*/
void search_name()
{
char name[20];
CtLink p;
int i;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按姓名查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的姓名:");
scanf("%s", name);
while (p != head)
{
if (strcmp(name, p->name) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1c    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


/*按电话号码查询*/
void search_telnum()
{
char telnum[20];
CtLink p;
int i;
p = head->next;
i = 0;
printf("|------------------------欢迎使用按电话号码查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的电话号码:");
scanf("%s", telnum);
while (p != head)
{
if (strcmp(telnum, p->telnum) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1c    %10s \n", i+1, p->name, p->telnum, p->sex, p->id);
i++;
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


/*修改联系人菜单*/
void edit_contact()
{
char selection;
printf("|--------------------------欢迎使用修改联系人功能---------------------------------|\n");
printf("|--------------------------(1)按姓名查找------------------------------------------|\n");
printf("|--------------------------(2)按电话号码查找--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
while (selection != 'q')
{
switch (selection)
{
case '1':edit_name(); getchar();
break;
case '2':edit_telnum(); getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
}


/*按姓名查询修改联系人*/
void edit_telnum()
{
char telnum[20];
char selection;
char arr[20];
char ch;
CtLink p;
int i;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按电话号码查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的电话号码:");
scanf("%s", telnum);
getchar();
while (p != head)
{
if (strcmp(telnum, p->telnum) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1c    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
printf("|--------------------------欢迎使用修改联系人功能---------------------------------|\n");
printf("|--------------------------(1)修改姓名------------------------------------------|\n");
printf("|--------------------------(2)修改电话号码--------------------------------------|\n");
printf("|--------------------------(3)修改性别--------------------------------------|\n");
printf("|--------------------------(4)修改身份--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
getchar();
while (selection != 'q')
{
switch (selection)
{
case '1':
printf("请输入要修改的名字:");
scanf("%s", arr);
strcpy(p->name, arr);
getchar();
break;
case '2':
printf("请输入要修改的电话号码:");
scanf("%s", arr);
strcpy(p->telnum, arr);
getchar();
break;
case '3':
printf("请输入要修改的性别:");
scanf("%c", &ch);
p->sex = ch;
getchar();
break;
case '4':
printf("请输入要修改的身份:");
scanf("%s", arr);
strcpy(p->id, arr);
getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
}
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


/*按电话号码查询修改联系人*/
void edit_name()
{
char name[20];
char selection;
char arr[20];
char ch;
CtLink p;
int i;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按姓名查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的姓名:");
scanf("%s", name);
getchar();
while (p != head)
{
if (strcmp(name, p->name) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1c    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
printf("|--------------------------欢迎使用修改联系人功能---------------------------------|\n");
printf("|--------------------------(1)修改姓名------------------------------------------|\n");
printf("|--------------------------(2)修改电话号码--------------------------------------|\n");
printf("|--------------------------(3)修改性别--------------------------------------|\n");
printf("|--------------------------(4)修改身份--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
getchar();
while (selection != 'q')
{
switch (selection)
{
case '1':
printf("请输入要修改的名字:");
scanf("%s", arr);
strcpy(p->name, arr);
getchar();
break;
case '2':
printf("请输入要修改的电话号码:");
scanf("%s", arr);
strcpy(p->telnum, arr);
getchar();
break;
case '3':
printf("请输入要修改的性别:");
scanf("%c", &ch);
p->sex = ch;
getchar();
break;
case '4':
printf("请输入要修改的身份:");
scanf("%s", arr);
strcpy(p->id, arr);
getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
}
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


/*删除联系人菜单*/
void delete_contact()
{
char selection;
printf("|--------------------------欢迎使用删除联系人功能---------------------------------|\n");
printf("|--------------------------(1)按姓名查找------------------------------------------|\n");
printf("|--------------------------(2)按电话号码查找--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
while (selection != 'q')
{
switch (selection)
{
case '1':delete_name(); getchar();
break;
case '2':delete_telnum(); getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
}


/*按姓名查询删除联系人*/
void delete_name()
{
char name[20];
CtLink p;
int i;
char ch;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按姓名查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的姓名:");
scanf("%s", name);
while (p != head)
{
if (strcmp(name, p->name) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1c    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
getchar();
printf("是否删除该联系人?(y/n)");
scanf("%c", &ch);
if (ch == 'y')
{
p->next->prev = p->prev;
p->prev->next = p->next;
free(p);
break;
}
else
p = p->next;
}
else
{
p = p->next;
}
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


/*按电话号码查询删除联系人*/
void delete_telnum()
{
char telnum[20];
CtLink p;
int i;
char ch;
p = head->next;
i = 0;
printf("|------------------------欢迎使用按电话号码查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的电话号码:");
scanf("%s", telnum);
while (p != head)
{
if (strcmp(telnum, p->telnum) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1c    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
getchar();
printf("是否删除该联系人?(y/n)");
scanf("%c", &ch);
if (ch == 'y')
{
p->next->prev = p->prev;
p->prev->next = p->next;
free(p);
break;
}
else
p = p->next;
}
else
{
p = p->next;
}
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


/*清空通讯录*/
void free_contacts()
{
CtLink p;
p = head->next;
if (head->next == head)
{
printf("contacts is empty,release error!\n");
return;
}
while (p != head)
{
p->prev->next = p->next;
p->next->prev = p->prev;
free(p);
p = head->next;
}
printf("release success!\n");
}

0 0
原创粉丝点击