C/C++通讯录管理系统源码,链表实现,助你事半功倍!

各位小伙伴们好!你们今天是否在编写代码呢?

今天我们要一起探讨的是经典的管理系统项目之一:通讯录管理系统!让我们一同来了解一下吧!

本次项目涉及知识点:C语言、链表

我们的目标是完成一个通讯录管理系统,具体要求如下:

1. 建立通讯录信息,每条信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等内容。

2. 能够实现添加、删除和修改通讯录信息的功能。

3. 提供不同方式的查询功能,例如按照姓名、年龄、电话等进行查询。

4. 将通讯录信息保存在文件中,确保数据的持久性。

5. 能够以表格的形式输出通讯录信息,便于查看。

6. 最终要能够顺利退出程序。

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

typedef struct
{
	char num[6];   // 将编号数组大小修改为6,以容纳字符串结尾的'\0'
	char name[10]; // 将姓名数组大小修改为10,以容纳字符串结尾的'\0'
	char sex[4];   // 将性别数组大小修改为4,以容纳字符串结尾的'\0'
	char phone[14]; // 将电话数组大小修改为14,以容纳字符串结尾的'\0'
	char addr[32]; // 将地址数组大小修改为32,以容纳字符串结尾的'\0'
} DataType;

typedef struct node
{
	DataType data;
	struct node* next;
} ListNode;

typedef ListNode* LinkList;

void CreateList(LinkList* L, int m)
{
	int i;
	LinkList s, r;
	*L = (LinkList)malloc(sizeof(ListNode));学习交流群:558970390
	(*L)->next = NULL;
	r = *L;

	for (i = 0; i < m; i++)
	{
		s = (LinkList)malloc(sizeof(ListNode));
		printf("输入第%d位编号:", i + 1);
		scanf("%5s", s->data.num); // 读取最多5个字符到编号数组
		printf("\n输入姓名:");
		scanf("%9s", s->data.name); // 读取最多9个字符到姓名数组
		printf("\n输入性别:");
		scanf("%3s", s->data.sex); // 读取最多3个字符到性别数组
		printf("\n输入电话:");
		scanf("%13s", s->data.phone); // 读取最多13个字符到电话数组
		printf("\n输入地址:");
		scanf("%31s", s->data.addr); // 读取最多31个字符到地址数组
		s->next = NULL;
		r->next = s;
		r = s;
	}
}

int ListLength(LinkList L)
{
	LinkList p;
	int length = 0;
	p = L->next;
	while (p)
	{
		length++;
		p = p->next;
	}
	return length;
}

int ListInsert(LinkList* L, int i, DataType d)
{
	LinkList p, s;
	int length;
	length = ListLength(*L);
	p = (*L)->next;
	int j = 1;
	if (!p || i > length + 1)
		return 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	s = (LinkList)malloc(sizeof(ListNode));
	s->data = d;
	s->next = p->next;
	p->next = s;
	return 1;
}

int ListDelete(LinkList* L, int i)
{
	LinkList p, q;
	p = *L;
	int j = 0;
	int length;
	length = ListLength(*L);
	if (!p || i > length)
		return 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	q = p->next;
	printf("\n被删除的人员信息为:\n");
	printf("\n编号:%s  姓名:%s  性别:%s  电话:%s 地址:%s", q->data.num, q->data.name, q->data.sex, q->data.phone, q->data.addr);
	p->next = q->next;
	free(q);
	return 1;
}

int GetElem(LinkList L, int i, DataType* d)
{
	LinkList p;
	p = L->next;
	int j = 1;
	int length;
	length = ListLength(L);
	if (!p || i > length)
		return 0;
	while (j < i)
	{
		p = p->next;
		j++;
	}
	*d = p->data;
	return 1;
}

void print(LinkList L)
{
	LinkList p;
	p = L->next;
	while (p)
	{
		printf("\n编号:%s  姓名:%s  性别:%s  电话:%s 地址:%s", p->data.num, p->data.name, p->data.sex, p->data.phone, p->data.addr);
		p = p->next;
	}
}

void menu()
{
	printf("--------------------------------------------1.通讯录链表的建立----------------------------------------------------------");
	printf("\n--------------------------------------------2.通讯者节点的插入----------------------------------------------------------");
	printf("\n--------------------------------------------3.通讯者节点的查询----------------------------------------------------------");
	printf("\n--------------------------------------------4.通讯者节点的删除----------------------------------------------------------");
	printf("\n--------------------------------------------5.通讯录链表的输出----------------------------------------------------------");
	printf("\n--------------------------------------------0.退出管理系统--------------------------------------------------------------");
}

int main()
{
	LinkList L;
	DataType d, d1;
	int m, location, length, choose;
	menu();
p:
	printf("\n请输入你的选项:");
	scanf("%d", &choose);

	switch (choose)
	{
	case 1:
		printf("请输入通讯录人数:");
		scanf("%d", &m);
		CreateList(&L, m);
		goto p;
	case 2:
		printf("\n输入要插入的位置:");
		scanf("%d", &location);
		printf("输入插入人员的编号:");
		scanf("%5s", d.num);
		printf("\n输入姓名:");
		scanf("%9s", d.name);
		printf("\n输入性别:");
		scanf("%3s", d.sex);
		printf("\n输入电话:");
		scanf("%13s", d.phone);
		printf("\n输入地址:");
		scanf("%31s", d.addr);
		ListInsert(&L, location, d);
		goto p;
	case 3:
		printf("\n请输入查询位置");
		scanf("%d", &location);
		GetElem(L, location, &d);
		printf("查询到的人员信息为:\n");
		printf("\n编号:%s  姓名:%s  性别:%s  电话:%s 地址:%s", d.num, d.name, d.sex, d.phone, d.addr);
		goto p;
	case 4:
		printf("\n输入要删除的位置:");
		scanf("%d", &location);
		ListDelete(&L, location);
		goto p;
	case 5:
		print(L);
		goto p;
	case 0:
		printf("系统已退出。");
		break;
	default:
		printf("输入错误,请重新输入");
		goto p;
	}

	return 0;
}

通过以上要求,我们将完成一个功能完备的通讯录管理系统。大家不妨抓紧时间尝试一下!如果在学习C语言或C++过程中遇到问题,欢迎加入粉丝群,与其他小伙伴一同交流并提问。这个群同时也是获取更多源码素材的渠道哦!

粉丝群&(也是更多源码素材获取通道):「链接」

希望大家能够充分体验通讯录管理系统的设计与开发,加深对C语言和链表等知识的理解。如果有任何疑问,记得及时寻求帮助。祝大家编程愉快!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真的不会C语言o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值