北邮数据结构实验一通讯录实验报告

合集下载

北邮通信原理实验报告

北邮通信原理实验报告

北京邮电大学通信原理实验报告学院:信息与通信工程学院班级:姓名:姓名:实验一:双边带抑制载波调幅(DSB-SC AM)一、实验目的1、了解DSB-SC AM 信号的产生以及相干解调的原理和实现方法。

2、了解DSB-SC AM 信号波形以及振幅频谱特点,并掌握其测量方法。

3、了解在发送DSB-SC AM 信号加导频分量的条件下,收端用锁相环提取载波的原理及其实现方法。

4、掌握锁相环的同步带和捕捉带的测量方法,掌握锁相环提取载波的调试方法。

二、实验原理DSB 信号的时域表达式为()()cos DSB c s t m t t ω=频域表达式为1()[()()]2DSB c c S M M ωωωωω=-++ 其波形和频谱如下图所示DSB-SC AM 信号的产生及相干解调原理框图如下图所示将均值为零的模拟基带信号m(t)与正弦载波c(t)相乘得到DSB—SC AM信号,其频谱不包含离散的载波分量。

DSB—SC AM信号的解调只能采用相干解调。

为了能在接收端获取载波,一种方法是在发送端加导频,如上图所示。

收端可用锁相环来提取导频信号作为恢复载波。

此锁相环必须是窄带锁相,仅用来跟踪导频信号。

在锁相环锁定时,VCO输出信号sin(2πf c t+φ)与输入的导频信号cos(2πf c t)的频率相同,但二者的相位差为(φ+90°),其中很小。

锁相环中乘法器的两个输入信号分别为发来的信号s(t)(已调信号加导频)与锁相环中VCO的输出信号,二者相乘得到[A C m(t)cos(2πf c t)+A p cos(2πf c t)]∙sin(2πf c t+φ)=A c2m(t)[sinφ+sin(4πf c t+φ)]+A p2[sinφ+sin(4πf c t+φ)]在锁相环中的LPF带宽窄,能通过A p2sinφ分量,滤除m(t)的频率分量及四倍频载频分量,因为很小,所以约等于。

LPF的输出以负反馈的方式控制VCO,使其保持在锁相状态。

北邮数据结构实验报告实验一线性表

北邮数据结构实验报告实验一线性表

数据结构实验报告实验名称:实验一——线性表学生姓名:班级:班内序号:学号:日期:2014年11月20日1.实验要求[正文格式要求]字体:汉字宋体、英文Times New Roman字号:五号颜色:黑色行距:单倍行距[内容要求]描述要求的实验目的和具体的实验内容2. 程序分析2.1 存储结构带头结点单链表2.2 关键算法分析一:关键算法1:头插法自然语言描述:a:在堆中建立新结点b:将a[i]写入到新结点的数据域c:修改新结点的指针域d:修改头结点的指针域。

将新结点加入链表中伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:s->next=front->next;d:front->next=s2:尾插法自然语言描述:a:在堆中建立新结点:b:将a[i]写入到新结点的数据域:c:将新结点加入到链表中d:修改修改尾指针伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:r->next=s;d:r=s3:析构/删除函数自然语言描述:a:新建立一个指针,指向头结点b:判断要释放的结点是否存在,c:暂时保存要释放的结点d:移动a中建立的指针e:释放要释放的指针伪代码描述a:Node <T> * p=frontb:while(p)c:front=pd:p=p->nexte:delete front4:按位查找函数自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1 b:循环以下操作,直到p为空或者j等于1b1:p指向下一个结点b2:j加1c:若p为空,说明第i个元素不存在,抛出异常d:否则,说明p指向的元素就是所查找的元素,返回元素地址伪代码描述a:Node <T> * p=front->next;j=1;b:while(p&&j!=1)b1:p=p->nextb2:j++c:if(!p) throw ”error”d:return p5:按位查找函数自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,找到这个元素或者p指向最后一个结点b1:判断p指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j的值加一c:如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息伪代码描述a:Node <T> * p=front->next;j=1;b:while(p)b1:if(p->next==x) return jp=p->nextj++c:return “error”6:插入函数自然语言描述:a:在堆中建立新结点b:将要插入的结点的数据写入到新结点的数据域c:修改新结点的指针域d:修改前一个指针的指针域,使其指向新插入的结点的位置伪代码描述a:Node <T> * s=new Node <T>;b:s-data=p->datac:s->next=p->nextd:p->next=se:p->data=x7:删除函数自然语言描述:a:从第一个结点开始,查找要删除的位数i前一个位置i-1的结点b:设q指向第i个元素c:将q元素从链表中删除d:保存q元素的数据e:释放q元素伪代码描述a:q=p->nextb:p->next=q->nextc:x=q->datad:delete q8:遍历打印函数自然语言描述:a:判断该链表是否为空链表,如果是,报错b:如果不是空链表,新建立一个temp指针c:将temp指针指向头结点d:打印temp指针的data域e:逐个往后移动temp指针,直到temp指针的指向的指针的next域为空伪代码描述If front->next==NULLThrow ”an empty list ”Node<T>* temp=front->next;while(temp->next){cout<<temp->data<<" ";temp=temp->next;}8:获取链表长度函数自然语言描述:a:判断该链表是否为空链表,如果是,输出长度0b:如果不是空链表,新建立一个temp指针,初始化整形数n为0c:将temp指针指向头结点d:判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则return n e: 使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n伪代码描述int n=0if front->next==NULLn=0else{Node<T>* temp=front->next; while(temp->next)n++;temp=temp->next; }return n;4. 总结1、调试时出现的问题及解决的方法编程序时总是不考虑异常抛出,后经老师指点改正。

