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

时间: 2023-10-22 22:07:51 浏览: 120
信息; 2) 使用双向链表作为通讯录的数据结构,能够进行信息的增删改查等操作; 3) 输入信息时,要进行合法性校验,如姓名不能为空,邮编必须为数字等; 4) 显示信息时,可以按照姓名、城市、国家等关键字进行排序显示; 5) 查找信息时,可以根据姓名进行精确查找,也可以根据城市、国家等关键字进行模糊查找; 6) 删除信息时,可以根据姓名进行精确删除,也可以根据城市、国家等关键字进行批量删除; 7) 存盘和装入功能可以将通讯录数据保存到文件中,方便下一次使用时加载数据。 以上就是一个通讯录管理系统的基本设计要求,可以根据需要进行扩展和改进。
相关问题

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

根据你的描述,这个通讯录管理系统基于双向链表数据结构,提供了输入信息、显示信息、查找、删除、存盘和装入等功能。这个系统的核心是双向链表,每个节点包含了姓名、街道、城市、邮编和国家等信息。通过这个系统,用户可以方便地管理通讯录信息。 具体功能的实现方式如下: 1. 输入信息:用户可以通过enter()函数输入新的通讯录信息。这个函数会创建一个新的节点,并将用户输入的姓名、街道、城市、邮编和国家等信息保存到节点中。这个节点会被加入到双向链表中。 2. 显示信息:用户可以通过display()函数显示当前的所有通讯录信息。这个函数会遍历整个双向链表,并将每个节点的信息依次输出到屏幕上。 3. 查找:用户可以通过search()函数根据姓名查找对应的通讯录信息。这个函数会遍历整个双向链表,找到匹配的节点,并将其信息输出到屏幕上。如果找不到匹配的节点,函数会给出提示信息。 4. 删除信息:用户可以通过delete()函数删除指定的通讯录信息。这个函数会找到匹配的节点,并将其从双向链表中删除。 5. 存盘:用户可以通过save()函数将当前的通讯录信息保存到文件中。这个函数会将整个双向链表的信息写入到文件中。 6. 装入:用户可以通过load()函数从文件中加载之前保存的通讯录信息。这个函数会读取文件中的信息,并将其转换为双向链表的形式。 需要注意的是,这个系统的界面应该友好,容错能力较强。对于用户输入的不合法信息,应该给出相应的提示信息,避免系统崩溃或数据混乱。同时,这个系统应该支持较大量的数据存储,并保证数据的安全性和完整性。 总之,这个通讯录管理系统的设计基于双向链表数据结构,并提供了多种功能,可以方便地管理通讯录信息。通过这个系统的实现,可以将所学的数据结构知识应用到实际软件开发中,提高编程能力和实践能力。

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

