数据结构课程设计报告_学生通讯录管理系统_城市链表
学生通讯录管理系统数据结构课程设计代码

一、概述在当今数字化信息时代,学生通讯录管理系统已成为学校教育管理和日常生活中不可或缺的一部分。
针对校园学生的通讯录管理系统,既能方便学生之间的交流通信,也能方便管理者对学生信息进行统一管理。
本次课程设计旨在设计一个学生通讯录管理系统的数据结构与代码,实现信息的存储、查询和管理的功能。
二、系统需求分析1.系统功能需求(1) 实现学生基本信息的录入和存储,包括尊称、学号、性别、通信方式等信息;(2) 实现学生信息的查询、修改和删除功能;(3) 实现学生信息的按关键字检索功能,如按尊称、学号、班级等进行检索;(4) 实现学生通讯录的导出和导入功能,方便数据备份和迁移;(5) 实现用户权限管理功能,包括管理员和普通用户权限的划分。
2.系统性能需求(1) 系统应具有良好的用户界面设计,操作简单、友好;(2) 系统应具有较高的数据安全性,保护学生个人信息不被泄露;(3) 系统应具有较高的稳定性和可靠性,能够长时间稳定运行;(4) 系统应具有较高的查询和数据处理效率,能够快速响应用户请求。
三、系统设计1. 数据结构设计(1) 学生信息采用结构体进行存储,包括尊称、学号、性别、通信方式等字段;(2) 学生通讯录采用链表结构进行存储,方便动态添加、删除和查询操作;(3) 用户权限采用权限控制字段进行划分,保证不同用户有不同的操作权限。
2. 系统架构设计(1) 采用C语言进行开发,具有较高的执行效率和跨评台性;(2) 采用面向对象编程思想进行系统的模块化设计,方便系统维护和扩展;(3) 采用简洁的用户界面设计,操作逻辑清晰,用户体验良好。
四、代码实现以下为部分代码示例,展示系统核心功能的实现:1. 学生信息的录入和存储typedef struct Student {char name[20];int id;char gender[10];char contact[20];} Student;// 使用链表存储学生信息typedef struct Node {Student data;struct Node *next;} Node;2. 学生信息的查询、修改和删除// 查询学生信息void searchStudent(Node *head, char *name) {Node *p = head->next;while (p != NULL) {if (strcmp(p->, name) == 0) {// 输出学生信息printf("Name: s, ID: d, Gender:s, Contact: s\n", p->, p->data.id, p->data.gender, p->data.contact); return;}p = p->next;}printf("The student is not found\n");}// 修改学生信息void modifyStudent(Node *head, char *name, int id, char *gender, char *contact) {Node *p = head->next;while (p != NULL) {if (strcmp(p->, name) == 0) {// 修改学生信息strcpy(p->, name);p->data.id = id;strcpy(p->data.gender, gender);strcpy(p->data.contact, contact);return;}p = p->next;}printf("The student is not found\n");}// 删除学生信息void deleteStudent(Node *head, char *name) {Node *p = head;while (p->next != NULL) {if (strcmp(p->next->, name) == 0) { Node *temp = p->next;p->next = p->next->next;free(temp);return;}p = p->next;}printf("The student is not found\n");}3. 用户权限管理int m本人n() {// 管理员权限if (isAdmin) {// 管理员操作} else {// 普通用户操作}return 0;}五、系统测试与优化1. 系统测试(1) 对系统进行功能测试,包括学生信息录入、查询、修改、删除等功能的测试;(2) 对系统进行性能测试,测试系统的稳定性和数据处理效率。
数据结构课程设计报告---通讯录

数据结构课程设计报告---通讯录## 一、项目背景随着信息科技的发展,现代社会通讯录的应用越来越普遍,满足了人们信息的获取和管理的需求。
本项目的设计目的在于使用面向对象的程序思想,以面向对象的方式它来实现对通讯录信息的管理,进而提高信息的管理效率,提升信息的可靠性和安全性,最终达到为社会实施科学管理的目的。
## 二、系统需求1. 界面美观、格式明确,有良好的友好提示。
2. 系统稳定性强,能承受短时间的高并发量使用。
3. 提供友好的系统操作界面,对用户操作进行一定的约束,方便用户操作。
4.提供有效的联系人信息管理功能,能够实现增删改查等操作。
5.支持联系人信息备份和恢复,以及密码设置。
6.能够防止任何人未经授权而访问系统,或者磁盘信息的泄露。
此系统的设计主要分为三大部分,即界面层、业务逻辑层和数据存储层。
界面层通过展示信息给用户,实现数据的输入及输出;业务逻辑层主要处理用户请求,实现对数据的操作;数据存储层通过文件存储数据,实现对联系人信息的永久保存。
本项目采用C++语言,以链表数据结构为基础,将用户的联系人存储在链表中,充分利用其动态性,实现联系人的增删改查操作.同时,为了提供更进一步的使用,增加了密码功能,对未授权访问进行防止,以及数据备份和恢复功能。
## 四、功能实现1. 界面设计:首先,根据系统所需要的功能,采用控制台方式,以文字提示形式,配以整齐美观的各项参数和信息,实现各项功能。
2. 加密控制:本系统实现授权登陆加密功能,使系统对未经授权的用户隐藏信息,以确保系统的安全性。
3. 测试功能:功能的测试旨在确保程序的完整性和正确性。
4. 管理功能:本系统实现联系人信息的增删改查操作,在这几项功能的实现过程中,使用链表数据结构,更好的实现程序的功能。
5. 修改密码功能:此功能实现用户可以修改自己的密码,以确保用户自己可以比较安全的使用系统,不会受到他人的侵犯。
6. 加载和存储数据:通过使用文件存储,实现数据的存储和读取,以及备份功能,实现对数据永久保存。
数据结构课程设计报告学生信息管理系统