数据结构实验报告2--通讯录

数据结构实验报告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;}}}运行结果:建立通讯录信息运行结果截图:输入零后通讯录信息输出结果截面图:查询通讯录信息运行结果截图:通讯录信息排序运行结果截图:删除通讯录信息运行结果截图:删除通讯录信息后的输出结果截面图:清空通讯录信息的运行结果截面图:四、实验心得与小结通过这次的上机实验,使我学到了一些回顾了以前学过的知识,使我对数据结构程序设计有了更深层次的认识和理解,懂得了灵活运用。

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告摘要:本报告基于北邮数据结构实验,通过实际操作和实验结果的分析,总结和讨论了各实验的目的、实验过程、实验结果以及相关的问题和解决方法。

本报告旨在帮助读者了解数据结构实验的基本原理和应用,并为今后的学习和研究提供参考。

1. 实验一:线性表的操作1.1 实验目的本实验旨在掌握线性表的基本操作以及对应的算法实现,包括插入、删除、查找、修改等。

1.2 实验过程我们使用C++语言编写了线性表的相关算法,并在实际编程环境下进行了测试。

通过插入元素、删除元素、查找元素和修改元素的操作,验证了算法的正确性和效率。

1.3 实验结果经过测试,我们发现线性表的插入和删除操作的时间复杂度为O(n),查找操作的时间复杂度为O(n),修改操作的时间复杂度为O(1)。

这些结果与预期相符,并反映了线性表的基本特性。

1.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如插入操作的边界条件判断、删除操作时的内存释放等。

通过仔细分析问题,我们优化了算法的实现,并解决了这些问题。

2. 实验二:栈和队列的应用2.1 实验目的本实验旨在掌握栈和队列的基本原理、操作和应用,并进行实际编程实现。

2.2 实验过程我们使用C++语言编写了栈和队列的相关算法,并在实际编程环境下进行了测试。

通过栈的应用实现表达式求值和逆波兰表达式的计算,以及队列的应用实现图的广度优先遍历,验证了算法的正确性和效率。

2.3 实验结果经过测试,我们发现栈的应用可以实现表达式的求值和逆波兰表达式的计算,队列的应用可以实现图的广度优先遍历。

这些结果证明了栈和队列在实际应用中的重要性和有效性。

2.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如中缀表达式转后缀表达式的算法设计、表达式求值的优化等。

通过查阅资料和与同学的讨论,我们解决了这些问题,并完善了算法的实现。

3. 实验三:串的模式匹配3.1 实验目的本实验旨在掌握串的基本操作和模式匹配算法,并进行实际编程实现。

数据结构通讯录管理系统课程设计实验报告心得

数据结构通讯录管理系统课程设计实验报告心得

数据结构通讯录管理系统课程设计实验报告背景随着信息化的快速发展,通讯录管理系统成为了每个人生活中必备的工具之一。

传统的纸质通讯录已经无法满足人们对于信息管理的需求,因此开发一个高效、便捷、用户友好的通讯录管理系统显得尤为重要。

本次课程设计实验的目标是设计一个基于数据结构的通讯录管理系统,实现通讯录的创建、查找、修改、删除等功能。

通过本次实验,我们可以学习和掌握数据结构中的链表、哈希表等基础概念和算法,并将其应用到实际项目中。

