界面:基于控制台实现用户的输入和输出,主菜单界面,用 while语句实现不断执行直到用户自行选择退出。
程序流程:在main函数中实现主界面功能提示,通过调用函数,实现各个功能。使用结构体描述用户所具有的基本信息。
具体功能:
- 退出系统(操作人可根据需求按提示随时退出系统)
- 创建通讯录(包括姓名、工作单位、手机号码、电子邮箱)
- 查询通讯录(根据联系人姓名来查询信息)
- 修改通讯录(根据联系人的姓名找到要修改的联系人并进行修改)
- 删除通讯录(根据联系人姓名来删除对应联系人)
- 按姓名进行排序(根据联系人姓名对应的ASCII码值,按由小到大排序)
- 显示通讯录(可以把创建的联系人打印出来)
子函数划分:
a、创建通讯录联系人
b、查询联系人
c、修改联系人
d、删除联系人
e、对联系人按姓名排序
f、退出系统
g、显示联系人信息
h、为联系人动态开辟内存空间
部分界面展示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define LEN sizeof(struct linkman) //宏定义结构体的空间,为下面动态开辟空间做准备
int len; // 记录当前已经记录的人数
typedef struct linkman
{
char username[20]; // 姓名
char address[30]; // 工作单位
char phone[20]; // 联系电话
char email[30]; // 邮箱
struct linkman *next; // 指针 指向下一个联系人
} linkman;
// 创建链表
struct linkman *create() {
linkman * head_linkmanlist;
linkman *var1, *var2; // 初始化一个当前链表的指针
char name[20]; // 姓名输入在20个长度之内
len = 0;
var1 = (linkman *)malloc(LEN);
var2 = var1;
printf("请录入当前需要录入的人员信息!\n姓名输入n时代表结束创建\n\n");
printf("请输入联系人姓名:");
gets(name);
if (strcmp(name, "n") != 0)
{
strcpy(var1->username, name);
printf("请输入联系人工作单位:"); gets(var1->address);
printf("请输入联系人联系电话:"); gets(var1->phone);
printf("请输入联系人电子邮箱:"); gets(var1->email);
head_linkmanlist = NULL;
while (1)
{
len = len + 1; //记录通讯录个数
if (len == 1)
{
head_linkmanlist = var1;
}
else
{
var2->next = var1;
}
var2 = var1;
printf("请输入姓名:");
gets(name);
if (strcmp(name, "n") == 0)
{
break;
}
else
{
var1 = (linkman *)malloc(LEN);
strcpy(var1->username, name);
printf("请输入联系人工作单位:"); gets(var1->address);
printf("请输入联系人联系电话:"); gets(var1->phone);
printf("请输入联系人电子邮箱:"); gets(var1->email);
}
}
var2->next = NULL;
return head_linkmanlist;
}
else
return head_linkmanlist;
};
//修改
void changeLinkman(linkman *head_linkman)
{
linkman *p1, *p2;
char name[20];
int nM;
if (head_linkman == NULL)
{
printf("您操作的通讯录此时为空,不能进行修改操作!");
}
p1 = head_linkman;
nM = 0;
if (p1 != NULL)
{
printf("请输入要修改的联系人的姓名:");
gets(name);
while (strcmp(p1->username, name) != 0 && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (strcmp(p1->username, name) == 0)
{
nM++;
int nCase;
printf("==========================你要修改的的联系人是=============================\n\n");
printf("姓名:%s\t学校名称:%s\t联系电话:%s\t电子邮箱:%s\t\n\n", p1->username, p1->address, p1->phone, p1->email);
printf("============================================================================\n\n");
switch (1)
{
case 1:
{
char changename[20];
printf("请输入新的姓名:");
gets(name);
strcpy(p1->username, name);
printf("姓名已修改为:%s\n\n", p1->username);
}
case 2:
{
char changedAddress[20];
printf("请输入新的工作单位:");
gets(changedAddress);
strcpy(p1->address, changedAddress);
printf("工作单位已修改为:%s\n\n", p1->address);
}
case 3:
{
char changedPhone[20];
printf("请输入新的电话号码:");
gets(changedPhone);
strcpy(p1->phone, changedPhone);
printf("电话号码已修改为:%s\n\n", p1->phone);
}
case 4:
{
char changedEmail[20];
printf("请输入新的电子邮箱:");
gets(changedEmail);
strcpy(p1->email, changedEmail);
printf("电子邮箱已修改为:%s\n\n", p1->email);
}break;
default:
printf("您输入的选项有误,请查证后重新操作!!\n");
break;
}
}
if (nM == 0)
{
printf("此人未录入到通讯录中,不能进行修改操作!\n");
}
}
}
// 显示
void show(linkman * head_linkman)
{
linkman *p;
p = head_linkman;
if (p != NULL)
{
printf("本通讯录系统现在记录共有%d人:\n", len);
if (p != NULL)
{
do
{
printf("姓名:%s\n学校名称:%s\n联系电话:%s\n电子邮箱:%s\n\n", p->username, p->address, p->phone, p->email);
p = p->next;
} while (p != NULL);
}
}
else
{
printf("通讯录为空!\n");
}
}
//删除
linkman *deleNode(linkman *head_linkman)
{
linkman *v1, *v2;
char name[20];
if (head_linkman == NULL)
{
printf("您操作的通讯录此时为空,不能进行删除操作!");
}
printf("请输入要删除的联系人的姓名:");
gets(name);
for (v2 = v1 = head_linkman; v1 != NULL;)
{
if (strcmp(v1->username, name) == 0)
{
if (strcmp(head_linkman->username,name) == 0)//对头指针特殊处理
{
v1 = head_linkman;
head_linkman = head_linkman->next;
free(v1);
printf("该联系人已成功删除!\n");
v2 = v1 = head_linkman;
len--;
return head_linkman;
}
else
{
v2->next = v1->next;
free(v1);
v1 = v2->next;
printf("该联系人已成功删除!\n");
len--;
return head_linkman;
}
}
else
{
v2 = v1;
v1 = v1->next;
}
}
printf("你要删除的联系人不存在\n\n");
return head_linkman;
}
//查询
void serachLink(linkman *head_linkman)
{
linkman *p1, *p2;
char name[20];
int nM;
if (head_linkman == NULL)
{
printf("您操作的通讯录此时为空,不能进行查询操作!");
}
p1 = head_linkman;
nM = 0;
if (p1 != NULL)
{
printf("请输入要查询的联系人的姓名:");
gets(name);
while (strcmp(p1->username, name) != 0 && p1->next != NULL)
{
p1 = p1->next;
}
if (strcmp(p1->username, name) == 0)
{
nM++;
printf("--------------------------你查找的联系人是----------------------------\n\n");
printf("姓名:%s\t学校名称:%s\t联系电话:%s\t电子邮箱:%s\t\n", p1->username, p1->address, p1->phone, p1->email);
}
if (nM == 0)
{
printf("此人未录入通讯录!\n");
}
}
}
//按姓名排序
linkman *paixu(linkman *head_linkman)
{
linkman *p3;//临时变量,释放空间用
linkman *p1, *p2;
int i, j;
typedef struct linkman_one
{
char username[20]; // 姓名
char address[30]; // 工作单位
char phone[20]; // 联系电话
char email[30]; // 邮箱
};
struct linkman_one px[400];
struct linkman_one temp;
if (head_linkman == NULL)
{
printf("你操作的通讯录为空,不能进行排序!\n\n");
return head_linkman;
}
p1 = head_linkman;
for (i = 1, i <= len; p1 != NULL; i++)
{
strcpy(px[i].username, p1->username);
strcpy(px[i].address, p1->address);
strcpy(px[i].phone, p1->phone);
strcpy(px[i].email, p1->email);
p2 = p1;
p1 = p1->next;
}
while (head_linkman != NULL)//释放链表内存
{
p3 = head_linkman;
head_linkman = head_linkman->next;
free(p3);
}
for (j = 1; j <= len; j++)//进行排序
{
for (i = j + 1; i <= len; i++)
{
if (strcmp(px[i].username, px[j].username) < 0)
{
temp = px[i];
px[i] = px[j];
px[j] = temp;
}
}
}
p1 = (linkman *)malloc(LEN);
p2 = p1;
strcpy(p1->username, px[1].username);
strcpy(p1->address, px[1].address);
strcpy(p1->phone, px[1].phone);
strcpy(p1->email, px[1].email);
head_linkman = p1;
for (i = 2; i <= len; i++)
{
p1 = (linkman *)malloc(LEN);
strcpy(p1->username, px[i].username);
strcpy(p1->address, px[i].address);
strcpy(p1->phone, px[i].phone);
strcpy(p1->email, px[i].email);
p2->next = p1;
p2 = p1;
}
p2->next = NULL;
printf("通讯录按姓名排序后为:\n\n");
show(head_linkman);
return head_linkman;
}
//菜单
void menu()
{
printf("\t\t|--------------------通讯录管理系统—----------------|\n");
printf("\t\t| [0] 退出系统 |\n");
printf("\t\t| [1] 创建通讯录 |\n");
printf("\t\t| [2] 查询通讯录 |\n");
printf("\t\t| [3] 修改通讯录 |\n");
printf("\t\t| [4] 删除通讯录 |\n");
printf("\t\t| [5] 按姓名排序 |\n");
printf("\t\t| [6] 显示通讯录 |\n");
printf("\t\t|---------------------------------------------------|\n");
printf("\t\t\t请输入功能选项(0-6):");
}
void main()
{
struct linkman *pt = NULL;
int n;// n为定义输入数字
while (1)
{
menu();
scanf("%d", &n);
fflush(stdin);
switch (n)
{
case 1:
{
pt = create();
show(pt);
} break;
case 2:
{
serachLink(pt);
} break;
case 3:
{
changeLinkman(pt);
show(pt);
} break;
case 4:
{
pt = deleNode(pt);
show(pt);
} break;
case 5:
{
pt = paixu(pt);
} break;
case 6:
{
show(pt);
} break;
case 0:
printf("谢谢使用,您已退出当前系统!\n\n");
break;
default:
printf("您输入的选项有误,没有此功能!请查证后重新操作!!\n");
break;
}
if (n == 0)
{
break;
}
}
}
本人实测代码可行。比较简单利用结构体和链表进行操作。如有不完善之处还请大家指正。