数据结构单链表通讯录
数据结构单链表通讯录设计

#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++实现

数据结构-链表(⼆)-通讯录-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. 学生能理解单链表的数据结构,掌握其在通讯录中的应用原理。
2. 学生能掌握单链表的基本操作,包括创建、插入、删除和查找等。
3. 学生能理解并运用单链表解决实际问题,如实现一个简单的通讯录系统。
技能目标:1. 学生能运用所学知识,自主设计并实现单链表通讯录程序。
2. 学生能通过编程实践,培养逻辑思维能力和解决问题的能力。
3. 学生能运用调试工具,分析并解决单链表通讯录程序中的错误。
情感态度价值观目标:1. 学生在学习过程中,培养对数据结构及编程的兴趣和热情。
2. 学生通过团队协作,培养沟通能力和合作精神。
3. 学生认识到单链表在通讯录等实际应用中的价值,提高对计算机科学的认识。
课程性质:本课程为计算机科学与技术领域的一门实践性课程,旨在让学生掌握单链表数据结构及其在通讯录中的应用。
学生特点:学生为高中二年级学生,具备一定的编程基础和逻辑思维能力,对数据结构有一定了解。
教学要求:教师应注重理论与实践相结合,引导学生通过动手实践,掌握单链表通讯录的设计与实现。
同时,关注学生的个体差异,鼓励学生提问、讨论,提高学生的主动学习能力。
在教学过程中,注重培养学生的团队合作精神和情感态度价值观。
通过本课程的学习,使学生能够将所学知识应用于实际问题的解决中。
二、教学内容1. 单链表基本概念:介绍单链表的定义、特点及在数据结构中的地位。
教材章节:第二章第二节2. 单链表的基本操作:a. 创建单链表b. 插入节点c. 删除节点d. 查找节点教材章节:第二章第三节3. 单链表的应用:以通讯录为例,讲解单链表在实际编程中的应用。
教材章节:第二章第四节4. 单链表通讯录程序设计:a. 设计通讯录数据结构b. 编写插入、删除、查找等基本功能函数c. 实现用户界面及功能模块教材章节:第二章第五节5. 程序调试与优化:a. 分析单链表通讯录程序可能出现的错误b. 介绍调试方法及技巧c. 优化程序性能教材章节:第二章第六节教学内容安排与进度:第一课时:单链表基本概念第二课时:单链表的基本操作第三课时:单链表的应用及通讯录数据结构设计第四课时:编写单链表通讯录基本功能函数第五课时:实现用户界面及功能模块,程序调试与优化三、教学方法1. 讲授法:教师通过生动的语言、形象的比喻,讲解单链表的基本概念、原理和操作方法。
数据结构实验报告2--通讯录

一、实验目的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++链表通讯录完美版

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语⾔基于单链表实现通讯录功能本⽂实例为⼤家分享了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;}运⾏截图以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
算法与数据结构设计_通讯录的实现.doc

题目二:通讯录的实现一,课题内容和要求基本要求:实现一个以带表头结点的单链表为存储结构的通讯录,其中通讯录的信息中包括姓名、电话、地址等数据项。
所设计的系统要有简单的DOS界面,方便用户进行操作,显示以下功能:(1)建立通讯录。
(2)插入、删除、修改通讯录记录(3)查询通讯录记录,要求可按姓名和电话号码查询(4)可按姓名或电话号码对讯录进行排序(5)输出通讯录到文本文件中。
提高要求:建立通讯录时,从文本文件中输入通讯录记录,从而建立通讯录。
分配该题目的学生学号:10001111-10001120二、需求分析(1)建立一个类,类中包含添加联系人函数void add_person();删除联系人void add_person();显示所有联系人void show_all();修改信息void alter();查询联系人void select();保存新增加的联系人void save_new();同时,通讯录中包含name姓名address地址number电话号码mail邮箱(2)系统总流程图三,概要设计定义一个结构体,在其中声明结构变量,然后定义字符串,来存放要用到的变量。
然后定义此程序的其他功能模块的原型。
主函数调用各个功能子函数,定义各个功能子函数,通过class person创建一个联系人信息函数。
通过add_person做一个添加的函数,实现联系人信息的录入。
通过del_person做一个删除的函数,实现联系人信息的删除。
通过show_all做一个显示的函数,显示所有联系人的信息。
通过select做一个查询信息的函数,实现查询某联系人的信息。
通过alter做一个修改信息的函数,实现修改某联系人的信息。
在程序中需要输入的内容包括:(1)联系人的录入实现过程:根据提示选择“1”进入添加联系人信息界面,按步骤输入要添加的信息,以“Enter”键结束,然后由系统自动调用信息录入函数,联系人的信息保存在事先定义的文件中。
数据结构程序设计-通讯录