信息; 2) 使用双向链表作为通讯录的数据结构,能够进行信息的增删改查等操作; 3) 输入信息时,要进行合法性校验,如姓名不能为空,邮编必须为数字等; 4) 显示信息时,可以按照姓名、城市、国家等关键字进行排序显示; 5) 查找信息时,可以根据姓名进行精确查找,也可以根据城市、国家等关键字进行模糊查找; 6) 删除信息时,可以根据姓名进行精确删除,也可以根据城市、国家等关键字进行批量删除; 7) 存盘和装入功能可以将通讯录数据保存到文件中,方便下一次使用时加载数据。 以下是通讯录管理系统的C语言实现代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 联系人结构体 typedef struct Contact { char name[50]; char street[50]; char city[50]; char zip[10]; char state[50]; struct Contact *prev; struct Contact *next; } Contact; // 全局变量,指向双向链表的头节点和尾节点 Contact *head = NULL; Contact *tail = NULL; // 函数声明 void enter(); void display(); void search(char *keyword); void delete(char *keyword); void save(); void load(); // 根据姓名比较两个联系人的大小 int compare_name(Contact *c1, Contact *c2) { return strcmp(c1->name, c2->name); } // 根据城市比较两个联系人的大小 int compare_city(Contact *c1, Contact *c2) { return strcmp(c1->city, c2->city); } // 根据国家比较两个联系人的大小 int compare_state(Contact *c1, Contact *c2) { return strcmp(c1->state, c2->state); } // 插入联系人到双向链表中 void insert(Contact *c) { if (head == NULL) { // 如果链表为空 head = tail = c; c->prev = c->next = NULL; } else { // 如果链表不为空 Contact *p = head; while (p != NULL && compare_name(p, c) < 0) { p = p->next; } if (p == NULL) { // 插入到链表末尾 c->prev = tail; c->next = NULL; tail->next = c; tail = c; } else { // 插入到链表中间 if (p->prev == NULL) { // 插入到链表头 c->prev = NULL; c->next = head; head->prev = c; head = c; } else { // 插入到链表中间 c->prev = p->prev; c->next = p; p->prev->next = c; p->prev = c; } } } } // 输入联系人信息 void enter() { Contact *c = (Contact *)malloc(sizeof(Contact)); printf("Enter name: "); fgets(c->name, 50, stdin); c->name[strcspn(c->name, "\n")] = 0; // 去掉末尾的换行符 printf("Enter street: "); fgets(c->street, 50, stdin); c->street[strcspn(c->street, "\n")] = 0; // 去掉末尾的换行符 printf("Enter city: "); fgets(c->city, 50, stdin); c->city[strcspn(c->city, "\n")] = 0; // 去掉末尾的换行符 printf("Enter zip: "); fgets(c->zip, 10, stdin); c->zip[strcspn(c->zip, "\n")] = 0; // 去掉末尾的换行符 printf("Enter state: "); fgets(c->state, 50, stdin); c->state[strcspn(c->state, "\n")] = 0; // 去掉末尾的换行符 insert(c); // 将联系人插入到双向链表中 printf("Contact has been added.\n"); } // 显示联系人信息 void display() { printf("%-20s %-20s %-20s %-10s %-20s\n", "Name", "Street", "City", "Zip", "State"); Contact *p = head; while (p != NULL) { printf("%-20s %-20s %-20s %-10s %-20s\n", p->name, p->street, p->city, p->zip, p->state); p = p->next; } } // 查找联系人信息 void search(char *keyword) { Contact *p = head; while (p != NULL) { if (strstr(p->name, keyword) != NULL || strstr(p->city, keyword) != NULL || strstr(p->state, keyword) != NULL) { printf("%-20s %-20s %-20s %-10s %-20s\n", p->name, p->street, p->city, p->zip, p->state); } p = p->next; } } // 删除联系人信息 void delete(char *keyword) { Contact *p = head; while (p != NULL) { Contact *next = p->next; if (strstr(p->name, keyword) != NULL || strstr(p->city, keyword) != NULL || strstr(p->state, keyword) != NULL) { if (p->prev == NULL) { // 删除头节点 head = p->next; if (head != NULL) { head->prev = NULL; } else { // 链表为空 tail = NULL; } } else if (p->next == NULL) { // 删除尾节点 tail = p->prev; tail->next = NULL; } else { // 删除中间节点 p->prev->next = p->next; p->next->prev = p->prev; } free(p); } p = next; } printf("Contact has been deleted.\n"); } // 存储联系人信息到文件中 void save() { FILE *fp = fopen("contacts.txt", "w"); Contact *p = head; while (p != NULL) { fprintf(fp, "%s,%s,%s,%s,%s\n", p->name, p->street, p->city, p->zip, p->state); p = p->next; } fclose(fp); printf("Contacts have been saved to file.\n"); } // 从文件中加载联系人信息 void load() { FILE *fp = fopen("contacts.txt", "r"); if (fp == NULL) { // 如果文件不存在,则创建一个空文件 fp = fopen("contacts.txt", "w"); fclose(fp); return; } char line[256]; while (fgets(line, 256, fp) != NULL) { Contact *c = (Contact *)malloc(sizeof(Contact)); char *token = strtok(line, ","); strcpy(c->name, token); token = strtok(NULL, ","); strcpy(c->street, token); token = strtok(NULL, ","); strcpy(c->city, token); token = strtok(NULL, ","); strcpy(c->zip, token); token = strtok(NULL, ","); strcpy(c->state, token); insert(c); // 将联系人插入到双向链表中 } fclose(fp); printf("Contacts have been loaded from file.\n"); } int main() { int choice; char keyword[50]; do { printf("Menu:\n"); printf("1. Enter a contact\n"); printf("2. Display all contacts\n"); printf("3. Search contacts\n"); printf("4. Delete contacts\n"); printf("5. Save contacts to file\n"); printf("6. Load contacts from file\n"); printf("0. Quit\n"); printf("Enter your choice: "); scanf("%d", &choice); getchar(); // 读取多余的换行符 switch (choice) { case 1: enter(); break; case 2: display(); break; case 3: printf("Enter keyword: "); fgets(keyword, 50, stdin); keyword[strcspn(keyword, "\n")] = 0; // 去掉末尾的换行符 search(keyword); break; case 4: printf("Enter keyword: "); fgets(keyword, 50, stdin); keyword[strcspn(keyword, "\n")] = 0; // 去掉末尾的换行符 delete(keyword); break; case 5: save(); break; case 6: load(); break; case 0: printf("Goodbye!\n"); break; default: printf("Invalid choice.\n"); break; } } while (choice != 0); return 0; } ``` 这个通讯录管理系统具有基本的增删改查功能,也实现了存盘和装入功能,可以将联系人信息保存到文件中,方便下一次使用时加载数据。
阅读全文