分析通讯录管理系统主要有以下几个功能:1.创建通讯录:通讯录是一个存储联系人信息的数据结构,可以存储联系人的姓名、电话号码、邮箱地址等信息。

2.添加联系人:可以向通讯录中添加新的联系人,包括姓名、电话号码、邮箱地址等信息。

3.查找联系人:可以根据姓名或电话号码查找通讯录中的联系人,并显示其详细信息。

4.修改联系人:可以根据姓名或电话号码修改通讯录中的联系人信息。

5.删除联系人:可以根据姓名或电话号码删除通讯录中的联系人。

为了实现上述功能,我们可以使用链表来实现通讯录的存储,每个节点表示一个联系人。

每个节点包含姓名、电话号码、邮箱地址等信息,并且有指向下一个节点的指针。

为了提高查找联系人的效率,我们还可以使用哈希表来实现联系人的快速查找。

哈希表采用键值对的方式存储数据,通讯录中的联系人可以以姓名为键,联系人节点为值存储在哈希表中。

结果实验的最终结果是一个完善的通讯录管理系统,能够实现创建通讯录、添加联系人、查找联系人、修改联系人和删除联系人等功能。

在实现过程中,我们遵循了以下步骤:1.首先,我们设计了联系人节点的数据结构,包括姓名、电话号码、邮箱地址等字段,并定义了节点的操作方法。

2.接着,我们设计了通讯录的数据结构,使用链表来存储联系人节点,并实现了通用的链表操作方法,如插入节点、删除节点等。

3.然后,我们设计了哈希表的数据结构,使用哈希函数将联系人节点存储在哈希表中,并实现了查找联系人的快速算法。

通讯录实验报告

通讯录实验报告

实验课程名称通讯录管理系统专业班级 10级计科1班学生姓名学号指导教师2012至2013学年第一学期第1 至18 周目录第1章概述 (3)1.1现状分析 (3)1.2实现意义 (3)第2章系统分析 (4)2.1用户需求分析 (4)2.2管理者需求分析 (4)第3章概要设计 (5)3.1主控菜单设计 (5)3.2 总结构设计流程图 (6)第4章详细设计 (6)4.1通讯录建立模块设计 (6)4.2通讯录查询模块设计 (7)4.3通讯录删除模块设计 (7)4.4通讯录链表的输出模块设计 (8)第5章运行与测试 (9)第6章总结和心得 (9)参考文献 (10)附件(源代码) (10)第1章概述1.1现状分析日益繁多的人际交往使得我们很难记住与每个人之间的联系方式,通讯录能够便捷的给我们带来所需要的相关信息。

为了实现通讯录管理的几种操作功能,首先设计一个含有多少个菜单项的主控菜单程序,然后再为这些菜单配上相应的功能。

1.2实现意义随着计算机的普及,人们的生活摆脱了传统式的记事本、电话簿,越来越多的靠计算机或者手机中的电话簿程序来帮助人们记住这些事情,极其简便。

这就需要有一个使用的通讯录管理系统,用户可以方便的通过自己电脑的通讯录管理系统,来随时查阅自己所需要的信息,而不必再大费周折去翻开那繁琐的记事本。

通讯录管理系统是一个专门针对储存用户联系方式以及一些简单个人信息的实用管理系统,它方便了用户对众多客户、朋友、同事等个人信息的储存和快速查阅的功能,大大减少了查找过程的时间。

然而要靠计算机来记住这些信息,首先就得要求用单链表做数据结构,设计一个实现通讯者信息的输入、查询、删除、输出、等功能的通讯录管理系统。

每条通讯者信息包含:编号、姓名、性别、电话号码、地址等信息。

第2章系统分析2.1用户需求分析为实现系统功能,本程序主要分为五个模块。

它们分别为:输入一个信息、删除一个信息、查询一个信息、插入一个信息、输出所有的信息、退出该程序。

作通讯录的实训报告

作通讯录的实训报告

随着信息技术的飞速发展,通讯录在人们的工作、生活中扮演着越来越重要的角色。

为了提高同学们对通讯录管理的认识,培养实际操作能力,我校组织了通讯录实训活动。

本次实训旨在使同学们掌握通讯录的基本操作,提高信息处理能力,为今后的工作打下坚实基础。

二、实训目标1. 熟悉通讯录的基本概念和作用;2. 掌握通讯录的创建、编辑、查询、导出等功能;3. 学会使用通讯录进行日常信息管理;4. 培养同学们团队协作和沟通能力。

三、实训内容1. 通讯录基础知识实训老师首先向同学们介绍了通讯录的基本概念、作用以及常见的通讯录类型。

