各位小伙伴们好!你们今天是否在编写代码呢?
今天我们要一起探讨的是经典的管理系统项目之一:通讯录管理系统!让我们一同来了解一下吧!
本次项目涉及知识点: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语言和链表等知识的理解。如果有任何疑问,记得及时寻求帮助。祝大家编程愉快!