首先我们的
通讯录包括4条用户信息:
-
ID
-
姓名
-
电话
-
地址
我们的对
通讯录的操作包括
-
增加一条用户信息
-
删除一条用户信息
-
查找用户信息(模糊匹配)
-
修改一条用户信息:输入姓名修改地址和电话
-
打印通讯录的全部用户信息
-
退出通讯录系统

我们用以
保存用户信息的就是我们的链表
接下来我们先来看一下头文件
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
typedef struct Node
{
char id[20];//编号
char name[50];//姓名
char addres[50];//地址
char number[50];//电话号码
struct Node *next;
}Node;
void show();//打印主界面
void list_print(Node *node);//打印所有的链表里的用户信息
void list_init(Node *node);//链表的初始化
int add_list(Node*node);//增加一个用户信息
int search_list(Node *node,int *flag);//查找用户信息
int change_list(Node *node,int *flag);//修改用户信息
int delect_node(Node *node);//删除一条用户信息
然后我们再来看一下主函数了解一下我们整个项目的结构
int main()
{
Node node;
list_init(&node);
show();
while(1)
{
int n;
Print();
printf("输入您的选择:");
scanf("%d",&n);
switch(n)
{
case 1:
{
int ret = add_node(&node);
if(ret == 1)
{
//清屏
system("clear");
printf("*********************************添加成功!******************************\n");
printf("******************************3秒后返回主界面****************************\n");
sleep(3);
}
system("clear");
}
break;
case 2:
{
list_print(&node);
system("clear");
break;
}
case 3:
{
int flag;
//char enter[10];
int ret = search_list(&node,&flag);
if(ret == 0)
{
printf("*************************查无此人 查找失败*************************\n");
}
system("clear");
break;
}
case 4:
{
int flag;
int ret = change_list(&node,&flag);
if(ret == 1)
{
printf("*****************************修改成功************************************\n");
}
else
{
printf("******************************查无此人***********************************\n");
}
printf("*************************3秒后返回退出系统*******************************\n");
sleep(3);
system("clear");
break;
}
case 5:
{
int ret = delect_node(&node);
if(ret == 1)
{
printf("*****************************删除成功************************************\n");
}
else
{
printf("*****************************查无此人************************************\n");
}
printf("****************************3秒后返回主界面********************************\n");
sleep(3);
break;
}
case 6:
{
printf("****************************3秒后退出系统**********************************\n");
sleep(3);
exit(0);
}
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}
整个的项目构造是通过switch的选择来实现的,接下来就是针对链表的增删查改还有打印链表,然后就加一个界面即可


接下来是我们的各个具体的函数,函数其实都很简答,就是整体的建构的自己梳理梳理
#include"addres.h"
void show()
{
char enter[10];
system("clear");
printf("**************************************欢迎进入通讯录*******************************\n");
printf("*************************************按Enter键进入菜单*****************************\n");
fgets(enter,2,stdin);
if(enter[0] == '\n')
{
system("clear");
}
}
void Print()
{
printf("********************1.添加用户信息 2.列出用户信息**********************\n");
printf("********************3.查找用户信息 4.修改用户信息**********************\n");
printf("********************5.删除用户信息 6.退出系统**************************\n");
}
void list_init(Node *node)
{
if(node == NULL)
{
return;
}
node->next = NULL;
}
int add_node(Node *node)
{
Node *new_node = (Node *)malloc(sizeof(Node));
Node *cur = node->next;
printf("请输入用户id:");
scanf("%s",new_node->id);
getchar();
while(cur != NULL)
{
if(strcmp(cur->id,new_node->id) == 0)
{
printf("用户id重复,请重新输入:");
scanf("%s",new_node->id);
getchar();
continue;
}
cur = cur->next;
}
printf("录入id成功!\n");
printf("请输入用户姓名:");
scanf("%s",new_node->name);
getchar();
cur = node->next;
while(cur != NULL)
{
if(strcmp(cur->name ,new_node->name) == 0)
{
printf("用户姓名重复,请重新输入:");
scanf("%s",new_node->name);
getchar();
continue;
}
cur = cur->next;
}
printf("录入姓名成功!\n");
printf("请输入用户电话号码:");
scanf("%s",new_node->number);
getchar();
if(strlen(new_node->number) != 11)
{
printf("输入电话格式错误,请重新输入:");
scanf("%s",new_node->number);
getchar();
}
cur = node->next;
while(cur != NULL)
{
if(strcmp(cur->number,new_node->number) == 0)
{
printf("电话号码重复,请重新输入:");
scanf("%s",new_node->number);
getchar();
}
cur = cur->next;
}
printf("请输入用户地址:");
scanf("%s",new_node->addres);
getchar();
if(node->next == NULL)
{
node->next = new_node;
new_node->next = NULL;
}
cur = node->next;
while(cur->next != NULL)
{
cur = cur->next;
}
cur->next = new_node;
new_node->next = NULL;
return 1;
}
void list_print(Node *node)
{
system("clear");
char enter[10];
Node *cur = node->next;
printf("*************************************************************************************\n");
printf("id 姓名 电话号码 地址 \n");
while(cur != NULL)
{
printf("%s %s %s %s\n",
cur->id,cur->name,cur->number,cur->addres);
cur = cur->next;
}
printf("请输入q返回主界面:");
fgets(enter,2,stdin);
if(enter[0] == 'q')
{
system("clear");
}
}
//查找用户
int search_list(Node *node,int *flag)
{
while(1)
{
system("clear");
printf("***********************************1.按id查找************************************\n");
printf("***********************************2.按姓名查找**********************************\n");
printf("***********************************3.按电话号码查找******************************\n");
int n;
Node *cur = node->next;
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
{
printf("请输入要查找用户的id:");
char enter[10];
scanf("%s",enter);
getchar();
while(cur != NULL)
{
if(strstr(cur->id,enter) != NULL)
{
printf("%s %s %s %s \n",cur->id,cur->name,cur->number,cur->addres);
*flag = 1;
}
cur = cur->next;
}
printf("输入q返回主界面:");
char a[2];
fgets(a,2,stdin);
if(a[0] == 'q')
{
if(*flag == 1)
{
return 1;
}
return 0;
}
}
case 2:
{
printf("请输入要查找用户的姓名:");
char enter2[10];
cur = node->next;
scanf("%s",enter2);
getchar();
while(cur != NULL)
{
if(strstr(cur->name,enter2) != NULL)
{
printf("%s %s %s %s \n",cur->id,cur->name,cur->number,cur->addres);
*flag = 1;
}
cur = cur->next;
}
printf("输入q返回主界面:");
char a[2];
fgets(a,2,stdin);
if(a[0] == 'q')
{
if(*flag == 1)
{
return 1;
}
return 0;
}
}
case 3:
{
printf("请输入要查找用户的电话号码:");
char enter3[10];
cur = node->next;
scanf("%s",enter3);
getchar();
while(cur != NULL)
{
if(strstr(cur->number,enter3) != NULL)
{
printf("%s %s %s %s \n",cur->id,cur->name,cur->number,cur->addres);
*flag = 1;
}
cur = cur->next;
}
printf("输入q返回主界面:");
char a[2];
fgets(a,2,stdin);
if(a[0] == 'q')
{
if(*flag == 1)
{
return 1;
}
return 0;
}
}
default:
printf("输入错误请重新输入:");
system("clear");
continue;
}
}
if(*flag == 1)
{
return 1;
}
return 0;
}
int change_list(Node *node,int *flag)
{
char enter[10];
int n;
Node *cur = node->next;
printf("*******************************1.修改电话号码*********************************\n");
printf("*******************************2.修改地址*************************************\n");
printf("请选择:");
scanf("%d",&n);
getchar();
printf("请输入你要修改的用户姓名:");
scanf("%s",enter);
getchar();
while(cur != NULL)
{
if(strcmp(cur->name,enter) == 0)
{
*flag = 1;
switch(n)
{
case 1:
{
printf("请输入新的电话号码:");
scanf("%s",cur->number);
getchar();
printf("*******************************修改成功*********************************\n");
break;
}
case 2:
{
printf("请输入新的地址:");
scanf("%s",cur->addres);
getchar();
printf("*******************************修改成功*********************************\n");
break;
}
default:
break;
}
}
cur = cur->next;
}//endofwhile
if(*flag == 1)
{
return 1;
}
return 0;
}
int delect_node(Node *node)
{
system("clear");
char enter[10];
int flag;
Node *cur = node->next;
printf("请输入要删除用户的姓名:");
scanf("%s",enter);
getchar();
while(cur != NULL)
{
if(strcmp(cur->name,enter) == 0)
{
Node *to_delect = cur;
Node *to_delect_next = cur->next;
cur = to_delect_next;
free(to_delect);
flag = 1;
}
cur = cur->next;
}
if(flag == 1)
{
return 1;
}
return 0;
}
这是程序运行的几张截图


代码已提交到码云
https://gitee.com/zmmya/addres