通讯录是一种用于存储和查询联系人信息的工具,可以方便地记录和查找电话、邮箱、地址等个人信息。

常见的通讯录类型有纸质通讯录、电子通讯录等。

2. 通讯录创建与编辑同学们在实训老师的指导下,学习了如何创建一个新的通讯录。

首先,选择合适的通讯录类型,如电子通讯录;然后,输入联系人的姓名、电话、邮箱、地址等基本信息。

在编辑通讯录时,同学们掌握了如何修改、删除、添加联系人信息。

3. 通讯录查询与导出实训老师讲解了如何通过姓名、电话、邮箱等条件在通讯录中查询联系人信息。

此外,同学们还学会了如何将通讯录导出为Excel、Word等格式,方便后续的整理和使用。

4. 实际操作演练为了巩固所学知识,同学们进行了实际操作演练。

在实训老师的带领下,同学们分组进行通讯录管理,包括创建通讯录、添加联系人、查询信息等。

通过实际操作,同学们熟练掌握了通讯录的基本操作。

1. 同学们对通讯录的基本概念、作用有了更深入的了解;2. 掌握了通讯录的创建、编辑、查询、导出等功能;3. 提高了信息处理能力,为今后的工作打下了坚实基础;4. 培养了团队协作和沟通能力。

五、实训总结本次通讯录实训活动,同学们积极参与,认真完成各项任务。

通过实训,同学们对通讯录有了更加全面的认识,掌握了通讯录的基本操作,提高了信息处理能力。

在今后的工作和生活中,通讯录将发挥重要作用,希望同学们能够充分利用所学知识,提高工作效率。

数据结构——通讯录实验报告

数据结构——通讯录实验报告

数据结构——通讯录实验报告
《数据结构课程设计》实验报告
编号实验一实验项目名称通讯录管理
班学姓08计科(1)班学时数 6 指导教师冯韵 5 黄媛级号名
成实验日期 2010年9月7日绩
一、实验目的:使用有关单链表的操作来实现通讯录信息系统的管理二、内容与设计思想:(设计思想、主要数据结构、主要代码结构、主要代码段分析) 设计思想:利用单链表的建立、查询、插入、删除、输出实现通讯录管理。

主要数据结构:单链表的建立、查询、插入、删除。

主要代码结构和分析:
void main( )主函数
for循环实现菜单循环。

int menu_select( ) 菜单选择函数
首先输出菜单选项,将输入的选项赋给sn,用sn判断输入值是否合理。

利用for循环实现重复选择,利用switch调用建立、查询、插入、删除和输出函数。

LinkList CreateList(void)建立带头结点链表
首先利用malloc申请头结点,置结束标志为0.通过0、1选择来结束建表。

