C-结构体+链表-实现“通讯录管理系统”

界面:基于控制台实现用户的输入和输出,主菜单界面,用 while语句实现不断执行直到用户自行选择退出。

程序流程:在main函数中实现主界面功能提示,通过调用函数,实现各个功能。使用结构体描述用户所具有的基本信息。

具体功能:

  1. 退出系统(操作人可根据需求按提示随时退出系统)
  2. 创建通讯录(包括姓名、工作单位、手机号码、电子邮箱)
  3. 查询通讯录(根据联系人姓名来查询信息)
  4. 修改通讯录(根据联系人的姓名找到要修改的联系人并进行修改)
  5. 删除通讯录(根据联系人姓名来删除对应联系人)
  6. 按姓名进行排序(根据联系人姓名对应的ASCII码值,按由小到大排序)
  7. 显示通讯录(可以把创建的联系人打印出来)

子函数划分:

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;
		}
	}
}

本人实测代码可行。比较简单利用结构体和链表进行操作。如有不完善之处还请大家指正。

通讯录管理系统 通讯录(add_book)中的联系人包含以下信息项:姓名、手机、办公电话、家庭电话、电子邮箱、所在省市、工作单位、家庭住址,群组分类(亲属、同事、同学、朋友、其他)。 Name Mobile phones Office phone Family telephone E-mail In cities Work units0 Address Group classification (relative, colleagues, friends, classmates, other). 系统的主要功能包括: 1. 输入联系人的信息,要求:至少输入10个联系人的数据,且注意数据的多样性。 2. 按姓名对联系人信息进行排序,并将排序后信息存放到一个文本文件中。 3. 添加联系人的信息,在已经存在的通讯录文件中添加若干个联系人。要求:添加后仍按联系人的姓名排序,并保存至原文件。 4. 删除联系人的信息,输入一个姓名,若通讯录中有该联系人的信息,则删除该联系人,否则输出提示信息,并提示用户选择是否继续进行删除操作。 5. 修改联系人的信息,输入一个姓名,根据具体需要修改该联系人的某一项信息,将修改后的信息重新保存到通讯录文件中,并提示用户选择是否继续进行修改操作。 6. 按不同条件对通讯录进行查询操作,输出满足条件的联系人的信息。 (1) 按姓名查询,包括精确查询(输入全名),模糊查询(输入姓); (2) 按手机号码查询,输入全部号码或号码位段(如输入130、133、139等); (3) 按群组分类查询,输入分类名称,输出该群组的全部联系人信息。 7. 输出联系人的信息Contact information,按一定格式输出信息,保证信息排列整齐美观。ContactPerson
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值