相关推荐

大家在看

recommend-type

Handbook of PI and PID Controller Tuning Rules 3e

The vast majority of automatic controllers used to compensate industrial processes are PI or PID type. This book comprehensively compiles, using a unified notation, tuning rules for these controllers proposed from 1935 to 2008. The tuning rules are carefully categorized and application information about each rule is given. This book discusses controller architecture and process modeling issues, as well as the performance and robustness of loops compensated with PI or PID controllers. This unique publication brings together in an easy-to-use format material previously published in a large number of papers and books. This wholly revised third edition extends the presentation of PI and PID controller tuning rules, for single variable processes with time delays, to include additional rules compiled since the second edition was published in 2006.
recommend-type

hanlp 自然语言处理入门

hanlp 自然语言处理入门 资料全
recommend-type

多无人机和实时局部轨迹规划最佳防撞算法附matlab代码.zip

1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士等教研学习使用 5.博客介绍:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可si信
recommend-type

Code-Generation-ARM-Compiler-V5.05update

最新版keil 编译器无法通过之前的编译 一定要用我这个编译器 编译之前的工程才有用
recommend-type

《STM32开发指南》第四十一章 摄像头实验

使用 STM32 驱动 ALIENTEK OV7670 摄像头模块,实现摄像头功能。

最新推荐

recommend-type

学生通讯录管理系统-数据结构课程设计.doc

综上所述,学生通讯录管理系统是一个结合数据结构理论与实践的项目,涉及到多种数据结构和算法的应用,以及用户界面设计和系统测试等多个方面,对于计算机科学的学习者来说,是一个很好的综合训练。
recommend-type

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

在C语言中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。链表的操作多种多样,其中链表的逆序输出是一项基础而重要的操作。本文将详细讲解如何在C语言中实现链表的...
recommend-type

学生成绩管理系统(数据结构)实验报告.docx

《学生成绩管理系统》是一个基于C语言开发的实践项目,主要目标是实现对学生成绩的高效管理和分析。本系统采用数据结构的概念,包括数组、链表等数据结构,以实现对学生成绩数据的存储、操作和检索。以下是该系统的...
recommend-type

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

实验报告的主题是“一元多项式求和”,主要探讨如何使用链表数据结构来实现这一计算过程。在数据结构中,链表是一种重要的抽象数据类型,它可以动态地存储具有相同类型的元素,尤其适合处理无序数据或需要频繁插入和...
recommend-type

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

在链表中,我们为每个单项式创建一个节点,包含两个数据项:指数和系数,以及一个指针用于链接下一个节点。 **链表结构设计:** - 定义一个结构体`duoxiangshi`,其中包含指数`zhishu`、系数`xishu`和指向下一个...
recommend-type

Pokedex: 探索JS开发的口袋妖怪应用程序

