C语言实现通讯录管理系统:单链表详解
C语言实现通讯录管理系统:单链表详解
本文将使用 C 语言实现一个简单的通讯录管理系统,利用单链表来存储数据。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 50
typedef struct {
char num[5]; // 编号
char name[10]; // 姓名
char sex[7]; // 性别
char phone[15]; // 电话
char addr[30]; // 地址
} Datatype;
typedef struct node{
Datatype data;
struct node *next;
} Tx_Linklist;
Tx_Linklist *L;
/* 创建带头结点的单链表L */
Tx_Linklist* SqLset(Tx_Linklist* L) {
L = (Tx_Linklist*)malloc(sizeof(Tx_Linklist));
L->next = NULL;
return L;
}
/* 带头结点的单链表L的插入操作 -采用尾插法 */
void insert(Tx_Linklist* L) {
Tx_Linklist *p = L;
while (p->next != NULL) {
p = p->next;
}
Tx_Linklist *newNode = (Tx_Linklist*)malloc(sizeof(Tx_Linklist));
printf('请输入要插入的通讯者的编号:');
scanf('%s', newNode->data.num);
printf('请输入要插入的通讯者的姓名:');
scanf('%s', newNode->data.name);
printf('请输入要插入的通讯者的性别:');
scanf('%s', newNode->data.sex);
printf('请输入要插入的通讯者的电话:');
scanf('%s', newNode->data.phone);
printf('请输入要插入的通讯者的地址:');
scanf('%s', newNode->data.addr);
newNode->next = NULL;
p->next = newNode;
}
/* 带头结点的单链表L的删除操作,输入编号,查找后删除,并返回该数据的序号 */
int delete(Tx_Linklist* L) {
if (L->next == NULL) {
printf('通讯录为空,无法删除。\n');
return 0;
}
char num[5];
printf('请输入要删除的通讯者的编号:');
scanf('%s', num);
Tx_Linklist *p = L->next;
Tx_Linklist *pre = L;
int idx = 0;
while (p != NULL) {
if (strcmp(p->data.num, num) == 0) {
pre->next = p->next;
free(p);
return idx;
}
pre = p;
p = p->next;
idx++;
}
printf('未找到该编号的通讯者。\n');
return -1;
}
/* 带头结点的单链表L的查询,输入编号,查找后打印,并返回该数据的序号在表中的序号 */
int query(Tx_Linklist* L) {
if (L->next == NULL) {
printf('通讯录为空,无法查询。\n');
return 0;
}
char num[5];
printf('请输入要查询的通讯者的编号:');
scanf('%s', num);
Tx_Linklist *p = L->next;
int idx = 0;
while (p != NULL) {
if (strcmp(p->data.num, num) == 0) {
printf('编号:%s\n', p->data.num);
printf('姓名:%s\n', p->data.name);
printf('性别:%s\n', p->data.sex);
printf('电话:%s\n', p->data.phone);
printf('地址:%s\n', p->data.addr);
return idx;
}
p = p->next;
idx++;
}
printf('未找到该编号的通讯者。\n');
return -1;
}
/* 带头结点的单链表L的打印 */
void printData(Tx_Linklist* L) {
if (L->next == NULL) {
printf('通讯录为空,无法输出。\n');
return;
}
Tx_Linklist *p = L->next;
printf('编号\t姓名\t性别\t电话\t地址\n');
while (p != NULL) {
printf('%s\t%s\t%s\t%s\t%s\n', p->data.num, p->data.name, p->data.sex, p->data.phone, p->data.addr);
p = p->next;
}
}
/*菜单选择函数*/
int menu_select( ) {
int sn;
for( ; ; ){
scanf( '%d', &sn);
if( sn<0 || sn>5 )
printf('\n输入错误,重选0-5:\n');
else
break;
}
return sn;
}
/*主控菜单处理函数(主函数)*/
void main( ){
printf('通讯录管理系统\n');
printf('==================\n');
printf('1 通讯录表的建立\n');
printf('2 通讯者的插入\n');
printf('3 通讯者的删除\n');
printf('4 通讯者的查询\n');
printf('5 通讯录表的输出\n');
printf('0 退出管理系统\n');
printf('==================\n');
for( ; ; ){
switch( menu_select( ) ){
case 1: printf('通讯录表的建立\n');
L = SqLset(L);
break;
case 2: printf('通讯者的插入\n');
insert(L);
break;
case 3: printf('通讯者的删除\n');
printf('%d\n',delete(L));
break;
case 4: printf('通讯者的查询\n');
printf('%d\n',query(L));
break;
case 5: printf('通讯录表的输出\n');
printData(L);
break;
case 0: printf('再见\n');
exit(0);
}
}
}
代码说明
- 数据结构定义: 使用
Datatype结构体表示单个通讯录成员信息,使用Tx_Linklist结构体表示链表节点,节点中包含Datatype数据和指向下一个节点的指针。 - 函数实现: 实现了创建链表
SqLset,插入节点insert,删除节点delete,查询节点query和打印链表printData等功能函数。 - 主函数:
main函数中实现了菜单选择和调用相应功能函数的逻辑。
总结
本文使用 C 语言和单链表实现了一个简单的通讯录管理系统,演示了如何使用单链表进行数据存储、插入、删除、查询等操作。
原文地址: https://www.cveoy.top/t/topic/Sfm 著作权归作者所有。请勿转载和采集!