数据结构单链表通讯录
- 格式:doc
- 大小:281.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. 系统测试:通讯录管理系统需要进行系统测试,包括功能测试、性
能测试等,确保系统能够正常运行并满足用户需求。
通过设计和实现通讯录管理系统,可以锻炼学生对数据结构和算法的理解和应用能力,同时还能提高学生的编程能力和团队合作能力。
数据结构通讯录的制作目录1.引言1.1 目的1.2 背景信息2.需求分析2.1 功能需求2.2 性能需求3.设计3.1 数据结构选择3.2 数据存储方式4.实现4.1 系统架构4.2 数据结构的定义和实现4.3 数据存储与读取4.4 用户界面设计5.测试和验证5.1 单元测试5.2 集成测试6.部署和维护6.1 系统部署6.2 用户培训6.3 维护与更新7.法律名词及注释8.附件1.引言1.1 目的本文档旨在指导开发人员制作一个基于数据结构的通讯录,以满足用户对通讯录管理的需求。
1.2 背景信息随着通讯录的普及和数据量的增加,需要设计一种高效的数据结构来存储和管理通讯录中的联系人信息。
2.需求分析2.1 功能需求通讯录系统应具有以下功能:- 添加联系人:可以输入联系人的姓名、方式号码、电子邮件等信息。
- 删除联系人:根据姓名或其他唯一标识符删除联系人。
- 查找联系人:可以根据姓名或其他关键信息查找联系人。
- 修改联系人信息:可以对联系人的姓名、方式号码、电子邮件等信息进行修改。
- 显示通讯录:可以将通讯录中的所有联系人按照指定格式进行展示。
2.2 性能需求为了保证通讯录系统的性能,需要满足以下要求:- 系统响应时间应尽量短,使用户能够快速完成操作。
- 数据存储和读取的效率应高,以提高系统的整体性能。
- 系统应具备较高的容错性,能够在异常情况下继续正常运行。
3.设计3.1 数据结构选择为了高效地存储和管理联系人信息,我们选择使用哈希表作为主要数据结构。
哈希表可以实现快速的插入、删除和查找操作。
3.2 数据存储方式为了提高数据存储和读取的效率,我们选择将通讯录数据存储在内存中。
这样可以避免频繁的磁盘读写操作,提高系统的响应速度。
4.实现4.1 系统架构通讯录系统的实现可以分为三层架构:界面层、业务逻辑层和数据存储层。
界面层负责用户与系统的交互,业务逻辑层负责对用户请求进行处理,数据存储层负责数据的存储和读取。
单链表通讯录安徽工程大学机电学院课程设计说明书课程设计名称: 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感谢您的阅读,祝您生活愉快。
数据结构实验报告实验名称:实验一——线性表学生姓名:大学霸班级:xxxxxxxxxx班内序号:xx学号:xxxxxxxxxx日期:2012年11月1日1.实验要求实验目的:1.学习指针,模板类,异常处理的使用;2.掌握线性表的操作实现方法;3.培养使用线性表解决实际问题的能力。
实验内容:利用线性表实现一个通讯录管理,通信录的数据格式如下:struct DataType{int ID; //编号char name[10]; //姓名char ch; //性别char phone[13]; //电话char addr[31]; //地址};具体要求:1.实现通信录的建立、增加、删除、修改、查询等功能2.能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作3.能够保存每次更新的数据4.编写main()函数测试操作的正确性2. 程序分析编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。
每个记录包含姓名、电话号码、住址等个人基本信息。
用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。
本程序为使用方便,几乎不用特殊的命令,只需按提示输入即可,适合更多的用户使用。
对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
2.1 存储结构节点结构:2.2 关键算法分析本实验从整体上分为七大模块:(1)输入联系人信息;(2)添加联系人信息;(3)查找联系人信息;(4)查看联系人信息;(5)删除联系人信息;(6)修改联系人信息;(7)退出通讯录管理。
通讯录系统图2.2.1通讯录的建立伪代码:1.在堆中申请新的结点;2.新节点的数据域为a[i];3.将新节点加入到链表中;4.修改尾指针;5.全部结点插入后需要将终结结点的指针域设为空。
C++实现:ContactBook::ContactBook(DataType a[],int n)//尾插法{front=new Node;rear=new Node;rear=front; //构造空单链表for(int i=0;i<n;i++){Node * s=new Node; //建立新节点s->data=a[i]; //写入数据域rear->next=s; //将新节点加入到链表中rear=s; //修改尾指针}rear->next=NULL; //终端节点的指针域设为空}时间复杂度:o(n)2.2.2通讯录的插入伪代码:插入为建立的一种特殊形式,即插入一个单独的结点,方法与上述类似C++实现:void ContactBook::Add(DataType a)//尾插法{Node * s=new Node;s->data=a;rear->next=s;rear=s;rear->next=NULL;}时间复杂度:o(1)2.2.3按ID查找查找操作是指用户输入要查找的用户的ID,系统该函数内找到该用户,返回用户数据域的指针,在主函数中输出该用户的全部信息。
单链表通讯录课程设计一、课程目标知识目标:1. 学生能理解单链表的数据结构,掌握其在通讯录中的应用原理。
2. 学生能掌握单链表的基本操作,包括创建、插入、删除和查找等。
3. 学生能理解并运用单链表解决实际问题,如实现一个简单的通讯录系统。
技能目标:1. 学生能运用所学知识,自主设计并实现单链表通讯录程序。
2. 学生能通过编程实践,培养逻辑思维能力和解决问题的能力。
3. 学生能运用调试工具,分析并解决单链表通讯录程序中的错误。
情感态度价值观目标:1. 学生在学习过程中,培养对数据结构及编程的兴趣和热情。
2. 学生通过团队协作,培养沟通能力和合作精神。
3. 学生认识到单链表在通讯录等实际应用中的价值,提高对计算机科学的认识。
课程性质:本课程为计算机科学与技术领域的一门实践性课程,旨在让学生掌握单链表数据结构及其在通讯录中的应用。
学生特点:学生为高中二年级学生,具备一定的编程基础和逻辑思维能力,对数据结构有一定了解。
教学要求:教师应注重理论与实践相结合,引导学生通过动手实践,掌握单链表通讯录的设计与实现。
同时,关注学生的个体差异,鼓励学生提问、讨论,提高学生的主动学习能力。
在教学过程中,注重培养学生的团队合作精神和情感态度价值观。
通过本课程的学习,使学生能够将所学知识应用于实际问题的解决中。
二、教学内容1. 单链表基本概念:介绍单链表的定义、特点及在数据结构中的地位。
教材章节:第二章第二节2. 单链表的基本操作:a. 创建单链表b. 插入节点c. 删除节点d. 查找节点教材章节:第二章第三节3. 单链表的应用:以通讯录为例,讲解单链表在实际编程中的应用。
教材章节:第二章第四节4. 单链表通讯录程序设计:a. 设计通讯录数据结构b. 编写插入、删除、查找等基本功能函数c. 实现用户界面及功能模块教材章节:第二章第五节5. 程序调试与优化:a. 分析单链表通讯录程序可能出现的错误b. 介绍调试方法及技巧c. 优化程序性能教材章节:第二章第六节教学内容安排与进度:第一课时:单链表基本概念第二课时:单链表的基本操作第三课时:单链表的应用及通讯录数据结构设计第四课时:编写单链表通讯录基本功能函数第五课时:实现用户界面及功能模块,程序调试与优化三、教学方法1. 讲授法:教师通过生动的语言、形象的比喻,讲解单链表的基本概念、原理和操作方法。
一、实验目的1、能够利用单链表的基本运算进行单链表的相关操作。
2、加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。
3、熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的建立、查找、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验环境具有Windows XP或2003的计算机、V istual C++ 6.0、网络环境。
三、实验内容设计一个班级同学的通讯录,要求如下:✓通讯录中每个同学的信息包含以下内容:学号(id)、姓名(name)、电话号码(tel)。
如果需要更多其他信息,请自行添加。
✓程序主菜单包含以下几个功能:(1)添加记录:通过键盘输入信息,添加一条通讯录记录。
(2)删除记录:通过键盘输入学号,删除该学号的记录。
(3)输出记录:输出通讯录全部记录。
(4)按姓名查找:通过键盘输入姓名,输出该同学的所有信息。
(5)按电话号排序:按电话号码从小到大排序并输出排序后的信息。
(6)清空记录:删除通讯录中的全部记录,并删除文件。
(7)退出。
程序清单#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 20typedef struct student{char tel[N];char name[N];char id[N];struct student *next;}linklist;//创建信息void createlist(linklist *&l){int ch;linklist *s,*p;printf("***********创建通讯录***********\n");printf("----请输入通讯者信息-----:\n请输入非零整数,输入0则退出:\n");scanf("%d",&ch);l=(linklist *)malloc(sizeof(linklist));s=l;while(ch!=0){p=(linklist *)malloc(sizeof(linklist));printf("请输入通讯者姓名:");scanf("%s",p->name);printf("请输入通讯者电话号:");scanf("%s",p->tel);printf("请输入通讯者身份证号:");scanf("%s",p->id);s->next=p;s=p;printf("请输入通讯者信息:\n请输入非零整数,输入0则退出:\n");scanf("%d",&ch);}s->next=NULL;}//删除信息void listdelete(linklist *&l,int t ){int j=0;linklist *p,*q;p=l;while(p!=NULL&&j<t-1){j++;p=p->next;}if(p==NULL)exit(0);else{q=p->next;if(q==NULL)exit(0);p->next=q->next;printf("***************删除系统**************\n");printf("-------你将删除的联系人的信息为-------:\n");printf("通讯者姓名:%s\n",q->name);printf("通讯者电话号:%s\n",q->tel);printf("通讯者身份证号:%s\n",q->id);printf("******-------******删除成功******------*******\n");free(q);}}//输出信息void output(linklist *l){linklist *p;p=l->next;printf("----***----输出所有联系者信息----***----:\n");while(p!=NULL){printf("通讯者姓名:%s\n",p->name);printf("通讯者电话号:%s\n",p->tel);printf("通讯者身份证号:%s\n",p->id);printf("*****************************\n");p=p->next;}}//按姓名查找void findname(linklist *l){char n[N];linklist *p=l->next;printf("***************查找系统*************\n");printf("----------请输入要查找的姓名---------:\n");scanf("%s",n);while(p!=NULL){if(strcmp(p->name,n)){printf("-----***--你要查找的资料为--***----:\n");printf("通讯者姓名:%s\n",p->name);printf("通讯者电话号:%s\n",p->tel);printf("通讯者身份证号:%s\n",p->id);printf("*****************************");break;}elsep=p->next;}}//按电话号排序void sorttel(linklist *&l){linklist *p,*q,*s;q=l;p=q->next->next;q->next->next=NULL;while(p){while(q->next&&(strcmp(p->tel,q->next->tel)>0))q=q->next;s=p->next;p->next=q->next;q->next=p;p=s;q=l;}}//清空void release(linklist *&l){linklist *p,*q;p=l;q=p->next;while(q!=NULL){free(p);p=q;q=p->next;}free(p);printf("--------数据已全部被清空----------\n,*****内存回收*****\n"); }//主函数void main(){int i,t;linklist *l;while(1){printf("通讯录功能如下:\n1.建立通讯录信息\n2.删除信息\n3.输出信息\n4.按姓名查找信息\n5.按电话号排序信息\n6.清空信息\n7.退出");scanf("%d",&i);if(i<=0||i>7)break;switch(i){case 1:createlist(l);break;case 2:printf("---------请输入第t个要删除的信息---------:\n");scanf("%d",&t);listdelete(l,t);break;case 3:output(l);break;case 4:findname(l);break;case 5:sorttel(l);printf("-----***---&&&--这是按电话号排序后的信息列表--&&&---***-----\n");output(l);break;case 6:release(l);break;case 7:break;}}}运行结果:建立通讯录信息运行结果截图:输入零后通讯录信息输出结果截面图:查询通讯录信息运行结果截图:通讯录信息排序运行结果截图:删除通讯录信息运行结果截图:删除通讯录信息后的输出结果截面图:清空通讯录信息的运行结果截面图:四、实验心得与小结通过这次的上机实验,使我学到了一些回顾了以前学过的知识,使我对数据结构程序设计有了更深层次的认识和理解,懂得了灵活运用。
C++语言课程设计学号:*********姓名:楚归羽指导老师:张目录一、程序功能 (2)二、题目分析 (2)三、设计中遇到的问题及解决方法 (2)四、感想与心得 (2)五、程序说明 (2)六、函数调用关系及主要算法的实现 (8)七、数据测试 (8)一、程序功能程序采用单向链表类结构实现实现通讯录多个纪录的管理工作。
1、提示输入个字段,一次输入一个人的数据2、输入待删除记录的姓名,显示其所有信息,让用户确认是否删除3、按顺序显示所有记录,每显示10条记录暂停,按Enter继续4、输入姓名,显示其所有信息5、用户输入姓名,系统显示该姓名下所有信息,同时显示子菜单,用户按子菜单提示进行修改6、从实现建立的正文文件中批量导入数据。
程序运行时,用户需输入正文文件名7、将库表中数据写入一个正文文件中。
程序运行时,用户需输入正文文件名8、首先显示当前排序关键字,然后提示是否需要改变。
系统默认按姓名排序,可在按办公室电话排序之间切换9、退出系统二、题目分析程序采用单向链表类结构实现,每个结点代表一个通讯记录。
链表类实现通讯录多个纪录的管理工作。
三、设计中遇到的问题及解决方法初次接触课程设计,刚刚拿到题目,实在是茫然无头绪,于是反复研究了题目,仔细复习了链表部分的知识点,加上和同学的讨论,终于是有了一个大概的思路。
刚开始着手编写的时候问题不断,幸好经过练习册上的指示,搭好了基本的框架,可是链表部分仍然是出了很大的问题,经过自己的反复实验与不断努力终于编译成功。
后面的文本文件的读入与写入则是另一个难题,因为这一块练习的不是很多,只在课本上看到了一些皮毛,在编译与调试时也遇到了很大问题。
最后通过看书上的例题并在与同学交流探讨中解决了这些问题。
四、感想与心得C++作为一门必修课程,学习的过程实在是痛苦的,尤其是在编程的时候,因为总是会出现各种各样的错误。
只有通过反复的调试,通过无数次的排错,才能编写出正确的程序,更多的时候,一个很小的很无聊错误就能导致长时间的迷惑。
通讯录——数据结构课程设计通讯录是一个用于存储和管理联系人信息的工具。
在数据结构课程设计中,我们需要设计一个通讯录系统,使用户能够方便地添加、查找、修改和删除联系人信息。
下面是通讯录系统的标准格式文本,详细介绍了系统的功能和实现方法。
一、系统概述通讯录系统是一个基于数据结构的软件应用程序,用于存储和管理联系人信息。
它提供了一系列功能,包括添加联系人、查找联系人、修改联系人和删除联系人。
二、系统功能1. 添加联系人用户可以通过系统界面输入联系人的姓名、电话号码、电子邮件地址等信息,系统将这些信息存储在数据结构中。
每一个联系人的信息应包括惟一的标识符,以便于后续的查找、修改和删除操作。
2. 查找联系人用户可以通过姓名、电话号码或者电子邮件地址等关键字进行联系人的查找。
系统将根据用户提供的关键字,在数据结构中进行搜索,并返回与之匹配的联系人信息。
3. 修改联系人用户可以选择要修改的联系人,并提供新的姓名、电话号码、电子邮件地址等信息。
系统将根据用户提供的联系人标识符,在数据结构中找到对应的联系人,并更新其信息。
4. 删除联系人用户可以选择要删除的联系人,并确认删除操作。
系统将根据用户提供的联系人标识符,在数据结构中找到对应的联系人,并将其从通讯录中删除。
三、系统实现1. 数据结构选择为了高效地存储和管理联系人信息,我们选择使用链表作为数据结构。
每一个节点表示一个联系人,包含姓名、电话号码、电子邮件地址等信息,以及指向下一个节点的指针。
2. 添加联系人用户输入联系人信息后,系统将创建一个新的节点,并将其插入到链表的末尾。
为了保证联系人信息的惟一性,系统将检查新节点的标识符是否与已有节点的标识符重复。
如果重复,则提示用户重新输入。
3. 查找联系人用户输入关键字后,系统将从链表的头节点开始遍历,逐个比较节点中的姓名、电话号码和电子邮件地址与关键字是否匹配。
如果找到匹配的联系人,系统将返回其信息。
如果遍历完整个链表仍未找到匹配的联系人,则提示用户未找到。
数据结构链表的应用通讯录管理实验要求:一、设计一个含有多个菜单项的程序,菜单项内容如下:1通讯录链表的建立2通讯录链表的插入3通讯录链表的查询4通讯录链表的删除5通讯录链表的输出0退出管理系统要求只能用0-5来选择菜单项,其他的输入无效二、分别实现多个菜单项的功能,要求每个功能在操作时都有确认提示三、编写一个程序实现整个通讯录管理系统,把主菜单的生成和各菜单项功能的实现作为子程序或者函数或者过程来实现。
四、要求关键语句必须要写注释。
#include "stdio.h"#include "string.h"#include "stdlib.h"typedef struct abc{ //通讯录结点类型char num[5]; //编号char name[9]; //姓名char sex[3]; //性别char phone[13]; //电话char addr[31]; //地址} DataType;typedef struct node { //结点类型定义DataType data; //结点数据域struct node *next; //结点指针域} ListNode;typedef ListNode *LinkList;LinkList head;ListNode *p;//函数说明int menu_select();LinkList CreateList(void);void InsertNode(LinkList head,ListNode *p);ListNode *ListFind(LinkList head);void DelNode(LinkList head);void PrintList(LinkList head);//主函数void main(){for( ; ; ){switch(menu_select( ) ){case 1:printf("**********************************\n");printf("* 通讯录链表的建立*\n");printf("**********************************\n");head=CreateList( );break;case 2:printf("**********************************\n");printf("* 通讯者信息的添加*\n");printf("**********************************\n");printf("编号(4) 姓名(8) 性别(3) 电话(11) 地址(31)\n"); printf("************************************* \n");p=(ListNode *)malloc(sizeof(ListNode)); //申请新结点scanf("%s%s%s%s%s",p->data.num,p->,p->data.sex, p->data.phone,p->data.addr);InsertNode(head,p);break;case 3:printf("***********************************\n");printf("* 通讯录信息的查询*\n");printf("***********************************\n");p=ListFind(head);if (p!=NULL) {printf("编号姓名性别联系电话地址\n");printf("--------------------------------------------------\n");printf("%s,%s,%s,%s,%s\n",p->data.num,p->,p->data.sex,p->data.phone,p->data.addr);printf("---------------------------------------------------\n");}elseprintf("没有查到要查询的通讯者!\n");break;case 4:printf("***********************************\n");printf("* 通讯录信息的删除*\n");printf("***********************************\n");DelNode(head); //删除结点break;case 5:printf("************************************\n"); printf("* 通讯录链表的输出*\n");printf("************************************\n"); PrintList(head);break;case 0:printf("\t 再见!\n");return;}}}int menu_select( ){int sn;printf(" 通讯录管理系统\n");printf("===================\n");printf(" 1.通讯链表的建立\n");printf(" 2.通讯者结点的插入\n");printf(" 3.通讯者结点的查询\n");printf(" 4.通讯者结点的删除\n");printf(" 5.通讯录链表的输出\n");printf(" 0.退出管理系统\n");printf("==========================\n");printf(" 请选择0-5:");for( ;; ){scanf("%d",&sn);if (sn<0||sn>5)printf("\n\t输入错误,重选0-5:");elsebreak;}return sn;}LinkList CreateList(void){ //尾插法建立带头结点的通讯录链表算法LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点ListNode *p,*rear;int flag=0; //结束标志置0rear=head; //尾指针初始指向头结点while (flag==0){p=(ListNode *)malloc(sizeof(ListNode)); //申新结点printf("编号(4) 姓名(8) 性别电话(11) 地址(31)\n");printf("--------------------------------------------------------------------------------------\n"); scanf("%s%s%s%s%s",p->data.num,p->,p->data.sex,p->data.phone,p->data.addr);rear->next=p; //新结点连接到尾结点之后rear=p; //尾指针指向新结点printf("结束建表吗?(1/0):");scanf("%d",&flag);}rear->next=NULL; //终端结点指针置空return head; //返回链表头指针}void InsertNode(LinkList head,ListNode *p){ListNode *p1,*p2;p1=head;p2=p1->next;while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0){p1=p2; //p1指向刚访问过的结点p2=p2->next; //p2指向表的下一个结点}p1->next=p; //插入p所指向的结点p->next=p2; //连接表中剩余的结点}ListNode *ListFind(LinkList head){// 有序通讯录链表上的查找ListNode *p;char num[5];char name[9];int xz;printf("==================\n");printf(" 1. 按编号查询\n");printf(" 2. 按姓名查询\n");printf("==================\n");printf(" 请选择:");p=head->next; //假定通讯录表带头结点scanf("%d",&xz);if (xz==1) {printf("请输入要查找者的编号:");scanf("%s",num);while (p&&strcmp(p->data.num,num)<0)p=p->next;if ((p==NULL)||strcmp(p->data.num,num)>0) p=NULL; //没有查到要查找的通讯}elseif (xz==2) {printf(" 请输入要查找者的姓名:"); scanf("%s",name);while(p&&strcmp(p->,name)!=0) p=p->next;}return p;}void DelNode(LinkList head){char jx;ListNode *p,*q;p=ListFind(head); //调用查找函数if (p==NULL) {printf("没有查到要删除的通讯者!\n"); return;}printf("真的要删除该结点吗?(y/n):"); scanf("%c",&jx);if (jx=='y'||jx=='Y') {q=head;while ((q!=NULL) &&(q->next!=p))q=q->next;q->next=p->next; //删除结点free(p); //释放被删结点空间printf("通讯者已被删除!\n");}}void PrintList(LinkList head){ListNode *p;p=head->next;printf("编号姓名性别联系电话地址\n");printf("--------------------------------------------------------------------------------\n"); while (p!=NULL){printf("%s,%s,%s,%s,%s\n",p->data.num,p->,p->data.sex,p->data.phone,p->data.addr);printf("---------------------------------------------------------------------------------\n"); p=p->next; //后移一个结点}}。
C语⾔基于单链表实现通讯录功能本⽂实例为⼤家分享了C语⾔基于单链表实现通讯录功能的具体代码,供⼤家参考,具体内容如下#include<stdio.h>#include<stdlib.h>#include<string.h>#pragma warning(disable:4996);//解决VS报严重性代码错误typedef struct LNode{char name[20];double ph_number;struct LNode* next;}LinkNode;//创建通讯录LNode* CreateList(LNode*& L){LNode* s, * r;int n;L = (LNode*)malloc(sizeof(LNode));r = L;printf("请输⼊要创建联系⼈的个数:");scanf("%d", &n);printf("\n");for (int i = 0; i < n; i++){s = (LNode*)malloc(sizeof(LNode));printf("请输⼊第%d个联系⼈的姓名,电话:\n", i + 1);scanf("%s%lf", &s->name, &s->ph_number);printf("\n");r->next = s;r = s;}r->next = NULL;return L;}//添加联系⼈void ListInsert(LNode*& L){LNode* new_s, * r = L;while (r->next != NULL){r = r->next;}new_s = (LNode*)malloc(sizeof(LNode));printf("请输⼊要添加的联系⼈的姓名,电话:\n");scanf("%s%lf", &new_s->name, &new_s->ph_number);printf("\n");r->next = new_s;r = new_s;r->next = NULL;}//查找联系⼈bool Locate(LNode*& L){LNode* p = L->next;char name_[20];printf("请输⼊要查找的联系⼈的姓名:\n");scanf("%s", &name_);printf("\n");while (p != NULL && strcmp(p->name, name_) != 0)//注意判断条件{p = p->next;}if (p == NULL) return false;else return true;}//修改联系⼈bool ModifyList(LNode*& L){LNode* p = L;char name_[20];double ph_number_;printf("请输⼊要修改的联系⼈的姓名:\n");scanf("%s", name_);printf("\n");while (p != NULL && strcmp(p->name, name_) != 0)//注意判断条件 {p = p->next;}if (p == NULL) return false;else {printf("请输⼊修改后的电话号码为:\n");scanf("%lf", &ph_number_);printf("\n");p->ph_number = ph_number_;return true;}}//删除联系⼈bool ListDelete(LNode*& L){LNode* p = L->next, * q = L;char name_[20];printf("请输⼊要删除联系⼈的姓名:\n");scanf("%s", name_);printf("\n");while (p != NULL && strcmp(p->name, name_) != 0)//注意判断条件 {p = p->next;q = q->next;}if (p == NULL)return false;else {q->next = q->next->next;free(p);return true;}}//加载通讯录void DispList(LNode* L){int i = 0;LNode* p = L->next;while (p != NULL){printf("姓名:%s 电话:%.0lf\n", p->name, p->ph_number);p = p->next;i++;}}int main(){printf("*****************************************\n");printf("* *\n");printf("* 1:添加联系⼈ *\n");printf("* *\n");printf("* 2: 查找联系⼈ *\n");printf("* *\n");printf("* 3: 修改联系⼈ *\n");printf("* *\n");printf("* 4: 删除联系⼈ *\n"); printf("* *\n");printf("* 5: 加载通讯录 *\n"); printf("* *\n");printf("*****************************************\n"); printf("\n");LNode* L = CreateList(L);int operand;printf("\n");for (int i = 0; i < 5; i++){printf("请输⼊您要执⾏操作的操作数:\n");scanf("%d", &operand);switch (operand){case 1:ListInsert(L);break;case 2:if (Locate(L) == 1) {printf("找到该联系⼈\n");printf("\n");break;}else {printf("未找到改联系⼈\n");printf("\n");break;}case 3:if (ModifyList(L) == 1) {printf("修改成功\n");printf("\n");break;}else {printf("修改失败\n");printf("\n");break;}case 4:if (ListDelete(L) == 1) {printf("删除成功\n");printf("\n");break;}else {printf("删除失败\n");printf("\n");break;}case 5:DispList(L);break;default:printf("ERROR\n");}}return 0;}运⾏截图以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
实验报告实验名称单链表通讯录一、实验目的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->BroadN)==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->Bo rnAddr,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*其它-退出。