题目2.学生信息管理系统一、课程设计目的1.数据构造课程设计是综合运用数据构造课程中学到的几种典型数据构造,以及程序设计语言〔C语言〕,自行实现一个较为完整的应用系统的设计与开发2.通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据构造在软件开发中的应用。
3.学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
学生信息管理系统:〔1〕熟练掌握链表存储构造及其建立过程和常用操作;〔3〕学会自己调试程序的方法并掌握一定的技巧二、课程设计容建立学生信息管理系统,通过链表实现对学生信息的输入,查找,删除,插入和排序等操作。
三、需求分析1.每位学生的信息有:学号,XX,性别,出生日期,E-mile,,c成绩,数学成绩等,用链表对学生的信息进展存储。
2.全部数据可以只放在存中;3.系统能实现的操作和功能如下:a) 输入学生信息:对不同学生分别输出以下信息:学号,XX,性别,出生日期,E-mile,,c成绩,数学成绩等。
b) 查找学生信息:根据学生的学号或XX对学生的信息进展查找。
c) 删除学生信息:删除某个学生的所有信息。
d) 插入学生信息:将某个学生的信息插入到已经输入的信息中。
e) 显示学生信息:将所有学生的信息显示出来。
f) 排序:将所有学生按某个学科的成绩依次排序。
四、概要设计1.系统构造图〔功能模块图〕2.功能模块说明①.输入学生信息,creat()函数:建立单向链表,组织循环,将学生的信息依次录入。
②:查找学生信息:a.按学号查找,find1〔〕函数;b.按XX查找,find2〔〕函数;③.删除学生信息,del〔〕函数:建立指针,在链表中寻找要删除信息的学生的学号,找到后p->next=p->next->next,将其删除。
④.插入学生信息,insert〔〕函数;输入要插入的信息,建立指针,寻找要插入的节点。
数据结构课程设计通讯录管理系统

一、设计题目(问题)描述和要求某一中学,现在需要建立学生通讯录管理系统,以管理学生信息。
要求:(1)可以录入新的通讯信息(包括姓名,通讯地址,邮编,联系电话等)(2)可以按照姓名进行查询相关信息(3)可以修改相关信息二、系统分析与概要设计根据问题描述和要求,系统要求能够按姓名查找、增加、删除和保存各学生的信息。
确定程序应该具备如下功能:“查询学生信息”、“增加学生信息”、“修改学生信息”“删除学生信息”、“数据存盘”基本模块。
系统可以将学生信息数据保存到磁盘文件student.txt,从而可以通过磁盘文件读出学生数据信息,为了便于统计在生成学生信息时同时生成学生编号,这样每输入一个学生信息编号顺序加1,这样也方便了管理员查询学生信息。
三、详细设计和编码1.数据类型定义根据系统要求,可以将姓名和邮编和联系电话通讯地址定义为字符型。
2.各模块算法描述查询学生信息: Que_name()输入要查询的学生姓名,比较名字与保存的信息是否相同,若相同则查找到,否则,没查找到。
增加学生信息: Add()输入要添加的学生信息并保存。
删除学生信息: Del()输入要删除的学生姓名,若与数据相同则删除,否则输出查找不到该信息。
修改学生信息: Mod()输入要修改的学生姓名,输入要修改的信息,并确认。
数据存盘: Sav()创建文件,将信息写入文件。
3.程序关键算法流程图(1)主函数流程(2) 某操作算法流程Student:: Add()(3) Student:: Del()4) Student:: Mod()(5) Student:: Que_name()(6) Student:: Sav()(7) Student:: Load()四、调试分析(内容包括:调试过程中遇到的问题并且是如何解决的以及对设计实现的回顾讨论和分析;算法的时空分析和改进设想;经验和体会等)五、测试结果六、小结通过本次设计,加强了对于编写管理系统程序的运用,能够更好的运用循环。
学生管理系统链表数据结构课程设计

