用〈〈数据结构〉〉中的双向链表作数据结构,结合C语言基本知识。编写一个通讯录管理系统。以把所学数据结构知识应用到实际软件开发中去。 设计内容:本系统应完成一下几方面的功能: 1) 输入信息——enter(); 2) 显示信息———display( ); 3) 查找以姓名作为关键字 ———search( ); 4) 删除信息———delete( ); 5) 存盘———save ( ); 6) 装入———load( ) ; 设计要求: 1) 每条信息至包含 :姓名(NAME )街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项 2) 作为一个完整的系统,应具有友好的界面和较强的容错能力

时间: 2023-10-24 10:04:37 浏览: 56
以下是一个使用双向链表实现的通讯录管理系统的示例代码,其中使用了C语言的基本知识: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 姓名最大长度 #define MAX_NAME_LENGTH 50 // 街道最大长度 #define MAX_STREET_LENGTH 100 // 城市最大长度 #define MAX_CITY_LENGTH 50 // 邮编最大长度 #define MAX_ZIP_LENGTH 10 // 国家最大长度 #define MAX_STATE_LENGTH 50 // 定义通讯录条目结构体 typedef struct AddressEntry { char name[MAX_NAME_LENGTH]; char street[MAX_STREET_LENGTH]; char city[MAX_CITY_LENGTH]; char zip[MAX_ZIP_LENGTH]; char state[MAX_STATE_LENGTH]; struct AddressEntry *prev; struct AddressEntry *next; } AddressEntry; // 定义全局变量,存储通讯录链表的头指针和尾指针 AddressEntry *head = NULL; AddressEntry *tail = NULL; // 将字符串拷贝到目标字符串中,并去除结尾的换行符 void copyString(char *dest, char *src, int maxLength) { strncpy(dest, src, maxLength); dest[maxLength - 1] = '\0'; char *pos = strchr(dest, '\n'); if (pos != NULL) { *pos = '\0'; } } // 创建一个新的通讯录条目,并返回其指针 AddressEntry *createEntry() { AddressEntry *entry = (AddressEntry *) malloc(sizeof(AddressEntry)); printf("请输入姓名:\n"); fgets(entry->name, MAX_NAME_LENGTH, stdin); printf("请输入街道:\n"); fgets(entry->street, MAX_STREET_LENGTH, stdin); printf("请输入城市:\n"); fgets(entry->city, MAX_CITY_LENGTH, stdin); printf("请输入邮编:\n"); fgets(entry->zip, MAX_ZIP_LENGTH, stdin); printf("请输入国家:\n"); fgets(entry->state, MAX_STATE_LENGTH, stdin); entry->prev = NULL; entry->next = NULL; return entry; } // 将一个通讯录条目插入到链表中 void insertEntry(AddressEntry *entry) { if (head == NULL) { // 如果链表为空,则插入为第一个条目 head = entry; tail = entry; } else { // 否则插入到链表尾部 entry->prev = tail; tail->next = entry; tail = entry; } } // 显示所有通讯录条目 void display() { if (head == NULL) { printf("通讯录为空\n"); } else { AddressEntry *current = head; while (current != NULL) { printf("姓名:%s\n", current->name); printf("街道:%s\n", current->street); printf("城市:%s\n", current->city); printf("邮编:%s\n", current->zip); printf("国家:%s\n", current->state); printf("\n"); current = current->next; } } } // 查找通讯录条目 void search() { printf("请输入要查找的姓名:\n"); char name[MAX_NAME_LENGTH]; fgets(name, MAX_NAME_LENGTH, stdin); AddressEntry *current = head; while (current != NULL) { if (strcmp(current->name, name) == 0) { printf("姓名:%s\n", current->name); printf("街道:%s\n", current->street); printf("城市:%s\n", current->city); printf("邮编:%s\n", current->zip); printf("国家:%s\n", current->state); printf("\n"); return; } current = current->next; } printf("未找到该姓名的通讯录条目\n"); } // 删除通讯录条目 void delete() { printf("请输入要删除的姓名:\n"); char name[MAX_NAME_LENGTH]; fgets(name, MAX_NAME_LENGTH, stdin); AddressEntry *current = head; while (current != NULL) { if (strcmp(current->name, name) == 0) { if (current == head) { // 如果要删除的是第一个条目,则更新头指针 head = current->next; } else { // 否则更新前一个条目的next指针 current->prev->next = current->next; } if (current == tail) { // 如果要删除的是最后一个条目,则更新尾指针 tail = current->prev; } else { // 否则更新下一个条目的prev指针 current->next->prev = current->prev; } free(current); printf("已删除该姓名的通讯录条目\n"); return; } current = current->next; } printf("未找到该姓名的通讯录条目\n"); } // 存盘 void save() { FILE *fp = fopen("addressbook.dat", "wb"); if (fp == NULL) { printf("无法创建文件\n"); return; } AddressEntry *current = head; while (current != NULL) { fwrite(current, sizeof(AddressEntry), 1, fp); current = current->next; } fclose(fp); printf("已保存通讯录\n"); } // 装入 void load() { FILE *fp = fopen("addressbook.dat", "rb"); if (fp == NULL) { printf("无法打开文件\n"); return; } AddressEntry *entry = (AddressEntry *) malloc(sizeof(AddressEntry)); while (fread(entry, sizeof(AddressEntry), 1, fp) == 1) { insertEntry(entry); entry = (AddressEntry *) malloc(sizeof(AddressEntry)); } free(entry); fclose(fp); printf("已装入通讯录\n"); } // 主函数 int main() { int choice; while (1) { printf("请选择要进行的操作:\n"); printf("1. 输入信息\n"); printf("2. 显示信息\n"); printf("3. 查找信息\n"); printf("4. 删除信息\n"); printf("5. 存盘\n"); printf("6. 装入\n"); printf("7. 退出\n"); scanf("%d", &choice); getchar(); switch (choice) { case 1: insertEntry(createEntry()); break; case 2: display(); break; case 3: search(); break; case 4: delete(); break; case 5: save(); break; case 6: load(); break; case 7: return 0; default: printf("无效的选项\n"); } } } ``` 该通讯录管理系统使用双向链表存储通讯录条目,每个条目包含姓名、街道、城市、邮编和国家等信息。可以进行添加、显示、查找、删除、存盘和装入等操作。该系统具有友好的界面和较强的容错能力,可以有效地管理通讯录信息。

