数据结构单链表通讯录
- 格式:doc
- 大小:268.00 KB
- 文档页数:20
#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 100//定义最大值typedef struct ENode{ int num;char Add[MAX];//地址char Name[MAX];//名字char telephone[MAX];//电话号码struct ENode *next;}ENode,*ENoteBook;ENoteBook CreatList(int n){ENoteBook P,Q,H;int i,x;for(i=1;i<=n;i++){P=(ENoteBook)malloc(sizeof(ENode));printf("请输入地址\n");gets(P->Add);gets(P->Add);printf("请输入名字\n");gets(P->Name);printf("请输入电话\n");gets(P->telephone);if(i==1) H=P;else Q->next=P;Q=P;}P->next=NULL;return H;}void InsertNoteBook(ENoteBook &L) {ENoteBook Q;Q=(ENoteBook)malloc(sizeof(ENode)); printf("现在输入插入元素信息\n"); printf("\n");printf("请输入地址\n");gets(Q->Add);//gets(Q->Add);// puts(Q->Add);printf("请输入名字\n");gets(Q->Name);printf("请输入电话\n");gets(Q->telephone);Q->next=L->next;//L->next=NULL;L->next=Q;printf("个人信息添加完成\n");}PrintNoteBook(ENoteBook &L)//打印函数{ENoteBook P;P=L;if(L!=NULL)printf("\t\t电子通讯录\n");printf("名字地址电话\n");do{printf("%s %s %s",P->Name,P->Add,P->telephone);printf("\n");P=P->next;}while(P!=NULL);}Deletemember(ENoteBook L){char str[MAX];ENoteBook P,Q;printf("请输入你要删除的名字\n");gets(str);P=L;while(P->next!=NULL){if (strcmp(str,P->next->Name)==0){P->next=P->next->next;goto end;}elseP->next=P->next->next;}printf("出错了!");end: printf("删除完成!\n");}void Checkmember(ENoteBook &L)//按名字{char str[MAX];ENoteBook Q;printf("请输入你要查找的名字\n");gets(str); gets(str);Q=L;while(Q->next!=NULL){ if (strcmp(str,Q->Name)==0){puts(Q->Name);puts(Q->Add);puts(Q->telephone);} else Q=Q->next;}printf("你出错了\n");}main(){ENoteBook q;int n;int i;eww: printf("欢迎使用电子通讯本管理软件\n");printf("----1. 创建信息----\n");printf("----2. 插入信息----\n");printf("----3. 打印信息----\n");printf("----4. 查找信息----\n");printf("----5 .删除信息----\n");printf("请选择您要执行的操作\n");scanf("%d",&i);switch(i){case 1: printf("请输入元素的个数\n");scanf("%d",&n);q=CreatList(n); goto eww; break;case 2: InsertNoteBook(q);goto eww; break;case 3: PrintNoteBook(q); goto eww; break;case 4: Checkmember(q);goto eww; break;case 5: Deletemember(q);goto eww;break;default:printf("操作出错\n");goto eww;}//Deletemember(q); }。
单链表通讯录课程设计一、引言随着社会的发展,人们之间的联系越来越紧密,通讯录成为了人们生活中必不可少的工具。
通讯录是一种记录联系人信息的工具,可以帮助人们随时随地地查找联系人信息。
本文将介绍一个基于单链表的通讯录课程设计。
二、需求分析1. 功能需求:本系统主要功能是实现通讯录的增删改查操作,包括添加联系人、删除联系人、修改联系人信息和查找联系人等。
2. 性能需求:系统需要保证数据存储和操作的高效性和稳定性,同时界面友好易用。
3. 安全需求:系统需要保护用户数据安全,防止数据泄露或被恶意攻击。
三、设计思路1. 数据结构选择:本系统采用单链表作为数据结构,每个节点表示一个联系人信息。
2. 系统架构设计:本系统采用MVC模式进行设计,即将界面、业务逻辑和数据分离。
界面由View层实现,业务逻辑由Controller层实现,数据由Model层实现。
3. 界面设计:本系统主要界面分为两个部分:通讯录列表和操作区域。
通讯录列表展示所有已添加的联系人信息;操作区域包括添加、删除、修改和查找等功能按钮。
四、系统实现1. Model层实现:(1)定义节点结构体:struct Node{char name[20];char phone[20];char email[30];struct Node *next;};(2)定义单链表相关操作函数:void addNode(Node *head); //添加联系人void deleteNode(Node *head); //删除联系人void modifyNode(Node *head); //修改联系人信息void searchNode(Node *head); //查找联系人信息2. View层实现:(1)使用Qt框架进行界面设计;(2)将通讯录列表展示在QListWidget控件中;(3)将操作按钮放置在QPushButton控件中。
3. Controller层实现:(1)将View层和Model层连接起来;(2)处理用户交互事件,如按钮点击事件;(3)调用Model层的相关函数进行数据处理。
数据结构课程设计(通讯录)
题目描述:
设计一个通讯录程序,实现以下功能:
1. 添加联系人信息
2. 删除联系人信息
3. 修改联系人信息
4. 查找联系人信息
5. 显示所有联系人信息
6. 退出程序
要求:
1. 使用链表作为数据结构存储联系人信息
2. 界面友好,操作简单方便
3. 能够防止重复添加联系人信息
设计思路:
1. 定义一个结构体Contact表示联系人信息,包括姓名、电话、邮箱等成员变量。
2. 定义一个链表结构体List表示联系人链表,包括头结点、
节点数量等成员变量。
3. 实现添加联系人信息函数,首先判断联系人是否存在,如果存在则提示用户,否则分配一个新的节点,并将联系人信息存储在节点中,将新节点插入链表中。
4. 实现删除联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则在链表中删除该节点。
5. 实现修改联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则修改节点中的信息。
6. 实现查找联系人信息函数,遍历链表查找是否有匹配姓名的联系人。
7. 实现显示所有联系人信息函数,遍历链表打印出所有联系人信息。
8. 在main函数中调用上述函数,根据用户输入的指令调用对应的函数,直到用户选择退出程序。
数据结构课程设计——————通讯录的制作班级:10计科(1)班姓名:江平平学号:201010510115目录一、设计项目名称 (2)二、课程设计目的 (2)三、需求分析 (2)四、概要设计 (3)五、详细设计 (5)六、调试分析 (8)七、调试结果 (11)八、使用说明 (13)九、课设总结及心得体会 (13)十、源代码 (14)一、设计项目名称:通讯录的制作二、课程设计目的:通过设计通讯录的制作,进一步熟悉数据结构的概念、基本知识和技能,掌握程序设计的基本思路和方法,并利用所学的基本知识和技能解决简单的程序设计问题。
逐步熟悉程序设计的方法,并养成良好的编程习惯。
三、需求分析:1、要求:(1)设计一个实用的小型通讯录,用单链表作数据结构,编写一个通讯录管理系统实现学生信息的输入添加、显示、以姓名做关键字进行查找、删除信息等功能。
(2)每条学生信息包含:姓名、性别、地址、编号、电话等信息。
2、详细功能如下:A.插入:系统将提示用户输入新添加学生信息,学生信息数据包括姓名、性别、地址、编号、电话等。
B.查询:提示用户输入要查找的学生姓名,然后系统用查找函数查找,接着系统使用相关命令输出所查找的学生的全部信息。
C.删除:首先提示用户输入要删除的学生姓名,然后调用删除函数,删除该学生的所有相关资料。
D.输出后退出系统退出通讯录管理系统。
四、概要设计:1、通讯录管理系统功能说明图:2、设计结构体及基本数据成员类型:typedef struct student{char name[20]; //姓名char sex; //性别char tel[10]; //电话int grade; //地址long number; //编号struct student *next;struct student *prior;}student,*Stu; //结构体学生(2)数据成员类型:int i;int n;包含4个被调用函数:功能void input(Stu &ST,int n); 添加学生信息 void del(Stu &ST); 删除学生信息void search(Stu &ST); 查询学生信息int Insert(Stu &p) ;创建结点3、实现主程序与各模块的调用关系:void main() //主函数{int i;int n;Stu ST=NULL;void input(Stu &ST,int n);void search(Stu &ST);void del(Stu &ST);printf("请输入学生个数: "); //提示信息scanf("%d",&n);printf("\n请输入学生信息(按:姓名性别(w,m) 电话地址编号 ) \n");// input(ST,n); //信息输入Stu q;q=ST->next;while(q != NULL) //输出所有信息{printf("\n%20s %4c %10s %8d %8ld\n",q->name,q->sex,q->tel,q->grade,q->number);q=q->next;}for(int j=0;j!=3;){printf("\n删除输入1,查找输入2,退出输入3: ");scanf("%d",&j);switch(j){case 1:del(ST);break;case 2:search(ST);break;case 3:break;}}}五、详细设计:1、各个操作的算法:while(q != NUL){for(int j=0;j!=3;){switch(j){case 1:del(ST);break;case 2:search(ST);break;case3:break;}}}(1)添加学生信息:void input(Stu &ST,int n){ //添加学生信息int Insert(Stu &p);int i;Stu p;ST=(Stu)malloc(sizeof(student));p=ST;for(i=1;i<=n;++i){Insert(p);printf("\n请输入姓名: "); //输入姓名 scanf("%s",&p->name);fflush(stdin);printf("\n 性别: "); //输入性别scanf("%c",&p->sex);fflush(stdin);printf("\n 电话: "); //输入电话scanf("%s",&p->tel);fflush(stdin);printf("\n 地址: "); //输入地址scanf("%d",&p->grade);fflush(stdin);printf("\n 编号: "); //输入编号scanf("%ld",&p->number);printf("\n还有%d个\n",n-i);} //输出剩余学生个数提示}(2)查询学生信息void search(Stu &ST) //查找学生信息{Stu p=ST;p=p->next;char aname[20];printf("\n请输入要查找的名字: "); //按名字查找scanf("%s",&aname); //待查找的姓名strcpy(ST->name,aname);while(p!=NULL){if( strcmp(ST->name,p->name) )p=p->next;elsebreak;}if(p!=NULL) //输出查找结果printf("\n%20s %4c %10s %8d %8ld\n",p->name,p->sex,p->tel,p->grade,p->number);elseprintf("\n您要查询的学生信息不存在!\n"); //学生不存在}(3)删除学生信息:void del(Stu &ST) //删除学生信息{Stu p,temp;char aname[20];printf("\n请输入要删除的名字: "); //按学生名字删除scanf("%s",&aname); //待删除的名字strcpy(ST->name,aname);p=ST;p=p->next;while(p != NULL){if( strcmp(ST->name,p->name) )p=p->next;else{temp=p;p=p->prior;p->next=p->next->next;free(temp);printf("\n按需求删除成功!\n");break;}}if(p==NULL)printf("\n您要删除的学生信息不存在!\n"); //要删除的学生不存在}六、调试分析:1、添加学生信息界面:2、查找学生信息界面:3、删除学生信息界面:看看删除是否成功,可以再进行查找一下!七、测试结果八、使用说明:1、运行环境:Microsoft Visual C++6.02、操作步骤:在此,把软件使用过程写出,并对此程序的一些细节和具体的操作方法加以说明,说明如下:将软件进行初始化,即在VC++6.0中运行该程序,进入程序主界面,如下:(1)根据你要添加的学生人数开始创建通讯录,按照系统给您的提示依次输入学生信息,再根据提示进行查找、删除、显示、退出等操作。
《数据结构》课程设计报告书题目:通讯录管理系统系别:计算机科学与应用系学号:学生姓名:指导教师:完成日期:2012年5月28日1 问题描述(1)题目内容:通讯录管理。
(2)基本要求:利用单链表实现通讯录的建立、通讯者的插入、通讯者的删除、通讯者的查询以及通讯录的输出。
(3)设计目的:通过本次课程设计,了解通讯录的一些基本功能。
掌握利用单链表进行插入,查找,用关键字建立单链表。
2 需求分析经过本次的课程设计,我认为通讯录主要实现的功能如下:(1)添加信息:一个通讯录应该有其基本的添加功能。
在程序设计时,我通过一个具有添加功能的函数,实现了个人信息的添加,如:姓名,性别,电话号码,QQ号码,地址。
(2)删除信息:当你不需要某个联系人的信息时,可以直接将该人的信息删除。
(3)查找:一个通讯录应该具有令一基本功能就是查找,本设计时可以按联系人为关键字查找的,只要你输入要查找人的姓名或手机号码或QQ号码就可出来相应的个人信息。
(4)输出:一个通讯录应该具有输出所有联系人的功能,本设计按照次序可以从头到尾把通讯录中的所有联系人都输出,供自己查看。
(5)退出:当你做完你要做的事情之后,就可以退出该程序。
3 总体设计3.1 算法的定义LinkList Creat_LinkList()创建空单链表void Insert_LinkList(LinkList H)建立通讯录,录入联系人的信息,可以把联系人的姓名,性别,手机号,QQ号,地址录入系统。
void Locate_LinkList(LinkList H)按照联系人的姓名,手机号码,QQ号码查找通讯录中联系人的信息。
void Delete_LinkList(LinkList H)按照联系人的姓名,手机号码,QQ号码删除联系人的所有信息。
void print_LinkList(LinkList H)输出通讯录中的所有联系人的信息供使用者查看。
3.2 系统流程图图3-1通讯录管理功能图3.3 详细程序设计1)定义数据结构typedef struct Node //定义数据结构{char name[20];//姓名char sex[4]; //性别char tel[11];//电话号码char qq[13]; //qq号码char ad[100];//地址Node *next;//存放后继元素的地址}LNode,*LinkList;2)创建一个空的单链表LinkList Creat_LinkList(){//创建空单链表,入口参数无LinkList H;H=new LNode;if(H)//确认创建头结点创建是否成功,若成功,修改单链表头结点的指针域为0表空表{H->next=NULL;}return H;}3)向通讯录中插入联系人void Insert_LinkList(LinkList H){LinkList p;p=new LNode;if(!p){cout<<"不能插入!"<<endl;}cout<<"请输入你要插入的联系人信息:"<<endl;cout<<"姓名:"<<endl;cin>>p->name;cout<<"性别:"<<endl;cin>>p->sex;cout<<"手机号码:"<<endl;cin>>p->tel;cout<<"QQ号码:"<<endl;cin>>p->qq;cout<<"地址:"<<endl;cin>>p->ad;p->next=H->next;H->next=p;cout<<"插入成功"<<endl;}4)查询通讯录中某个联系人的信息void Locate_LinkList(LinkList H){int x;LinkList p=H->next;cout<<"你要通过哪种方式查询?"<<endl;cout<<"1.通过联系人姓名查询"<<endl;cout<<"2.通过联系人手机号码查询"<<endl;cout<<"3.通过联系人QQ号码查询"<<endl;cin>>x;char str[30];if(x==1){cout<<"请输入你要查询的联系人的姓名:";cin>>str;while(p && strcmp(p->name,str)!=0){p=p->next;}}if(x==2){cout<<"请输入你要查询的联系人的手机号码:";cin>>str;while(p&&strcmp(p->tel,str)!=0){p=p->next;}}if(x==3){cout<<"请输入你要查询的联系人的QQ号码:";cin>>str;while(p&&strcmp(p->qq,str)!=0){p=p->next;}}if(p==NULL){cout<<"没有找到你要查找的联系人的信息!"<<endl;}else{cout<<"你要找的联系人的信息为:"<<endl;cout<<"姓名:"<<p->name<<endl;cout<<"性别:"<<p->sex<<endl;cout<<"手机号:"<<p->tel<<endl;cout<<"QQ号码"<<p->qq<<endl;cout<<"地址"<<p->ad<<endl;}}5)删除通讯录中某个联系人的信息void Delete_LinkList(LinkList H){if(H->next==NULL){cout<<"通讯录为空,不能删除"<<endl;}else{int x;char str[30];LinkList p,q;p=H->next;cout<<"请输入你要删除的方式:"<<endl;cout<<"1.按照联系人的姓名删除"<<endl;cout<<"2.按照联系人的手机号码删除"<<endl;cout<<"3.按照联系人的QQ号码删除"<<endl;cin>>x;q=H;if(x==1){cout<<"请输入你要删除的联系人的姓名:"<<endl;cin>>str;while(strcmp(p->name,str)!=0){q=p;p=p->next;}}if(x==2){cout<<"请输入你要删除的联系人的手机号码:"<<endl;cin>>str;while(strcmp(p->tel,str)!=0){q=p;p=p->next;}}if(x==3){cout<<"请输入你要删除的联系人的QQ号码:"<<endl;cin>>str;while(strcmp(p->qq,str)!=0){q=p;p=p->next;}}if(p==NULL){cout<<"没有你要删除的联系人的记录"<<endl;}else{q->next=p->next;p->next=NULL;free(p);cout<<"该联系人已删除"<<endl;}}}6)输出所有联系人void print_LinkList(LinkList H){if(H->next==NULL){cout<<"通讯录为空"<<endl;}else{LinkList p;p=H->next;while(p!=NULL){cout<<"性别:"<<p->sex<<endl;cout<<"手机号:"<<p->tel<<endl;cout<<"QQ号码:"<<p->qq<<endl;cout<<"地址:"<<p->ad<<endl;p=p->next;}}}7)主函数void main(){int a;LinkList List;List=Creat_LinkList();do{cout<<"*****欢迎进入通讯录管理*****"<<endl;cout<<"*****添加联系人请按1*****"<<endl;cout<<"*****查找联系人请按2*****"<<endl;cout<<"*****删除联系人请按3*****"<<endl;cout<<"*****输出所有联系人请按4*****"<<endl;cout<<"*****退出请按0*****"<<endl;cout<<"请输入你的选择:"<<endl;cin>>a;switch(a){case 0:break;case 1:Insert_LinkList(List);break;case 2:Locate_LinkList(List);break;case 3:Delete_LinkList(List);break;case 4:print_LinkList(List);break;}cout<<"操作完毕,请再次选择!"<<endl;}while(a!=0);}3.4 测试运行程序,看到主界面。
通讯录管理系统(C语言)—单链表(总36页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--广州大学物理与电子工程学院程序与设计训练通讯录管理系统实验报告专业班级:电子121设计人员:元达鹏学号:652013年6月24日通讯录管理系统一.需求分析设计题目及需求:(1)查看功能:选择此功能时,列出下列三类选择。
A 办公类 B 个人类 C 商务类,当选中某类时,显示出此类所有数据中的姓名和电话号码)(2)增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件。
例如:杨春商务类(3)当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改(5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
系统功能需求分析:主要包含以下几种功能:1.建立通讯录(建立功能)2.删除通讯人(删除功能)3.保存通讯录(保存功能)4.读取通讯录文件(读取功能)5.查找通讯人(查找功能)6.添加通讯人(添加功能)7.修改通讯人信息(修改功能)8.退出通讯录系统二.概要设计系统功能模块图:建立功能:在主菜单中输入1,进入建立功能。
用户自己输入通讯录文件名,建立一个新的通讯录,便开始输入信息,一旦想结束添加,在输入姓名处输入“*”结束录入。
(当录入相同的姓名和电话时,系统会告诉你已经重复录入)删除功能:在主菜单中输入2,进入删除功能。
用户输入待删除人的姓名,系统会自动显示待删除人的信息,并且提示是否删除该通讯人。
(当输入的姓名不存在的时候,系统会告诉你此人不存在)保存功能:在主菜单中输入3,进入保存功能。
将你已经写好的通讯录保存在建立时创建的文件里面。
实验报告实验名称单链表通讯录一、实验目的1.熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验内容1.用带头结点的单链表作存储结构,实现通讯录单链表的建立、查询、修改、排序、合并、统计、结点的查找、移动以及通讯录链表的输出功能。
三、实验要求设计要求:为了实现通讯录管理的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
主控菜单设计要求:菜单内容程序运行后,给出9个菜单项的内容和输入提示:1.创建通讯录链表;2.将姓名为Name的好友的手机号改为MTel;3.输出通讯录;4.插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名>Name的结点放到该结点后面5.将通讯录按照好友姓名进行非递减排序;6.将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个;7.统计籍贯是“大连”的好友人数;8.将通讯录中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序);9.将通讯录的正中间位置结点之后的全部结点倒置;0.退出管理系统请选择0—9:菜单设计要求:使用数字0—9来选择菜单项,其它输入则不起作用。
四、实验概要设计1)功能框图五. 使用说明1.运行环境:VC6.02.首先选择主控菜单中的操作1,即建表,然后进行其它操作.六.实验截图(见下页)七实验体会附源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define Newsp (TxlList *)malloc(sizeof(struct TxlList))typedef struct TxlList{char Name[16]; //姓名char MTel[11]; //手机号char Tel[9]; //固定电话char EMail[16]; //邮箱地址char BornAddr[20]; //籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称)char BroadN[50]; //博客名struct TxlList *next; //指针域}TxlList, *TxlLink;void Lbuild1(TxlLink &T){//创建文件FILE *fp;TxlLink q;q=Newsp;q=T;int NUM;char filename[20];printf("\n*请输入要创建的通讯录名:\n");gets(filename);if ((fp=fopen(filename, "wb"))==NULL) { /*以写方式在当前目录打开(新建)文件*/printf("can't open file!!!\n");exit(0); //如果文件无法打开,关闭已经打开的其它文件,结束程序。
数据结构课程设计通讯录管理系统
数据结构课程设计中的通讯录管理系统可以涉及到以下几个方面的知识点:
1. 数据结构:通讯录管理系统中需要使用到的数据结构包括数组、链表、哈希表等。
其中,数组用于存储通讯录中的人员信息,链表用于存储联系人信息,哈希表用于实现快速查找功能。
2. 算法:通讯录管理系统中需要使用到的算法包括查找算法、排序算法、动态规划算法等。
其中,查找算法用于实现快速查找联系人功能,排序算法用于实现通讯录的排序功能,动态规划算法用于实现最长公共子序列问题等。
3. 数据库:通讯录管理系统需要使用到数据库来存储通讯录中的数据。
需要掌握关系型数据库的设计和操作,包括数据表的设计、SQL 语句的编写等。
4. 界面设计:通讯录管理系统需要有友好的用户界面,需要进行界面设计和开发,包括前端技术的使用,如HTML、CSS和JavaScript等。
5. 系统测试:通讯录管理系统需要进行系统测试,包括功能测试、性
能测试等,确保系统能够正常运行并满足用户需求。
通过设计和实现通讯录管理系统,可以锻炼学生对数据结构和算法的理解和应用能力,同时还能提高学生的编程能力和团队合作能力。
单链表通讯录安徽工程大学机电学院课程设计说明书课程设计名称: C语言程序设计课程设计题目:简单通讯录指导老师:伊芸芸专业班级:电气2132 学生姓名:洪培鑫学号: 313107040208起止日期:2021年6月23日 ~ 14年7月4日第一章1.1 题目要求简单通讯录 1.2主要任务问题要求及任务描述1、建立并保存新的通讯录,信息至少包含姓名、性别、电话号码、地址;2、能够把通讯者信息插入通讯录;3、、能够提供按不同方式查询的功能,如按姓名或性别等;4、能够提供按不同方式删除的功能,如按姓名或性别等;5、能够输出文件中的通讯录信息;6、可以退出通信录管理系统;1.3进行概要的需求分析。
(根据功能需求,设计系统的总体结构。
系统总体功能模块图,菜单的设计) 菜单:菜单:系统总体功能模块:主菜单添加学生信息删除学生信息查询学生信息查询全部学生信息退出程序第二章解决问题的主要方法和思路2.1关键问题1.课程设计(实训)计划星期三:确认实训题目,并进行系统分析。
星期四:编写代码实现功能。
星期五:测试代码,完成实验报告并提交。
2.系统需求分析与功能设计(根据课题的要求进行简单的需求分析,设计相应的数据流图,得出相应的系统功能需要, 系统数据流图)1、建立并保存新的通讯录,信息至少包含姓名、性别、电话号码、地址;2、能够把通讯者信息插入通讯录;3、能够提供按不同方式查询的功能,如按姓名或性别等;4、能够提供按不同方式删除的功能,如按姓名或性别等;5、能够输出文件中的通讯录信息;6、可以退出通信录管理系统;(根据功能需求,设计系统的总体结构。
系统总体功能模块图,菜单的设计)菜单:系统总体功能模块:4. 程序模块设计(设计并编写输入\\输出、查询\\统计、数据维护等功能模块的应用程序, 每个人设计2个以上的模块,一个组完成一个完整的系统,数据库访问,存储过程调用等作重点阐述)/* 单链表通讯录 */#include #include #include #includeint iFlag = 0; //定义标记, 来确定是否建立单链表成功/* 通讯录结点类型 */ typedef struct { int iId; //编号 char cName[10]; //姓名 char cTelephone[20]; //电话号码 char cCode[10]; //邮政编码 char cAddress[100]; //通信地址 char cEmail[20]; //email地址 }t_Information; //end of struct/* 结点类型定义 */ typedef struct node {t_Information data; //结点数据域 struct node *next; //结点指针域 } ListNode, *LinkList;//end of struct nodeLinkList head; ListNode *p;/************************************************************************** * 函数名称: Menu * 功能描述:显示函数 * 访问的表:空 * 修改的表:空 * 输入参数: * 输出参数: * 返回值:空 * 其它说明:* 修改日期版本号修改人修改内容 * -----------------------------------------------* 2021/10/11 V1.0 XXXX XXXX感谢您的阅读,祝您生活愉快。
数据结构-链表(⼆)-通讯录-C++实现通讯录的元素是⼈,所以需要新建⼀个Person类作为链表每个Node的元素。
并且为了正常输出,Person还需要⾍重载⼀些运算符,包括输出<<,判等==main函数⾥也要写⼀些辅助函数来获取信息。
链表本⾝实现部分不需要修改太多,把原来的的int型元素改为Person类型即可代码如下//Person.h#pragma once#include<iostream>#include<string>using namespace std;class Person{friend ostream& operator<<(ostream& out,Person &p){out << "Name: "<<<<"---" <<"Pnone number: "<< p.phone << endl;return out;}public:Person(string na, int num);Person();~Person();bool operator ==(Person &p){if ((this->name == ) && (this->phone == p.phone)){return true;}else{return false;}}string name="张三";int phone=0;private:};//Person.cpp#include"Person.h"Person::Person(string na, int num):name(na),phone(num){}Person::Person(){}Person::~Person(){}//Node.h#pragma onceusing namespace std;#include<iostream>#include"Person.h"class Node{public:Node(Person a);Node();~Node();Person person;Node* next;private:};//Node.cpp#include"Node.h"Node::Node(Person a):person(a){}Node::Node(){}Node::~Node(){}//List.h#pragma once#include<iostream>using namespace std;#include"Node.h"#define __debug__#ifdef __debug__#endifclass List{public:List();//~List();//bool get_add_head(Node* e);//在头节点后⾯插⼊bool get_add_tail(Node* e);//在尾节点后⾯插⼊void get_traverse();//遍历int get_length();//获取长度bool get_empty();//判空void get_clear();//清空线性表int get_ele_num(Node* p);//获取与传⼊参数值相同的链表中元素的序号 bool get_i_ele(int e, Node* value);//获指定位序的元素void get_delete(int location);//删除某位置元素bool get_add(int location, Node* e);//添加在某位置元素bool get_pre(Node* e, Node* pre);//获取前驱bool get_post(Node* e, Node* pos);//获取后继private:Node* node;//头节点int length;};//List.cpp#include"List.h"List::List(){length = 0;node = new Node;node->="zhangsan";node->person.phone = 0;node->next = NULL;}List::~List(){get_clear();delete node;node = NULL;}bool List::get_add_head(Node* e){Node* c_node = new Node;c_node=node->next;Node* new_node = new Node;if (new_node == NULL){return false;}new_node->person = e->person;new_node->next = c_node;node->next = new_node;length++;#ifdef __debug__cout << node->next->person << endl;#endifreturn true;}bool List::get_add_tail(Node* e){Node* c_node = new Node;c_node = node;while (c_node->next!=NULL){c_node = c_node->next;}Node* new_node = new Node;if (new_node == NULL){return false;}new_node->person = e->person;new_node->next = NULL;c_node->next = new_node;length++;#ifdef __debug__cout << c_node->next->person << endl;#endifreturn true;}void List::get_traverse(){Node* c_node = new Node;c_node = node->next;while (c_node != NULL){cout << c_node->person << endl;c_node = c_node->next;}}//遍历int List::get_length(){return length;}//获取长度bool List::get_empty(){return length == 0 ? true : false;}void List::get_clear(){Node* c_node = new Node;c_node = node;while(c_node->next != NULL){Node* new_node = new Node;new_node=c_node->next;delete c_node;//清除指向的内容c_node = new_node;}length = 0;node->next = NULL;//易错,勿忘!}//清空线性表int List::get_ele_num(Node* p)//获取元素的位序{Node* c_node = new Node;c_node=node;int count = 1;while (c_node->next != NULL){c_node = c_node->next;if (c_node->person == p->person){return count;}else{count++;}}return -1;}bool List::get_i_ele(int e, Node* value){if (e <1 || e > length){cout << "Invalid num!" << endl;return false;}Node* c_node = new Node;c_node = node;for (int i = 0; i <e; i++){c_node = c_node->next;}value->person = c_node->person;#ifdef __debug__cout << c_node->person << endl;#endifreturn true;}//获指定位序元素的值//void List::get_delete(int location){if (location<1 || location>length ){cout << "invalid num!!" << endl;}else{Node* c_node = new Node;c_node = node;Node* c_node_before = new Node;for (int i = 0; i < location; i++)//遍历到了location对应的位置,与增加元素有所不同,需要注意! {c_node_before = c_node;c_node = c_node->next;}c_node_before->next = c_node->next;length--;}}//某位置删除元素//bool List::get_add(int location, Node* e){if (location<1 || location>length){cout << "Invalid num!" << endl;return false;}else{Node* c_node = new Node;c_node=node;for (int i = 0; i < (location-1); i++){c_node = c_node->next;}//此时是遍历到了(location-1)那个元素的位置,然后在其后⾯插⼊新元素则是第location个元素。
实验报告实验名称单链表通讯录一、实验目的1.熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验内容1.● 用带头结点的单链表作存储结构,实现通讯录单链表的建立、查询、修改、排序、合并、统计、结点的查找、移动以及通讯录链表的输出功能。
三、实验要求● 设计要求:为了实现通讯录管理的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
主控菜单设计要求:♦ 菜单内容程序运行后,给出9个菜单项的内容和输入提示:1.创建通讯录链表;2.将姓名为Name的好友的手机号改为MTel;3.输出通讯录;4.插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名>Name的结点放到该结点后面5.将通讯录按照好友姓名进行非递减排序;6.将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个;7.统计籍贯是“大连”的好友人数;8.将通讯录中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序);9.将通讯录的正中间位置结点之后的全部结点倒置;0.退出管理系统请选择0—9:♦ 菜单设计要求:使用数字0—9来选择菜单项,其它输入则不起作用。
四、实验概要设计1)功能框图五. 使用说明1.运行环境:VC6.02.首先选择主控菜单中的操作1,即建表,然后进行其它操作.六.实验截图(见下页)七实验体会附源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define Newsp (TxlList *)malloc(sizeof(struct TxlList))typedef struct TxlList{char Name[16]; //姓名char MTel[11]; //手机号char Tel[9]; //固定电话char EMail[16]; //邮箱地址char BornAddr[20];//籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称)char BroadN[50]; //博客名struct TxlList *next; //指针域}TxlList, *TxlLink;void Lbuild1(TxlLink &T){//创建文件FILE *fp;TxlLink q;q=Newsp;q=T;int NUM;char filename[20];printf("\n*请输入要创建的通讯录名:\n");gets(filename);if ((fp=fopen(filename, "wb"))==NULL) { /*以写方式在当前目录打开(新建)文件*/printf("can't open file!!!\n");exit(0); //如果文件无法打开,关闭已经打开的其它文件,结束程序。
}printf("*请输入要储存的人数:");scanf("%d",&NUM);getchar();for(int a=0;a<NUM;a++){TxlLink p;p=Newsp;printf("\n*请输入第%d个人的数据,按回车键结束,数据若为空请输“无”",a+1);printf("\n*姓名:");gets(p->Name);printf("*手机号:");gets(p->MTel);printf("*固定电话:");gets(p->Tel);printf("*邮箱地址:");gets(p->EMail);printf("*籍贯:");gets(p->BornAddr);printf("*博客名:");gets(p->BroadN);p->next=NULL;q->next=p;q=q->next;if(fprintf(fp,"%s %s %s %s %s %s\n",p->Name,p->MTel,p->Tel,p->EMail,p->BornAddr,p->Broad N)==1)//向文件中一次写一个结构体量值{printf("file write error\n");break;}}fclose(fp);}void Lbuild2(TxlLink &T){//读取文件FILE *fp;TxlLink q;q=Newsp;q=T;char filename[20];printf("\n*请输入要读取的通讯表名:\n");gets(filename);if((fp=fopen(filename,"rb"))==NULL){printf("can't open file!!!\n");exit(0); //如果文件无法打开,关闭已经打开的其它文件,结束程序。
}while(!feof(fp)){TxlLink p;p=Newsp;fscanf(fp,"%s %s %s %s %s %s ",p->Name,p->MTel,p->Tel,p->EMail,p->BornAddr,p->BroadN);q->next=p;p->next=NULL;q=q->next;}fclose(fp);}void Build(TxlLink &T){//选择建立方式的函数int Choice;printf("*******************************************************************") ;printf("\n*请输入想要实现的功能编号:\n");printf("*1.新建通讯录;\n*2.输出已有有通讯录;\n*其它-退出。
\n*选择为:");scanf("%d",&Choice);printf("*******************************************************************") ;getchar();switch(Choice){case 1:{Lbuild1(T);break;}case 2:{Lbuild2(T);break;}default:{printf("无通讯录\n\n");break;}}}void Update(TxlLink &T, char *Name, char *MTel){//将姓名为Name的好友的手机号改为MTel;TxlLink p;p=T->next;while(p){if(strcmp(p->Name,Name)==0){strcpy(p->MTel,MTel);}p=p->next;}}void Buildnew(TxlLink &T){//创建一个空资料单元char a[]="无";strcpy(T->Name,a);strcpy(T->MTel,a);strcpy(T->EMail,a);strcpy(T->BornAddr,a);strcpy(T->BroadN,a);strcpy(T->Tel,a);T->next=NULL;}void OutPut(TxlLink T){//输出通讯表数据TxlLink p;p=Newsp;p=T->next;printf("*******************************************************************") ;printf("\n*通讯录信息:\n姓名,手机号,固定电话,邮箱地址,籍贯,博客名分别为:\n");while(p){printf("%s %s %s %s %s %s\n",p->Name,p->MTel,p->Tel,p->EMail,p->BornAd dr,p->BroadN);p=p->next;}}void Sort(TxlLink &T){ //将该通讯录按照好友姓名进行非递减排序TxlLink p,q,r;p=T;q=p->next;int SUM=0;while(q){//记录通讯表数据个数SUM++;q=q->next;}q=p->next;for(int i=0;i<SUM;i++){for(int j=0;j<SUM-i;j++){r=q->next;if(r){if(strcmp(q->Name,r->Name)>0){p->next=r;q->next=r->next;r->next=q;}p=p->next;q=p->next;}}p=T;q=p->next;r=q->next;}}void Merge(TxlLink &T1, TxlLink &T2){ //将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个Sort(T1);Sort(T2);TxlLink p,q,r,t,head;p=T1->next;q=T2->next;head=T1;while(p||q){r=p;t=q;if(strcmp(p->Name,q->Name)>0){q=q->next;head->next=t;head=head->next;head->next=NULL;printf("w ");}else if(strcmp(p->Name,q->Name)<0){p=p->next;head->next=r;head=head->next;head->next=NULL;}else {if(strcmp(p->MTel,q->MTel)>0){q=q->next;head->next=t;head=head->next;head->next=NULL;}else if(strcmp(p->MTel,q->MTel)<0){p=p->next;head->next=r;head=head->next;head->next=NULL;}else{p=p->next;free(r);printf("x ");}}if(!p){while(q){head->next=q;q=q->next;head=head->next;head->next=NULL;}}if(!q){while(p){head->next=p;p=p->next;head=head->next;head->next=NULL;}}}T2=T1;}void Insert(TxlLink &T, char *Name, char *MTel){ //插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名>Name的结点放到该结点后面;Sort(T);TxlLink p,q,r;int n=1;r=Newsp;Buildnew(r);strcpy(r->Name,Name);strcpy(r->MTel,MTel);p=T->next;q=p->next;while(q){if(strcmp(p->Name,r->Name)>=0){T->next=r;r->next=p;n=0;break;}if(strcmp(p->Name,r->Name)<=0){if(strcmp(q->Name,r->Name)>=0){p->next=r;r->next=q;n=0;break;}}p=p->next;q=q->next;}if(n==1){p->next=r;}}int Count(TxlLink T){//统计籍贯是某地的好友人数;int x=0;char BornAddr[20];TxlLink p;p=T->next;printf("*请输入要查询的地址:");gets(BornAddr);while(p){if(strcmp(p->BornAddr,BornAddr)==0)x++;p=p->next;}return x;}int Number1(TxlLink p,TxlLink &r,TxlLink &t,int k){//运用递归方法找到倒数第k个结点的地址int x=0;TxlLink q;if(p){q=p;p=p->next;x=Number1(p,r,t,k)+1;}if(k==x)r=q;if((k+1)==x)t=q;return x;}int Number2(TxlLink p,TxlLink &r,TxlLink &t,int &k){//运用递归方法找到倒数第k个的地址int x=0;TxlLink q;if(p){q=p;k++;p=p->next;x=Number2(p,r,t,k)+1;}if((k/2)==x)r=q;if((k/2+1)==x)t=q;return x;}void MoveK(TxlLink &T, int k){//将通讯录中倒数第k个结点之后的所有结点移到头结点后面int x;TxlLink p,q,r,t;p=T->next;x=Number1(p,r,t,k);T->next=r;t->next=NULL;while(r){q=r;r=r->next;}q->next=p;}void ReverseN(TxlLink T){//将通讯录的正中间位置结点之后的全部结点倒置int k=0;TxlLink p,q,r,t;p=T->next;Number2(p,r,t,k);T->next=r;t->next=NULL;while(r){q=r;r=r->next;}q->next=p;}int main(void){TxlLink P;int x=1;P=Newsp;Build(P);int Choice;while(x){printf("\n*请输入想要实现的功能编号:\n");printf("*1.排序;\n*2.插入信息;\n*3.更改手机;\n*4.合并;\n*5.统计籍贯人数;\n*6.移节点;\n*7.倒置链表;\n*其它-退出。