课程设计任务书1、题目:学生信息管理系统2、设计内容及要求:内容:完成简单的学生信息管理系统要求:(1)学生信息包括:学号、姓名、平时成绩、期末考试成绩;(2)用单链表存放学生信息;(3)实现简单的菜单调用;(4)程序的功能包括:学生信息链表的建立;学生信息的插入;学生信息的查询;学生信息的修改;学生信息的删除;学生信息的输出。
编写算法,编码实现基本要求。
3.设计时间:6 月27 日-7 月1 号目录一、需求分析--------------------- 3二、概要设计----------------------4三、详细设计----------------------6四、调试分析--------------------- 14五、用户使用说明----------------- 14六、测试结果--------------------- 17七、附录(略)---------------------- 17一.需求分析分析课程设计任务书,本次数据结构课程设计的任务是利用数据结构中所学的相关知识编程设计实现一个学生信息管理系统,使该系统可以方便的查询学生的各项信息和方便管理。
根据任务书中的第五条要求,为来使用者方便使用。
需给出输入、插入、查询、修改、显示等功能。
根据上面的需求分析,画出程序的功能模块图大致如下:系统设计流程图二、概要设计根据上面所述的需求分析,结合我们学过的数据结构知识,要想在计算机中储存学生的信息,可以使用顺序存储和链式存储两种数据类型下面给出本程序用到抽象数据类型定义:ADT List{数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0 }数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作P:InitList(&L);操作结果:构造一个空的线性表L。
DestroList(&L);初始条件:线性表L已存在。
城市链表课程设计

城市链表课程设计一、引言城市链表是指一个城市网络系统,通过连接不同的城市,形成一个有机的整体。
城市链表的设计与实现是城市规划和交通管理的重要组成部分。
本文将介绍城市链表的设计原理、应用场景以及实现方法。
二、城市链表的设计原理1. 城市链表的概念城市链表是由多个城市节点组成的有向图。
每个城市节点代表一个城市,节点之间的边表示城市之间的交通连接关系。
通过城市链表,可以方便地查找和管理城市之间的交通信息。
2. 城市节点的属性每个城市节点包含以下属性:- 城市名称:唯一标识一个城市的名称;- 经纬度:表示城市的地理位置;- 人口数量:反映城市的人口规模;- 交通状况:描述城市的交通拥堵程度。
3. 城市节点之间的连接关系城市节点之间的连接关系可以用边来表示,边的属性包括:- 距离:表示两个城市之间的距离;- 交通工具:表示两个城市之间的交通工具种类,如公路、铁路、航空等。
三、城市链表的应用场景1. 城市规划城市链表可以帮助城市规划部门进行城市布局和交通规划。
通过分析城市链表中城市节点之间的连接关系,可以确定城市之间的交通需求,合理规划道路和交通设施的建设。
2. 交通管理城市链表可以用于交通管理系统,帮助交通管理部门实时监控和调度城市交通。
通过城市链表,可以获取城市节点的交通状况,及时调整交通信号灯、交通流量等,以提高交通效率和减少拥堵。
3. 旅游规划城市链表可以帮助旅游部门进行旅游线路规划和推荐。
通过分析城市链表中城市节点之间的距离和交通工具,可以为游客提供最佳的旅游路线和交通方案。
4. 物流管理城市链表可以用于物流管理系统,帮助物流公司进行货物配送和仓储管理。
通过城市链表,可以确定不同城市节点之间的距离和交通工具,优化货物配送路线,提高物流效率。
四、城市链表的实现方法1. 数据结构城市链表可以使用图的数据结构来实现,每个城市节点可以用一个类或结构体来表示,节点之间的连接关系可以用邻接矩阵或邻接表来表示。
数据结构课程设计报告通讯录.doc