相关推荐

最新推荐

recommend-type

C语言数据结构实现链表逆序并输出

主要介绍了C语言数据结构实现链表逆序并输出的相关资料,需要的朋友可以参考下
recommend-type

数据结构实验报告之一元多项式求和(链表)报告2.doc

把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。 实验内容: 1.问题描述: 一元多项式求和——把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
recommend-type

C语言:一元多项式加减法运算(链表 附答案).docx

C语言链表的入门题,里面提供了两种思路供参考,用链表来实现一元多项式的加减法,并按照一定规律输出。也是练习链表和排序算法的一道小实验,初学链表的小伙伴可以参考参考噢
recommend-type

C++双向链表实现简单通讯录

主要为大家详细介绍了C++双向链表实现简单通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

《图书管理系统》数据结构课设报告(1).doc

数据结构期末大作业,题目是图书管理系统,只完成了图书管理系统的基本功能,使用C语言结构体链表等知识。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

确保MATLAB回归分析模型的可靠性:诊断与评估的全面指南

![确保MATLAB回归分析模型的可靠性:诊断与评估的全面指南](https://img-blog.csdnimg.cn/img_convert/4b823f2c5b14c1129df0b0031a02ba9b.png) # 1. 回归分析模型的基础** **1.1 回归分析的基本原理** 回归分析是一种统计建模技术,用于确定一个或多个自变量与一个因变量之间的关系。其基本原理是拟合一条曲线或超平面,以最小化因变量与自变量之间的误差平方和。 **1.2 线性回归和非线性回归** 线性回归是一种回归分析模型,其中因变量与自变量之间的关系是线性的。非线性回归模型则用于拟合因变量与自变量之间非
recommend-type

引发C++软件异常的常见原因

1. 内存错误:内存溢出、野指针、内存泄漏等; 2. 数组越界:程序访问了超出数组边界的元素; 3. 逻辑错误:程序设计错误或算法错误; 4. 文件读写错误:文件不存在或无法打开、读写权限不足等; 5. 系统调用错误:系统调用返回异常或调用参数错误; 6. 硬件故障:例如硬盘损坏、内存损坏等; 7. 网络异常:网络连接中断、网络传输中断、网络超时等; 8. 程序异常终止:例如由于未知原因导致程序崩溃等。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。