三、调试过程(测试数据设计与测试结果分析) 四、总结
1、设计中遇到的问题及解决过程
2、设计中产生的错误及原因分析
3、设计体会和收获
五、评阅意见:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作。 能够保存每次更新的数据(选作) 能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作) 编写测试 main()函数测试线性表的正确性
第 1页
北京邮电大学信息与通信工程学院
2. 程序分析
通过编程完成通讯录管理系统,实现建立、增加、修改、查找、删除、输出等一般功能, 每个数据元素包含成员的 ID、姓名、电话、住址等基本信息。本程序使用链表的功能,以 C++语言为基础编写。对于本通讯录管理系统的建立,需要了解并掌握链表的算法与设计方 法,综合运用所学知识完成。
p=p->next; } return NULL; }
第 12页
北京邮电大学信息与通信工程学院
DataType ContactBook::Delete(int i) {
Node* p=front; while(p) {
if(p->next->data.ID==i)break; p=p->next; } Node* q=p->next;//q 指针指向要删除的成员 if(q) { DataType x=q->data;//保存成员数据 p->next=q->next; delete q; cout<<"删除成功!"<<endl; return x; } else { cout<<"该成员不存在!"<<endl; } }
Node* p=new Node; p->data=a; rear->next=p; rear=p; rear->next=NULL; }
DataType* ContactBook::Get(int i) {
Node* p=front; while(p) {
if(p->data.ID==i) return &p->data;
时间复杂度=o(n)
2.2.2 添加新成员 伪代码:与通讯录的建立类似,通过尾插法实现
代码实现: void ContactBook::Add(DataType a) {
Node* p=new Node; p->data=a; rear->next=p; rear=p; rear->next=NULL; }
第 11页
北京邮电大学信息与通信工程学院
ContactBook::ContactBook() {
front=new Node; rear=new Node; front->next=NULL; rear=front; }
ContactBook::ContactBook(DataType a[],int n) {
北京邮电大学信: 实验———线性表 学生姓名: 班 级: 班内序号: 学 号:
日 期:实验要求
1.1 实验目的
通过选择下面四个题目之一进行实现,掌握如下内容: 熟悉 C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力
{
DataType data;
//数据
struct Node * next; //指针指向下一节点
};
class ContactBook { public:
ContactBook();//默认构造函数 ContactBook(DataType a[],int n);//构造函数 void Add(DataType a); //增加成员 DataType Delete(int i);//删除成员 DataType *Get(int i);//查找成员 void Modify(DataType a,int i);//修改成员 void printList();//打印所有成员 ~ContactBook();//析构函数 private: Node* front; Node* rear; };
front=new Node; rear=new Node; rear=front; for(int i=0;i<n;i++) //尾插法 {
Node* p=new Node; p->data=a[i]; rear->next=p; rear=p; } rear->next=NULL; }
void ContactBook::Add(DataType a)//尾插法 {
4. 总结
通过本实验,巩固了我对链表的理解,学会了使用线性表解决一些实际的问题。但实验 中还是有一些问题暴露了出来。
比如一开始在调试的时候,打印成员时出现了如下截图中的问题。
经过分析,才知道原来初始化指针 p 的时候指向了头指针并打印了出来,修改后 p 应该指向 头指针的 next 域。调试中诸如这样的问题并不少见,也就是内存错误。
2.1 存储结构
节点结
构:
data next
存储结构:带头结点和尾节点的单链表
rear
front
a[0]
a[n-1] ^
2.2 关键算法分析
通讯录系统图
2.2.1 通讯录的建立 伪代码: 1. 在堆栈中申请新的节点 2. 新节点的数据为 a[i] 3. 将新节点添加到链表 4. 修改尾指针 5. 全部插入后最后一个节点的指针域设为空
DataType ContactBook::Delete(int i) {
Node* p=front; while(p) {
if(p->next->data.ID==i)break; p=p->next; } Node* q=p->next;//q 指针指向要删除的成员 if(q) { DataType x=q->data;//保存成员数据 p->next=q->next;//p 的 next 指向 q 的 next delete q; cout<<"删除成功!"<<endl; return x; } else { cout<<"该成员不存在!"<<endl; } }
Node* p=front; while(p) {
if(p->data.ID==i) return &p->data;
p=p->next; } return NULL; }
//ID 匹配模式查找 //找到则返回 p 的地址
//找不到则返回空
时间复杂度=o(n)
2.2.4 删除成员 伪代码:
1. 初始化指针 p 指向头指针 2. 循环匹配 ID 找到要删除的成员的前一个节点 3. 初始化指针 q 指向要删除的成员 4. 保存 q 的数据 5. p 指向 q 的下一节点 6. 释放 q 节点 代码实现:
{1002,"李四",'f',"13518802020","海南"}, {1003,"王五",'m',"15501010101","天津"}}; ContactBook Test(a,3);//初始化通讯录 int no; do{ cout<<"1.建立我的通讯录"<<endl; cout<<"2.增加通讯录成员"<<endl; cout<<"3.查找通讯录成员"<<endl; cout<<"4.修改通讯录成员"<<endl; cout<<"5.删除通讯录成员"<<endl; cout<<"6.查看通讯录成员"<<endl; cout<<"0.退出系统"<<endl; cout<<"请输入数字选择:"; cin>>no; switch (no) { case 1: cout<<"建立成功!"<<endl; cout<<"********************"<<endl; break; case 2: cout<<"请输入成员 ID,姓名,性别,电话号码,地址"<<endl; DataType x; cin>>x.ID>>>>x.ch>>x.phone>>x.addr; Test.Add(x); cout<<"添加成功!"<<endl; cout<<"********************"<<endl;
第 4页
北京邮电大学信息与通信工程学院
时间复杂度=o(n)
2.2.5 修改成员 先调用查询模块,找到并打印用户信息,然后依次修改成员信息
代码实现: void ContactBook::Modify(DataType a,int i) {
DataType* p=Get(i); *p=a; }
时间复杂度=o(n)
附源程序: #include<iostream> using namespace std;
struct DataType {
int ID; char name[10]; char ch; char phone[13]; char addr[31]; };
//ID //姓名
//性别 //电话
//地址
struct Node
退出 是
结束
图 2 流程图示意图
相关文档
最新文档