学完链表写了一个通讯录的项目,具体要求如下:
语言:c语言
格式:
- 编号
- 姓名
- 手机号码 :11位数
- 住宅电话 :8位数
要求:使用结构体形式对数据存储
功能:使用链表实现增加(在增加人员的过程中有一 个自动排序功能,比如按姓名排序)、删除、修改、查找(比如:工号查找、电话查找)的功能;
(1)添加用户信息(号码长度 号码是否重复)
(2)列出用户信息(按姓名排序)
(3)查找用户信息(按姓名查找)
(4)修改用户信息
(5)删除用户
(6)退出
注意事项:在增、删、改、查过程中,如果姓名相同怎么进行选择操作。
下面给出完整代码
头文件:
#ifndef _ADDRES_H_
#define _ADDRES_H_
#define color_none "\033[0m"
#define color_red "\033[1;5;7;31m"
#define color_purple "\033[1;5;7;35m"
struct list_node
{
char id[20];
char name[50];
char addres[50];
char tel[20];
char homephone[20];
struct list_node *next;
};
typedef struct list_node Node;
typedef Node *link_list;
void show();
void PrintInfo();
int list_init(link_list *list);
int add_list(link_list *list);
int traversal_list(link_list list);
int search_list(link_list list);
int change_list(link_list list);
int delete_list(link_list list);
#endif
主函数:
#include <stdio.h>
#include <stdlib.h>
#include "addres.h"
int main()
{
link_list list;
int ret;
char num[10];
char enter[10];
ret = list_init(&list);
if(ret == 0)
{
printf(color_red"\t\t\t\t\t初始化失败!!!\n"color_none);
}
show();
while(1)
{
PrintInfo();
fgets(num, 2, stdin);
switch(num[0])
{
case '1':
{
ret = add_list(&list);
if(ret == 1)
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf(color_red"\t\t\t\t\t**添加成功!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
if(ret == 2)
{
ret = change_list(list);
if(1 == ret)
{
printf("color_red\t\t\t\t\t**修改成功!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
}
break;
}
case '2':
{
getchar();
ret = traversal_list(list);
if(0 == ret)
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf(color_red"\t\t\t\t\t**没有用户信息!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
break;
}
case '3':
{
ret = search_list(list);
if(0 == ret)
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf(color_red"\t\t\t\t\t**没有这个用户!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
break;
}
case '4':
{
getchar();
ret = change_list(list);
if(0 == ret)
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf(color_red"\t\t\t\t\t**没有这个用户!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
if(1 == ret)
{
printf(color_red"\t\t\t\t\t**修改成功!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
break;
}
case '5':
{
ret = delete_list(list);
if(0 == ret)
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf(color_red"\t\t\t\t\t**没有这个用户!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else if(1 == ret)
{
printf(color_red"\t\t\t\t\t**删除成功!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
break;
}
case '6':
{
exit(1);
}
case 10: //回车键
{
system("clear");
break;
}
default:
{
printf(color_red"\t\t\t\t\t**Unkown Input!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
break;
}
}
}
return 0;
}
调用接口:
#include <stdio.h>
#include <stdlib.h>
#include "addres.h"
#include <string.h>
void show()
{
char enter[10];
system("clear");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t##############################################\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#***************");
printf(color_red"欢迎进入通讯录"color_none);
printf("***************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#*************");
printf(color_purple"请按回车键进入界面"color_none);
printf("*************#\n") ;
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t##############################################\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
void PrintInfo()
{
printf("\t\t\t\t\t##############################################\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t# 1.添加用户信息 2.列出用户信息 #\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t# 3.查找用户信息 4.修改用户信息 #\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t# 5.删除用户信息 6.退出 #\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#****************");
printf(color_red"按回车键清屏"color_none);
printf("****************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#请输入选项:");
}
int list_init(link_list *list)
{
(*list) = (link_list)malloc(sizeof(Node));
if(NULL == (*list))
{
return 0;
}
(*list)->next = NULL;
return 1;
}
int add_list(link_list *list)
{
system("clear");
link_list p = *list;
link_list n = (link_list)malloc(sizeof(Node));
char ch[10];
char enter[10];
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*请输入用户编号:\t");
scanf("%s", n->id);
getchar();
while(p != NULL)
{
if(p->id == n->id)
{
printf("\t\t\t\t\t \n");
printf(color_red"\t\t\t\t\t**编号重复!!!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t**请重新输入编号: ");
scanf("%s", n->id);
getchar();
continue;
}
p = p->next;
}
p = (*list);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*请输入用户姓名:\t");
scanf("%s", n->name);
getchar();
while (p != NULL)
{
if(strcmp(p->name, n->name) == 0)
{
printf(color_red"\t\t\t\t\t**姓名重复!!!\n"color_none);
printf("\t\t\t\t\t**若想修改该用户信息请按q键!!!\n");
printf("\t\t\t\t\t**若想重新输入请按r键!!!\n");
printf("\t\t\t\t\t**请输入:");
scanf("%s", ch);
getchar();
if(ch[0] == 'q')
{
free(n);
return 2;
}
else if(ch[0] == 'r')
{
printf("\t\t\t\t\t*请重新输入姓名: ");
scanf("%s", n->name);
getchar();
continue;
}
else
{
printf(color_red"\t\t\t\t\t**未知命令\n"color_none);
continue;
}
}
p = p->next;
}
p = (*list);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*请输入用户住址:\t");
scanf("%s", n->addres);
getchar();
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*请输入用户手机号:\t");
scanf("%s", n->tel);
getchar();
while(strlen(n->tel) != 11)
{
printf(color_red"\t\t\t\t\t**号码长度错误,请重新输入: "color_none);
scanf("%s", n->tel);
getchar();
}
while(p != NULL)
{
if(strcmp(p->tel, n->tel) == 0)
{
printf(color_red"\t\t\t\t\t**号码重复,请重新输入: "color_none);
scanf("%s", n->tel);
getchar();
continue;
}
p = p->next;
}
p = (*list);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*请输入用户住宅电话:\t");
scanf("%s", n->homephone);
getchar();
while(strlen(n->homephone) != 8)
{
printf(color_red"\t\t\t\t\t**号码长度错误,请重新输入: "color_none);
scanf("%s", n->homephone);
getchar();
}
while(p != NULL)
{
if(strcmp(p->homephone, n->homephone) == 0)
{
printf(color_red"\t\t\t\t\t**号码重复,请重新输入: "color_none);
scanf("%s", n->homephone);
getchar();
continue;
}
p = p->next;
}
p = (*list);
while (p->next != NULL)
{
if(strcmp((p->next)->name, n->name) > 0)
{
n->next = p->next;
p->next = n;
return 1;
}
p = p->next;
}
n->next = p->next;
p->next = n;
return 1;
}
int traversal_list(link_list list)
{
system("clear");
link_list p = list->next;
if(p == NULL)
{
return 0;
}
while(p != NULL)
{
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t编号: %d\n", p->id);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t姓名: %s\n", p->name);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t地址: %s\n", p->addres);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t手机号码: %s\n", p->tel);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t住宅电话: %s\n", p->homephone);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
p = p->next;
}
return 1;
}
int search_list(link_list list)
{
system("clear");
link_list p = list;
char a[20];
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*请输入你想查找的名字:");
scanf("%s", a);
getchar();
while(p != NULL)
{
if(strcmp(p->name, a) == 0)
{
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t编号: %d\n", p->id);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t姓名: %s\n", p->name);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t地址: %s\n", p->addres);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t手机号码: %s\n", p->tel);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t住宅电话: %s\n", p->homephone);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
return 1;
}
p = p->next;
}
return 0;
}
int change_list(link_list list)
{
system("clear");
link_list p = list;
link_list m = list;
char a[20];
char b[10];
char c[20]; //存输入的电话号码
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*请输入你想修改信息的名字:");
scanf("%s", a);
getchar();
while(p != NULL)
{
if(strcmp(p->name, a) == 0)
{
while(1)
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t 1.地址 2.手机号码 3.住宅电话 4.退出修改 \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t *请输入你想修改的信息的编号:");
fgets(b, 2, stdin);
switch(b[0])
{
case '1':
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t*请输入新地址:");
scanf("%s", p->addres);
printf(color_red"\t\t\t\t\t**修改成功!!!\n"color_none);
break;
}
case '2':
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t*请输入新手机号码:");
scanf("%s", c);
getchar();
while(strlen(c) != 11)
{
printf(color_red"\t\t\t\t\t**号码长度错误,请重新输入: "color_none);
scanf("%s", c);
getchar();
}
while(m != NULL)
{
if(strcmp(m->tel, c) == 0)
{
printf(color_red"\t\t\t\t\t**号码重复,请重新输入: "color_none);
scanf("%s", c);
getchar();
continue;
}
m = m->next;
}
strcpy(p->tel, c);
printf(color_red"\t\t\t\t\t**修改成功!!!\n"color_none);
break;
}
case '3':
{
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t*请输入新住宅号码:");
scanf("%s", c);
getchar();
while(strlen(c) != 8)
{
printf(color_red"\t\t\t\t\t**号码长度错误,请重新输入: "color_none);
scanf("%s", c);
getchar();
}
while(m != NULL)
{
if(strcmp(m->homephone, c) == 0)
{
printf(color_red"\t\t\t\t\t**号码重复,请重新输入: "color_none);
scanf("%s", c);
getchar();
continue;
}
m = m->next;
}
strcpy(p->homephone, c);
printf(color_red"\t\t\t\t\t**修改成功!!!\n"color_none);
break;
}
case '4':
{
return 1;
}
}
}
}
p = p->next;
}
return 0;
}
int delete_list(link_list list)
{
system("clear");
link_list p = list;
link_list tmp;
char a[20];
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t############################################\n");
printf("\t\t\t\t\t*请输入你想删除信息的名字:");
scanf("%s", a);
getchar();
while(p->next != NULL)
{
if(strcmp(p->next->name, a) == 0)
{
tmp = p->next;
p->next = tmp->next;
free(tmp);
return 1;
}
p = p->next;
}
return 0;
}