专业:计算机科学与技术
年级:
课题名称:通讯录
小组成员1:
小组成员2:
小组成员3:
信息技术学院专业教研室一
一、问题描述
设计目的:用〈〈数据结构〉〉中的双向链表作数据结构,结合C语言基本知识。编写一个通讯录管理系统。以把所学数据结构知识应用到实际软件开发中去。
设计内容:本系统应完成一下几方面的功能:
{
char choic;
system("cls");
printf("\n\t\t*******************查询菜单*******************");
printf("\n\t\t**************** 1-显示所有********************");
1)输入信息——enter();
2)显示信息———display( );
3)查找以姓名作为关键字———search( );
4)删除信息———delete( );
5Байду номын сангаас存盘———save ( );
6)装入———load( ) ;
设计要求:
1)每条信息至包含:姓名(NAME)街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项
getch();//从键盘接收一个字符
}
return;//返回主函数的主菜单
}
exit(0);
}
fseek(fp,0,2);/*文件位置指针移动到文件末尾*/
if (ftell(fp)>0)/*文件不为空*/
{
rewind(fp);/*文件位置指针移动到文件开始位置*/
通讯录管理系统课程设计报告

通讯录管理系统一、目的随着信息科技高速的发展,计算机的使用也越来越广泛,它渐渐的成为在人们生活中占有重要位置的工具,给人们的生活带来了极大便利和帮助,它帮助人们处理繁琐复杂的工作,可以帮人们高效的处理和存储信息。
在以前,科技不发达,好多事情只能通过人力来完成,对于通讯录人们只能手工管理,手写记录、查找,给人们带来很大的不便。
而随着信息技术的发展,特别是计算机的普及,人们希望能让机器代替人力来解决一些实际问题,开发通讯录管理系统,可以便于人们对通讯录的联系人进行管理,方便日常生活。
该报告主要介绍通讯录管理系统的设计与实现,主要讲述如何开发通讯录管理系统,以及该系统一些模块功能的实现。
二、需求分析本系统为简单的通讯录管理系统,应具备以下功能:(1)输入相关数据,创建一个新联系人信息(姓名、性别、地址、电话、QQ、生日)。
(2)按姓名/电话号码查询某个通讯者的信息。
(3)按姓名/电话号码删除某个通讯者的信息。
(4)输出显示所有通讯者的信息。
(5)清空联系人信息。
(6) 按姓名/电话号码查找修改某联系人的信息。
三、概要设计1、本程序包含的模块(1)主程序模块Main(){通讯录链表定义及初始化;根据用户输入选择调用功能模块;}(2)功能模块—实现对通讯录链表的操作主函数调用功能函数实现对通讯录链表的增、删、改、查。
2、链表的定义及功能函数的抽象数据类型定义(1)链表的定义typedef struct node{char name[MAXLEN];char sex;int number; /* number在头结点被用来存放链表的长度,所以定义为int型*/ char address[MAXLEN];int QQnum;char birth[MAXLEN];struct node *next; /* 指向下一节点的指针*/}AddressNode; /* 结构体类型范例*/typedef struct node *AddressList; /* 结构体指针类型范例*/(2)功能函数的抽象数据类型定义void PrintAddressNode(AddressList L);/* 打印当前工作指针指向的节点的数据*/void PrintList(AddressList L); /* 打印当前链表内所有节点的数据*/int GetElemByNum(AddressList L,int number);/* 按号码查找节点*/int GetElemByName(AddressList L,const char *name);/*按名字查找结点*/AddressList CreateEmptyList();/*创建一个空链表*/void AddNode(AddressList L,AddressNode n);/*插入一个节点,插入位置为头结点之后*/void InputNode(AddressList L);/*用户输入数据,然后插入链表内*/int DeleteElemByNum(AddressList L,int number);/*删除号码为number的节点*/int DeleteElemByName(AddressList L,const char *name);/*删除名字为name的节点*/void ClearList(AddressList L);/*清空链表*/void SelectBySex(AddressList L,char sex);/*筛选链表内所有男/女的数据*/int ChangeByName(AddressList L,const char *name);/*修改名字为name的节点*/int ChangeByNum(AddressList L,int number);/*修改号码为number的节点*//*menu.c*/void menu_start();/* 初始菜单*/void menu_delete(AddressList L)/*选择删除联系人后的次级界面*/;void menu_getelem(AddressList L);/*选择查找联系人后的次级界面*/void menu_change(AddressList L);/*选择修改联系人后的次级界面*//*main.c*/AddressList InitListWithData(AddressList L);/*给通讯录设置一些初始数据*/ 2、主程序流程图四、详细设计本程序总共有4个文件,一个.h头文件,三个.c资源文件1、my.h文件#ifndef __MY_H__#define __MY_H__#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXLEN 128#define OK 1#define ERROR 0typedef struct node{char name[MAXLEN];char sex;int number;char address[MAXLEN];int QQnum;char birth[MAXLEN];struct node *next;}AddressNode;typedef struct node *AddressList;/*函数声明部分*//*fun.c*/void PrintAddressNode(AddressList L);void PrintList(AddressList L);int GetElemByNum(AddressList L,int number);int GetElemByName(AddressList L,const char *name); AddressList CreateEmptyList();void AddNode(AddressList L,AddressNode n);void InputNode(AddressList L);int DeleteElemByNum(AddressList L,int number);int DeleteElemByName(AddressList L,const char *name); void ClearList(AddressList L);int ChangeByName(AddressList L,const char *name);int ChangeByNum(AddressList L,int number);/*menu.c*/void menu_start();void menu_delete(AddressList L);void menu_getelem(AddressList L);void menu_change(AddressList L);/*main.c*/AddressList InitListWithData(AddressList L);#endif2、main.c文件#include"my.h"/***************函数:InitListWithData()*参数:链表头结点L*返回值:链表头结点*功能:给通讯录设置一些初始数据**************/AddressList InitListWithData(AddressList L){AddressNode n;strcpy(,"Li");n.sex = 'm';n.number = 10010;strcpy(n.address,"武汉");n.QQnum = 123456789;strcpy(n.birth,"1996.9.1");AddNode(L,n);strcpy(,"Liu");n.sex = 'f';n.number = 11000;strcpy(n.address,"上海");n.QQnum = 78563491;strcpy(n.birth,"1996.4.9"); AddNode(L,n);strcpy(,"Shi");n.sex = 'm';n.number = 10000;strcpy(n.address,"深圳");n.QQnum = 12389769;strcpy(n.birth,"1995.1.23"); AddNode(L,n);strcpy(,"NiNa");n.sex = 'f';n.number = 10001;strcpy(n.address,"北京");n.QQnum = 18967543;strcpy(n.birth,"1994.10.19"); AddNode(L,n);strcpy(,"Lucy");n.sex = 'f';n.number = 10100;strcpy(n.address,"南京");n.QQnum = 129879889;strcpy(n.birth,"1996.8.7"); AddNode(L,n);return L;}int main(){int select;AddressList phone = CreateEmptyList();phone = InitListWithData(phone);do{system("cls");//清屏menu_start();scanf("%d",&select);getchar();if(select==0){printf("欢迎下次使用!\n");break;}switch(select){case 1:PrintList(phone);break;case 2:InputNode(phone);break;case 3:menu_delete(phone);break;case 4:menu_getelem(phone);break;case 5:ClearList(phone);break;case 6:menu_change(phone);break;default:printf("输入非法数据,请重新输入!\n");}printf("请按回车继续……\n");getchar();}while(select!=0);return 0;}3、menu.c文件#include"my.h"/***************函数:menu_start()*参数:无*返回值:无*功能:起始界面**************/void menu_start(){printf("****************************\n");printf("欢迎使用简易通讯录!\n");printf("****************************\n");printf("1:输出全部联系人信息\n");printf("2:插入新的联系人\n");printf("3:删除一个联系人\n");printf("4:查找某个联系人\n");printf("5:清空联系人信息\n");printf("6:修改某个联系人\n");printf("0:退出\n");printf("****************************\n");printf("请选择要执行的操作:");}/***************函数:menu_delete()*参数:链表头结点L*返回值:无*功能:选择删除联系人后的次级界面**************/void menu_delete(AddressList L){int select,number;char name[MAXLEN];printf("****************************\n");printf("请输入删除数据的方式:\n");printf("1:按姓名\n");printf("2:按号码\n");printf("0:返回\n");printf("****************************\n");do{printf("请选择:");scanf("%d",&select);getchar();if(select!=1 && select!=2 && select!=0)printf("输入非法数据,请重新输入!\n");}while(select!=1 && select!=2 && select!=0);switch(select){case 1:printf("请输入姓名:");scanf("%[^\n]",name);getchar();DeleteElemByName(L,name);break;case 2:printf("请输入号码:");scanf("%d",&number);getchar();DeleteElemByNum(L,number);break;case 0:printf("即将返回上级目录,");break;}}/***************函数:menu_getelem()*参数:链表头结点L*返回值:无*功能:选择查找联系人后的次级界面**************/void menu_getelem(AddressList L){int select,number;char name[MAXLEN];printf("****************************\n");printf("请输入查找联系人的方式:\n");printf("1:按姓名\n");printf("2:按号码\n");printf("0:返回\n");printf("****************************\n");do{printf("请选择:");scanf("%d",&select);getchar();if(select!=1 && select!=2 && select!=0)printf("输入非法数据,请重新输入!\n");}while(select!=1 && select!=2 && select!=0);switch(select){case 1:printf("请输入姓名:");scanf("%[^\n]",name);getchar();GetElemByName(L,name);break;case 2:printf("请输入号码:");scanf("%d",&number);getchar();GetElemByNum(L,number);break;case 0:printf("即将返回上级目录,");break;}}/***************函数:menu_change()*参数:链表头结点L*返回值:无*功能:选择修改联系人后的次级界面**************/void menu_change(AddressList L){int select,number;char name[MAXLEN];printf("****************************\n");printf("请输入查询修改数据的方式:\n");printf("1:按姓名\n");printf("2:按号码\n");printf("0:返回\n");printf("****************************\n");do{printf("请选择:");scanf("%d",&select);getchar();if(select!=1 && select!=2 && select!=0)printf("输入非法数据,请重新输入!\n");}while(select!=1 && select!=2 && select!=0);switch(select){case 1:printf("请输入姓名:");scanf("%[^\n]",name);getchar();ChangeByName(L,name);break;case 2:printf("请输入号码:");scanf("%d",&number);getchar();ChangeByNum(L,number);break;case 0:printf("即将返回上级目录,");break;}}4、fun.c文件#include"my.h"*函数:PrintAddressNode()*参数:当前工作指针p*返回值:无*功能:打印当前工作指针指向的节点的数据 **************/void PrintAddressNode(AddressList p){printf("姓名:%s\n",p->name);printf("性别:%s\n",p->sex=='m'?"男":"女");printf("电话号码:%d\n",p->number);printf("地址:%s\n",p->address);printf("QQ:%d\n",p->QQnum);printf("生日:%s\n",p->birth);}/***************函数:PrintList()*参数:链表头结点L*返回值:无*功能:打印当前链表内所有节点的数据void PrintList(AddressList L)//遍历打印整个链表{AddressList p = L->next;if(!p)printf("通讯录为空!\n");else{printf("共%d个人\n",L->number);while(p){printf("****************************\n");PrintAddressNode(p);p=p->next;}printf("****************************\n");}}/***************函数:GetElemByNum()*参数:链表头结点L,待查找的号码number*返回值:成功OK/失败ERROR*功能:按号码查找节点**************/int GetElemByNum(AddressList L,int number){AddressList p;p = L->next;while(p && p->number!=number){p = p->next;//让p指向下一个节点}if(!p){printf("没有%d号码的记录,请核对后查阅\n",number);return ERROR;}else{printf("找到记录:\n");PrintAddressNode(p);return OK;}}/***************函数:GetElemByName()*参数:链表头结点L,待查找的姓名name*返回值:成功OK/失败ERROR*功能:按姓名查找节点**************/int GetElemByName(AddressList L,const char *name) {AddressList p;p = L->next;while(p && strcmp(p->name,name)){p = p->next;//让p指向下一个节点}if(!p){printf("没有%s的记录,请核对后查阅\n",name);return ERROR;}else{printf("找到记录:\n");PrintAddressNode(p);return OK;}}/***************函数:CreateEmptyList()*参数:无*返回值:链表头结点*功能:创建一个空链表**************/AddressList CreateEmptyList()//创建一个空表{AddressList p;p = (AddressList)malloc(sizeof(AddressNode));if(p==NULL){perror("CreateEmptyAddressList error");exit(0);}p->number=0;//在头结点中的num存储的是链表的整个长度 p->next=NULL;return p;}/***************函数:AddNode()*参数:链表头结点L,保存新节点数据的结构体n*返回值:无*功能:插入一个节点,插入位置为头结点之后**************/void AddNode(AddressList L,AddressNode n)//插入新节点{AddressList p;if((p = (AddressList)malloc(sizeof(AddressNode)))==NULL) {printf("插入新节点失败!\n");}strcpy(p->name,);p->sex = n.sex;p->number = n.number;strcpy(p->address,n.address);p->QQnum = n.QQnum;strcpy(p->birth,n.birth);p->next = L->next;L->next = p;L->number++;}/***************函数:InputNode()*参数:链表头结点L*返回值:无*功能:用户输入数据,然后插入链表内 **************/void InputNode(AddressList L)AddressNode n;printf("请输入姓名:");scanf("%[^\n]",);do{getchar();printf("请输入性别(m为男,f为女):");scanf("%c",&n.sex);if(n.sex!='m'&&n.sex!='f')printf("输入错误,请重新输入!\n"); }while(n.sex!='m'&&n.sex!='f');printf("请输入电话号码:");scanf("%d",&n.number);getchar();printf("请输入地址:");scanf("%[^\n]",n.address);getchar();printf("请输入QQ号码:");scanf("%d",&n.QQnum);printf("请输入生日:");scanf("%[^\n]",n.birth);getchar();AddNode(L,n);}/***************函数:DeleteElemByNum()*参数:链表头结点L,待删除的号码number *返回值:成功OK/失败ERROR*功能:删除号码为number的节点**************/int DeleteElemByNum(AddressList L,int number) {AddressList p,q;p = L;while(p->next && p->next->number!=number) {p = p->next;//让p指向下一个节点}{printf("没有%d号码的记录,请核对后删除\n",number);return ERROR;}else{printf("找到记录:\n");q = p->next;PrintAddressNode(q);p->next = q->next;free(q);L->number--;printf("该记录已被删除\n");return OK;}}/***************函数:DeleteElemByName()*参数:链表头结点L,待删除的姓名name*功能:删除姓名为name的节点**************/int DeleteElemByName(AddressList L,const char *name) {AddressList p,q;p = L;while(p->next && strcmp(p->next->name,name)){p = p->next;//让p指向下一个节点}if(!p->next){printf("没有%s的记录,请核对后查阅\n",name);return ERROR;}else{printf("找到记录:\n");q = p->next;p->next = q->next;free(q);L->number--;printf("该记录已被删除\n");return OK;}}/***************函数:ClearList()*参数:链表头结点L*返回值:无*功能:清空链表**************/void ClearList(AddressList L)//清空链表{AddressList p,q;p=L->next;while(p){free(p);p=q;}L->next=NULL;L->number=0;printf("清空通讯录成功\n");}/***************函数:ChangeByName()*参数:链表头结点L,待修改的姓名name*返回值:成功OK/失败ERROR*功能:按姓名查找修改节点**************/int ChangeByName(AddressList L,const char *name) {AddressList p,q;p = L;while(p->next && strcmp(p->next->name,name)) {}if(!p->next){printf("没有%s的记录,请核对后查阅\n",name); return ERROR;}else{printf("************************\n");printf("找到记录:\n");q = p->next;PrintAddressNode(q);printf("************************\n");printf("现在开始修改联系人信息!\n");printf("************************\n");printf("请输入姓名:");scanf("%[^\n]",q->name);do{printf("请输入性别(m为男,f为女):"); scanf("%c",&q->sex);if(q->sex!='m'&&q->sex!='f')printf("输入错误,请重新输入!\n");}while(q->sex!='m'&&q->sex!='f');printf("请输入电话号码:");scanf("%d",&q->number);getchar();printf("请输入地址:");scanf("%[^\n]",q->address);getchar();printf("请输入QQ号码:");scanf("%d",&q->QQnum);getchar();printf("请输入生日:");scanf("%[^\n]",q->birth);getchar();printf("修改成功!");return OK;}/***************函数:ChangeByNum()*参数:链表头结点L,待修改的号码number*返回值:成功OK/失败ERROR*功能:按号码查找修改节点**************/int ChangeByNum(AddressList L,int number){AddressList p,q;p = L;while(p->next && p->next->number!=number){p = p->next;//让p指向下一个节点}if(!p->next){printf("没有%d的记录,请核对后查阅\n",number); return ERROR;else{printf("************************\n");printf("找到记录:\n");q = p->next;PrintAddressNode(q);printf("************************\n");printf("现在开始修改联系人信息!\n");printf("************************\n");printf("请输入姓名:");scanf("%[^\n]",q->name);do{getchar();printf("请输入性别(m为男,f为女):"); scanf("%c",&q->sex);if(q->sex!='m'&&q->sex!='f')printf("输入错误,请重新输入!\n");}while(q->sex!='m'&&q->sex!='f');printf("请输入电话号码:");scanf("%d",&q->number);getchar();printf("请输入地址:");scanf("%[^\n]",q->address);getchar();printf("请输入QQ号码:");scanf("%d",&q->QQnum);getchar();printf("请输入生日:");scanf("%[^\n]",q->birth);getchar();printf("修改成功!");return OK;}}五调试分析1、该程序的关键就是弄清楚单链表的原理,保证结构体指针指向的地址是你想要的地址,要非常清楚指针从头结点开始遍历,到第一个数据节点,然后第二个,第三个,一个一个遍历下去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告_学生通讯录管理系统_城市链表 数据结构课程设计报告 l ( 2012——2013年度第一学期) 课程名称: 数据结构课程设计 题 目 一: 2.2 学生通讯录管理系统 题 目 二: 2.4.3 城市链表 院 系: 计算机科学系 班 级: 10级软件本(一) 姓 名: 学 号: 指导教师: 孙凌宇老师 成 绩: 2012 年 月 日 1 数据结构课程设计报告 成 绩 评 定 一、 指导教师评语 二、 成绩 成绩 备注 指导教师: 日 期: 年 月 日 2 数据结构课程设计报告 设计题目: 2.2 学生通讯录管理系统 一、设计要求 1(问题描述 纸质的通讯录系统已经不能满足大家的要求,容易丢失、查找困难等问题是纸质通讯录所不能克服的缺点。“学生通讯管理系统”是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和分析的一种应用程序。 2(需求分析 (1) 输入数据建立通讯录 (2) 查询通讯录系统中满足要求的信息 (3) 插入新的通讯录信息 (4) 删除不需要的通讯录信息 (5) 查看所有通讯录信息 二、概要设计 为了实现需求分析的功能,可以从三个方面着手设计。 1(主界面设计 为了实现学生通讯录管理系统各功能的管理,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。本系统主控菜单运行界面如图2-3所示。
图2-3 “学生通讯录管理系统”主菜单 2(存储结构设计 本系统主要采用链表结构类型来表示存储在“学生通讯录管理系统”中的信息。其中,链表结点由四个分量构成:通讯录成员学号、通讯录成员姓名、通讯录成员电话号码、指向该结构体的指针。此外,本系统还设置了一个全局变量seat,表示通讯录中成员的序号。 3 数据结构课程设计报告 3(系统功能设计 本系统设置了5个子功能菜单,5个子功能的设计描述如下。 (1)建立通讯录系统 。可以一次输入多个成员通讯录的信息,建立通讯录。该功能由creatIncreLink( )函数实现。 (2)插入通讯记录。每次可以插入一个成员通讯录的信息。如果要连续插入多个成员通讯录信息必须多次选择该功能。该功能有insertYouXu( )函数实现。 (3)查询通讯记录。可以按两种方式查询所需要的通讯录成员记录,一是按学号查询,二是按姓名查询。分别由seartNum( )和seartName( )函数实现。 (4)删除通讯记录。可以对通讯录中不再需要的信息进行删除。有三种删除方式:按序号进行删除,按学号进行删除和按姓名进行删除。分别由deleteElem( )函数,delNum( )函数和delName( )函数实现。 (5)显示通讯录系统。可以查看通讯录中所有的通讯录成员记录。该功能由printList( )函数实现。 三、模块设计 1(模块设计 本程序包含两个模块:主程序模块和链表操作模块。其调用关系如图2-4所示。 链表操作模块 主程序模块 图2-4 模块调用示意图 2(系统子程序及功能设计 本系统共设置10个子程序,各程序的函数名及功能说明如下,其中大部分函数都是链表的基本操作函数。 (1) LinkList creatIncreLink( ) //链表的创建 (2)deleteElem( LinkList L,int i) //从通讯录中按序号删除第i个元素 (3)delName(LinkList L,char n[ ]) //按姓名删除通讯录记录 (4)delNum( LinkList L,int n) //按学号删除通讯录记录 (5)void insertYouXu(LinkList L,LinkList Elem ) //插入一条通讯录 (6)printList( LinkList L) //打印指针地址为 L的通讯录 (7)prior ( LinkList L,LinkList p) // 查找位于当前地址元素的前一元素的地址 4 数据结构课程设计报告 (8)searchName( LinkList L,int n) //按姓名查找通讯录记录 (9)int searchNum( LinkList L,int n) // 按学号查找查找通讯录记录 (10) void main( ) //主函数。设定界面的颜色和大小,调用链表操作模块 3(函数主要调用关系图 本系统10个子程序之间的主要调用关系如图2-5所示。图中数字是各函数的编号。 图2-5 系统函数调用关系图如下所示:
四、详细设计 1(数据类型定义 本系统采用链式结构存储通讯录结点。结点定义如下: typedef struct LNode { int number; double telenum; char name[20]; struct LNode *next; }LNode,*Linklist; 2(系统主要子程序详细设计 (1)建立链表的函数,主要用来建立通讯录。 Linklist createIncreLink() {//创建一个存放通讯录成员的非递减有序表,返回头结点地址 Linklist L=(Linklist)malloc(LEN); L->next=NULL; 5 数据结构课程设计报告 Linklist p; int num=1,number; double telenum; char name[20]; printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结束标志\n"); printf("请输入学号 %d: ",num); scanf("%d",&number); printf("请输入姓名 %d: ",num); char temp=getchar(); gets(name); printf("请输入电话号码 %d: ",num); scanf("%1f",&telenum); while(number>=0) { p=(Linklist)malloc(LEN); p->number=number; p->telenum=telenum; strcpy(p->name,name); insertYouXu(L,P); num++; printf("请输入学号 %d: ",num); scanf("%d",&number); printf("请输入姓名 %d: ",num); temp=getchar(); gets(name); printf("请输入电话号码 %d: ",num); scanf("%1f",&telenum); } return(L); } (2)显示链表中所有结点的信息,用查看通讯录所有的记录。 6 数据结构课程设计报告 void printList(LinkList L) { //打印头结点地址为L的通讯录 printf("\n ----------------\n"); printf(" 学号 姓名 电话号码\n"); printf(" ----------------\n"); LinkList p=L; int n=1; if(L==NULL || L->next==NULL) printf ("该通讯录中没有元素\n"); //判断通讯录是否为空 else while(p->next !=NULL) { printf(" %2d %-9d",n,p->next->number); printf(" %-5s %.0f\n",p->next->name,p->next->telenum); p=p->next; n++; } printf(" --------------------\n"); return ; } 五、测试分析 系统运行主界面如图2-3所示。各子功能测试运行结果如下。 1. 通讯录的建立 在主菜单下,用户输入1并回车,然后按照提示建立通讯录,分别输入通讯录成员的学号,姓名,电话号码,运行结果如图2-6所示。 7 数据结构课程设计报告
图2-6通讯录的建立 2. 插入通讯录记录 在主菜单下,用户输入2并回车,可以插入一个新的通讯录成员的信息,依次输入学号,姓名和电话号码,运行结果如图2-7所示。
图2-7 插入通讯录 3 .查询通讯录记录 在主菜单下,用户输入3并回车,可以按照两种方式查询通讯录。一种是按学号查询,另一种方式是按姓名查询。可按照提示操作,运行结果如图2-8所示。 8 数据结构课程设计报告 图2-8查询通讯记录 4. 删除通讯录记录 在主菜单下,用户输入4并回车,进行通讯录记录的删除。可以按三种方式进行删除操作:按序号、按学号和按姓名。图2-9是按学号删除的运行结果。
图2-9删除通讯记录 5. 显示通讯录信息 在主菜单下,用户输入5并回车,可以查看通讯录中的所有成员信息。运行结果如图2-10所示。 9 数据结构课程设计报告
图2-10 显示通讯录信息