课程设计报告书题目:学部:专业:班级: 1 姓名:学号:2011年1月1日一.需求分析整个通讯录一共6个部分,分别为预选准备,增加联系人,删除联系人,显示联系人,修改联系人,以及退出系统。
0.预选准备:首先调用定义的read_func函数,查询是否有预先保存的数据,如果有则载入没有则先调用insert_func函数输入一个数据然后进入主菜单1.增加联系人:在主菜单中键入1则进入增加联系人部分。
通过调用insert_func函数输入名字与电话。
由于系统的原因,名字和电话的字符长度为20,超过20则出错,但由于国内的实际情况20字符几乎可以满足所有非特殊的电话用途。
2.删除联系人:在主菜单中键入2则进入删除联系人部分。
通过调用delete_func()函数,查找需要删除联系人的名字进行删除。
3.显示联系人:在主菜单中键入3则进入显示联系人部分。
通过调用display_func()函数,显示并按照电话号码的大小排列显示并统计所有的联系人个数。
4.修改联系人:在主菜单中键入4则进入修改联系人部分。
通过调用modify_func()函数,查找需要删除联系人的名字进行修改号码。
5.退出系统:在主菜单中键入5则进入退出系统部分。
通过调用write_func()函数,保存已输入的电话号码,并退出系统。
:三.详细设计/* file name: slist.c *//* 单链表,插入、删除使用排序 */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>void read_func(void);void write_func(void);void insert_func(void);void tel_func(void);void delete_func(void);void display_func(void);void modify_func(void);void anykey_func(void);struct student {char name[20];char telephone[20];struct student *next;};struct student *ptr, *head, *current, *prev;void main(void){char option1;system("cls");read_func();while(1){printf("****************************************\n");printf(" 1.增加联系人\n");printf(" 2.删除联系人\n");printf(" 3.显示联系人\n");printf(" 4.修改联系人\n");printf(" 5.退出系统\n");printf("****************************************\n");printf(" Please enter your choice (1-5)...");option1=getche();printf("\n");switch(option1){case '1':insert_func();break;case '2':delete_func();break;case '3':display_func();break;case '4':modify_func();break;case '5':write_func();exit(0);}}}void read_func(void){FILE *fptr;head=(struct student *) malloc(sizeof(struct student));head->next = NULL;/* 开始时,若表中不存在数据,则要求输入第一笔数据 */if((fptr=fopen("slist.dat","r")) == NULL){printf("表中数据不存在\n");printf(" 请按任意键输出第一组数据...\n");getch();insert_func();}else{ptr=(struct student *) malloc(sizeof(struct student));while(fscanf(fptr, "%s %s", ptr->name, &ptr->telephone) != EOF) {tel_func();ptr=(struct student *) malloc(sizeof(struct student));}fclose(fptr);}}void write_func(void){FILE *fptr;fptr=fopen("slist.dat","w");current=head->next;while(current != NULL){fprintf(fptr, "%s %s\n", current->name, current->telephone);current = current->next;}fclose(fptr);}void insert_func(void){ptr=(struct student *) malloc(sizeof(struct student));printf(" 名字 : ");gets(ptr->name);printf(" 电话: ");gets(ptr->telephone);tel_func();/*以电话高低由大到小排列*/void tel_func(void){//插入数据prev = head;current = head->next;while ((current != NULL) && (current->telephone > ptr->telephone)) {prev = current;current = current->next;}ptr->next = current;prev->next = ptr;}void delete_func(void){char del_name[20];printf(" 删除名字: ");gets(del_name);prev = head;current = head->next;while ((current != NULL) && (strcmp(current->name , del_name)!=0)) {prev = current;current = current->next;}if (current != NULL){prev->next = current->next;free(current);printf(" %s 档案已删除\n",del_name);}elseprintf(" 姓名 %s 没找到\n",del_name);anykey_func();}void modify_func(void){char n_temp[20];printf(" 需要修改信息的名字: ");gets(n_temp);current=head->next;while ((current != NULL) && (strcmp(current->name , n_temp)!=0)) {prev = current;current = current->next;}if (current != NULL){printf(" **************************\n");printf(" 名字 : %s\n",current->name);printf(" 电话: %s\n",current->telephone);printf(" **************************\n");printf(" 请输入新的电话: ");gets(ptr->telephone);printf(" %s 档案修改\n",n_temp);}elseprintf(" 名字 %s 没有被找到\n",n_temp);anykey_func();}void display_func(void){int count=0;system("cls");if(head->next == NULL){printf(" No student record\n");}else{printf(" 名字电话\n");printf(" ---------------------------\n");current=head->next;while(current != NULL){printf(" %-20s %3s\n", current->name, current->telephone);count++;current=current->next;if(count % 20 == 0) getch();}printf(" ---------------------------\n");printf(" 总共 %d 记录被找到\n", count);}anykey_func();}void anykey_func(void){printf(" 请输入任意键以继续");getch();printf("\n");}四.测试和结果分析:(一).测试1.开头载入不成功输入第一组数据以及显示主菜单界面2.添加联系人界面:3.删除联系人界面:4.显示联系人界面:5.修改联系人界面:6.退出后保存的slist.dat文件(二)结果分析界面比较烦乱,或许应该使用system(“cls”)来使系统更加简洁,而且系统功能过于简单,如果是显示使用的通讯录应该包含多个电话号码,包括固定电话几个手机,QQ,地址,邮箱等等数据,而且开始时电话号码的数据不能超过10位,否则就不能正常显示,经过修改现在能显示20位以内,但是总觉得这样的修改并不灵活,有待修改。
单链表通讯录课程设计

单链表通讯录课程设计1.题目:单链表通讯录2.设计思路:单链表通讯录是一款用C++语言编写的数据管理系统,主要用于存储和管理用户的通讯信息,如姓名、电话号码、邮箱和地址等个人信息。
通过该系统,用户可以方便地查找和管理自己的通讯录,以方便日常生活和工作。
该系统的核心结构是单链表,采用了面向对象的设计思想,具有可扩展性和灵活的操作方式。
3.功能模块:(1)主菜单模块:该模块是整个系统的核心模块,包含多个子菜单,用户可以通过该模块访问其他功能模块。
(2)添加联系人模块:该模块用于添加新的联系人信息,包括姓名、电话号码、邮箱和地址等。
(3)删除联系人模块:该模块用于删除已有的联系人信息,用户可以根据输入的姓名或电话号码查找并删除联系人。
(4)修改联系人信息模块:该模块用于修改已有联系人的信息,包括姓名、电话号码、邮箱和地址等。
(5)查询联系人信息模块:该模块用于查询已有联系人的信息,用户可以根据输入的姓名或电话号码查找并显示联系人信息。
(6)显示所有联系人信息模块:该模块用于显示所有已有联系人的信息,以便用户进行整体管理。
(7)退出系统模块:该模块用于退出整个系统,结束数据管理工作。
4.代码实现:(1)定义联系人类Class 联系人{private:String name; //姓名String phone; //电话String email; //EmailString address; //地址public:联系人(); //类的构造函数void setName(String name);String getName();void setPhone(String phone);String getPhone();void setEmail(String email);String getEmail();void setAddress(String address);String getAddress();};(2)定义单链表类Class 单链表{private:联系人 *head; //头指针int length; //链表长度public:单链表(); //类的构造函数void add(); //添加联系人void del(); //删除联系人void modify(); //修改联系人void query(); //查询联系人void show(); //显示联系人};(3)定义主函数int main(){单链表 contacts; //创建单链表对象int choice; //用户输入选项while (1){printf("--------------------------------------------\n"); printf(" 通讯录管理系统 V1.0\n");printf("--------------------------------------------\n"); printf(" 1. 添加联系人\n");printf(" 2. 删除联系人\n");printf(" 3. 修改联系人\n");printf(" 4. 查询联系人\n");printf(" 5. 显示所有联系人\n");printf(" 6. 退出系统\n");printf("--------------------------------------------\n");printf(" 请输入选项: ");scanf("%d", &choice);switch (choice){case 1:contacts.add(); //添加联系人break;case 2:contacts.del(); //删除联系人break;case 3:contacts.modify(); //修改联系人break;case 4:contacts.query(); //查询联系人break;case 5:contacts.show(); //显示所有联系人break;case 6:printf(" 退出通讯录管理系统,欢迎下次使用!\n"); exit(0);default:printf(" 输入选项有误,请重新输入!\n");break;}}return 0;}5.实现流程:该系统的实现流程如下:(1)首先定义联系人类,具有姓名、电话、Email和地址等属性和对应的get/set方法。
通讯录算法描述

通讯录算法描述通讯录算法描述一、概述通讯录是人们在日常生活中经常使用的工具,其主要功能是存储和管理联系人信息。
通讯录算法是指实现通讯录功能的计算机程序,其核心是数据结构和算法。
本文将从数据结构和算法两个方面对通讯录算法进行详细描述。
二、数据结构1. 链表链表是一种常见的数据结构,在通讯录中可以用来存储联系人信息。
每个节点包含联系人的姓名、电话号码等信息,以及指向下一个节点的指针。
通过遍历链表可以查找、添加、删除联系人信息。
2. 哈希表哈希表是一种高效的数据结构,在通讯录中可以用来快速查找联系人信息。
哈希表将每个联系人的姓名映射到一个唯一的索引值,然后将该索引值作为数组下标存储联系人信息。
通过哈希函数可以快速计算出联系人在数组中的位置,从而实现快速查找。
3. 树形结构树形结构是一种层次化的数据结构,在通讯录中可以用来组织联系人信息。
树形结构由根节点、子节点和叶子节点组成,每个节点包含一个或多个属性。
在通讯录中可以将联系人按照姓名的首字母分组,每个分组作为一个节点,子节点包含具体的联系人信息。
三、算法1. 查找算法查找算法是通讯录算法中最基本的功能之一。
可以通过遍历链表、哈希表或树形结构实现查找。
其中,哈希表是最快的查找方法,时间复杂度为O(1),而链表和树形结构的时间复杂度分别为O(n)和O(logn)。
2. 添加算法添加算法是通讯录算法中另一个重要的功能。
在链表中添加联系人只需要将新节点插入到链表尾部即可,时间复杂度为O(1);在哈希表中添加联系人需要先计算出索引值,然后将联系人信息插入到对应位置,时间复杂度也为O(1);在树形结构中添加联系人需要先查找对应的节点,然后将新联系人作为子节点插入到该节点下面,时间复杂度为O(logn)。
3. 删除算法删除算法是通讯录算法中比较常用的功能之一。
在链表中删除联系人只需要将该节点从链表中移除即可,时间复杂度为O(1);在哈希表中删除联系人需要先计算出索引值,然后将对应位置上的元素删除即可,时间复杂度为O(1);在树形结构中删除联系人需要先查找对应的节点,然后将该节点从树中移除即可,时间复杂度为O(logn)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告实验名称单链表通讯录一、实验目的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*其它-退出。