资源摘要信息:"Pokedex是一个基于JavaScript的应用程序,主要功能是收集和展示口袋妖怪的相关信息。该应用程序是用JavaScript语言开发的,是一种运行在浏览器端的动态网页应用程序,可以向用户提供口袋妖怪的各种数据,例如名称、分类、属性等。" 首先,我们需要明确JavaScript的作用。JavaScript是一种高级编程语言,是网页交互的核心,它可以在用户的浏览器中运行,实现各种动态效果。JavaScript的应用非常广泛,包括网页设计、游戏开发、移动应用开发等,它能够处理用户输入,更新网页内容,控制多媒体,动画以及各种数据的交互。 在这个Pokedex的应用中,JavaScript被用来构建一个口袋妖怪信息的数据库和前端界面。这涉及到前端开发的多个方面,包括但不限于: 1. DOM操作:JavaScript可以用来操控文档对象模型(DOM),通过DOM,JavaScript可以读取和修改网页内容。在Pokedex应用中,当用户点击一个口袋妖怪,JavaScript将利用DOM来更新页面,展示该口袋妖怪的详细信息。 2. 事件处理:应用程序需要响应用户的交互,比如点击按钮或链接。JavaScript可以绑定事件处理器来响应这些动作,从而实现更丰富的用户体验。 3. AJAX交互:Pokedex应用程序可能需要与服务器进行异步数据交换,而不重新加载页面。AJAX(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下,进行数据交换的技术。JavaScript在这里扮演了发送请求、处理响应以及更新页面内容的角色。 4. JSON数据格式:由于JavaScript有内置的JSON对象,它可以非常方便地处理JSON数据格式。在Pokedex应用中,从服务器获取的数据很可能是JSON格式的口袋妖怪信息,JavaScript可以将其解析为JavaScript对象,并在应用中使用。 5. 动态用户界面:JavaScript可以用来创建动态用户界面,如弹出窗口、下拉菜单、滑动效果等,为用户提供更加丰富的交互体验。 6. 数据存储:JavaScript可以使用Web Storage API(包括localStorage和sessionStorage)在用户的浏览器上存储数据。这样,即使用户关闭浏览器或页面,数据也可以被保留,这对于用户体验来说是非常重要的,尤其是对于一个像Pokedex这样的应用程序,用户可能希望保存他们查询过的口袋妖怪信息。 此外,该应用程序被标记为“JavaScript”,这意味着它可能使用了JavaScript的最新特性或者流行的库和框架,例如React、Vue或Angular。这些现代的JavaScript框架能够使前端开发更加高效、模块化和易于维护。例如,React允许开发者构建可复用的UI组件,Vue则提供了数据驱动和组件化的编程方式,而Angular则是一个全面的前端框架,提供了模板、依赖注入、客户端路由等功能。 在文件名称列表中提到了"Pokedex-main",这很可能是应用程序的主文件或者项目的根目录名称。在这种情况下,主文件可能包含程序的入口点,即整个JavaScript应用程序开始执行的地方,它通常会包含对其他JavaScript文件的引用,以及初始化应用程序的代码。 综上所述,Pokedex作为一个JavaScript应用程序,涉及了前端开发的多个关键技术和概念。通过JavaScript,开发者能够实现一个功能丰富、响应用户交互、动态更新内容的应用程序,为用户提供口袋妖怪的详细信息和互动体验。
recommend-type

【提升R-Studio恢复效率】:RAID 5数据恢复的高级技巧与成功率

![【提升R-Studio恢复效率】:RAID 5数据恢复的高级技巧与成功率](https://www.primearraystorage.com/assets/raid-animation/raid-level-3.png) # 摘要 RAID 5作为一种广泛应用于数据存储的冗余阵列技术,能够提供较好的数据保护和性能平衡。本文首先概述了RAID 5数据恢复的重要性,随后介绍了RAID 5的基础理论,包括其工作原理、故障类型及数据恢复前的准备工作。接着,文章深入探讨了提升RAID 5数据恢复成功率的高级技巧,涵盖了硬件级别和软件工具的应用,以及文件系统结构和数据一致性检查。通过实际案例分析,
recommend-type

帮我写一段Python代码:sin波生成,设定rate,fin,size,幅值

当然可以。在Python中,我们可以使用`numpy`库来创建正弦波,并通过`tqdm`库添加进度条。下面是一个简单的示例代码,它会生成指定频率(rate)、持续时间(fin),以及样本大小(size)的正弦波,幅度可以自定义: ```python import numpy as np from tqdm import trange # 定义函数生成sin波 def generate_sine_wave(rate=44100, fin=5, size=None, amplitude=1): # 检查参数是否合理 if size is None: size =
recommend-type

Laravel实用工具包:laravel-helpers概述

资源摘要信息:"Laravel开发-laravel-helpers 是一个针对Laravel框架开发者的实用程序包,它提供了许多核心功能的便捷访问器(getters)和修改器(setters)。这个包的设计初衷是为了提高开发效率,使得开发者能够快速地使用Laravel框架中常见的一些操作,而无需重复编写相同的代码。使用此包可以简化代码量,减少出错的几率,并且当开发者没有提供自定义实例时,它将自动回退到Laravel的原生外观,确保了功能的稳定性和可用性。" 知识点: 1. Laravel框架概述: Laravel是一个基于PHP的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。它旨在通过提供一套丰富的工具来快速开发Web应用程序,同时保持代码的简洁和优雅。Laravel的特性包括路由、会话管理、缓存、模板引擎、数据库迁移等。 2. Laravel核心包: Laravel的核心包是指那些构成框架基础的库和组件。它们包括但不限于路由(Routing)、请求(Request)、响应(Response)、视图(View)、数据库(Database)、验证(Validation)等。这些核心包提供了基础功能,并且可以被开发者在项目中广泛地使用。 3. Laravel的getters和setters: 在面向对象编程(OOP)中,getters和setters是指用来获取和设置对象属性值的方法。在Laravel中,这些通常指的是辅助函数或者服务容器中注册的方法,用于获取或设置框架内部的一些配置信息和对象实例。 4. Laravel外观模式: 外观(Facade)模式是软件工程中常用的封装技术,它为复杂的子系统提供一个简化的接口。在Laravel框架中,外观模式广泛应用于其核心类库,使得开发者可以通过简洁的类方法调用来执行复杂的操作。 5. 使用laravel-helpers的优势: laravel-helpers包作为一个辅助工具包,它将常见的操作封装成易于使用的函数,使开发者在编写Laravel应用时更加便捷。它省去了编写重复代码的麻烦,降低了项目的复杂度,从而加快了开发进程。 6. 自定义实例和回退机制: 在laravel-helpers包中,如果开发者没有提供特定的自定义实例,该包能够自动回退到使用Laravel的原生外观。这种设计使得开发者在不牺牲框架本有功能的前提下,能够享受到额外的便利性。 7. Laravel开发实践: 在实际的开发过程中,开发者可以通过引入laravel-helpers包来简化代码的编写。例如,该包可能提供了一系列用于验证输入数据的快速方法,或者是一些处理常见任务的辅助函数,如快速生成响应、执行数据库查询、发送邮件等。 8. 开源贡献和社区支持: laravel-helpers作为一个开源包,它的维护和更新依赖于社区的贡献。开发者在使用过程中也可以参与到包的开发与改进中,为Laravel社区做出贡献,并从社区中获取帮助和反馈。 总结而言,laravel-helpers包通过提供一系列的getters和setters工具函数,极大地提升了Laravel开发的效率与便利性。它不仅遵循了Laravel的核心设计理念,还通过回退机制保证了与框架原生功能的兼容性。对于希望优化其开发流程的Laravel开发者来说,这无疑是一个宝贵的资源。
recommend-type

【R-Studio技术路径】:从RAID 5数据恢复基础到高级操作

![【R-Studio技术路径】:从RAID 5数据恢复基础到高级操作](https://www.primearraystorage.com/assets/raid-animation/raid-level-3.png) # 摘要 随着信息技术的发展,数据丢失问题日益突出,RAID 5作为常见的数据存储解决方案,其数据恢复技术显得尤为重要。本文首先介绍了RAID 5数据恢复的基础知识,然后详细解析了R-Studio软件的界面和核心功能,重点探讨了其在RAID 5数据恢复中的应用实践,包括磁盘镜像创建、数据提取、数据重组策略及一致性验证。进一步,本文还涉及了R-Studio的进阶技术,如脚本编