数据结构CC+循环链表_第1页
数据结构CC+循环链表_第2页
数据结构CC+循环链表_第3页
数据结构CC+循环链表_第4页
数据结构CC+循环链表_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

例3.1有一个单链表L(至少有一个结点),其头结点指针为head,编写一个函数将L逆置,即最后一个结点变成第1个结点,原来倒数第二个结点变成第二个结点……如此等等。解:本题采用的算法是,从头到尾遍历单链表L,并设置3个附加指针p、q、r,p指向当前处理的结点,q指向p的下一个结点,r指向q的下一个结点,q、r的作用是为了防止倒置指针时,下一个结点的丢失而设置的,有了这三个指针,就可以方便地实现指针的倒置。最后将个结点的next域置为NULL,并将头指针指向最后一个结点,这样达到了本题的要求。数据结构CC+循环链表共24页,您现在浏览的是第1页!voidinvert(linklisthead){linklistp,q,r;p=head;q=p->next;while(q!=NULL)/*没有后继时停止*/{r=q->next;q->next=p;p=q;q=r;}head->next=NULL;head=p;}typedefstructnode{datatypedata;structnode*next;}*linklist;数据结构CC+循环链表共24页,您现在浏览的是第2页!堆栈的最简单的表示方法是采用一维数组,为形象起见,一般在图中将堆栈画成竖直的。设数组名为data,其下标的下界为0,上界为n。一般需用一个变量top记录当前栈顶的下标值,top也叫做栈指针。topADCB3642105data本例中top=4在C语言中通常用以下方式定义一个顺序栈结构体:#defineN30Typedefstructstack{datatypedata[N];Inttop;}sqstack;3.2链表应用数据结构CC+循环链表共24页,您现在浏览的是第3页!#defineN30Typedefstructstack{datatypedata[N];Inttop;}sqstack;voidpop(sqstack*p){if(p->top==-1)printf(“空栈!\n”);/*栈为空显示相应的信息*/else{x=p->data[p->top];(p->top)--;/*栈顶位置下移*/}returnx;}2.出栈(Pop)出栈运算时,先将栈顶的元素值赋给某个变量,以备后面的运算应用;然后栈顶指针减1,将栈顶位置下移。假设已指定的变量为x,则出栈的函数如下:数据结构CC+循环链表共24页,您现在浏览的是第4页!链堆栈的入栈算法在栈顶指针是top的链堆栈中插入一个值为x的结点的算法:voidpush(linklisttop,datatypex){linklists;s=newnode;/*建立一个结点指针*/s->data=x;s->next=top;top=s;}数据结构CC+循环链表共24页,您现在浏览的是第5页!3.3循环链表与双向链表循环链表(circularlinkedlist)是一种首尾相接的链表,将单链表表尾结点原来的空指针改为指向表头结点,就成为循环链表。循环链表并不多占存储单元,但从循环链表的任一个结点出发都可以访问到此链表的每一个结点,因为当访问到表尾结点后又能返回到头结点。一、循环链表数据结构CC+循环链表共24页,您现在浏览的是第6页!例3.2算法link(linklisthead1,head2){linklistp,q;p=head1;while(p->next!=head1)p=p->next;q=head2;while(q->next!=head2)q=q->next;p->next=head2;q->next=head1;}数据结构CC+循环链表共24页,您现在浏览的是第7页!2.带尾指针的循环链表另一种方法是不设头指针而改设尾指针,这样无论是找头结点还是尾结点都很方便。因为尾结点由尾指针rear来指示,则头结点的位置是rear->next->next。数据结构CC+循环链表共24页,您现在浏览的是第8页!如果循环链表的结点再采用双向指针,就成为双向循环链表。数据结构CC+循环链表共24页,您现在浏览的是第9页!1.双链表的插入设要在p所指结点的前面插入一个新结点*q,则需要修改4个指针:q->prior=p->prior;q->next=p;(p->prior)->next=q;p->prior=q;数据结构CC+循环链表共24页,您现在浏览的是第10页!3.4表示稀疏矩阵的十字链表在十字链表中,矩阵的每个非零元素对应着一个含有五个域的结点,这五个域分别为该非零元素在稀疏矩阵中的行号、列号、元素的数值以及两个指针,其中一个指针指向同一列的下一个非零元素的结点,另一个指针指向同一行的右边一个非零元素的结点。数据结构CC+循环链表共24页,您现在浏览的是第11页!例:稀疏矩阵M及其对应的十字链表如图所示。数据结构CC+循环链表共24页,您现在浏览的是第12页!空表头结点的结构因各列、各行的空表头结点中的行号和列号都是零,且每列空表头结点只用到向下指针,每行空表头结点只用到向右指针,故可将这组空表头结点合用。由于数值域也没有用,可将空表头结点的数值域改为一个指针域,将各个空表头结点也链接成一个循环链表。返回数据结构CC+循环链表共24页,您现在浏览的是第13页!二、堆栈的运算

入栈(push)入栈的主要操作是先将栈顶指针加1;然后将入栈元素放到栈顶指针所指示下值的位置上。设用指针P表示堆栈,入栈的元素值为x,则可得到入栈函数如下:#defineN30Typedefstructstack{datatypedata[N];Inttop;}sqstack;voidpush(sqstack*p,datatypex){if(p->top==N-1)printf(“栈溢出!\n”);/*显示栈满信息*/else {(p->top)++;p->data[p->top]=x;}}数据结构CC+循环链表共24页,您现在浏览的是第14页!链堆栈是栈的链接存储表示,它是只允许在表头进行插入和删除运算的单链表。它与普通的单链表没有什么不同,只是将头指针head改称为栈顶指针top。链堆栈数据结构CC+循环链表共24页,您现在浏览的是第15页!intpop(linklisttop){intx;linklistp;if(top==NULL)cout<<“栈为空!”;else{x=top->data;p=top;top=top->next;deletep;returnx;}}

链堆栈的出栈算法数据结构CC+循环链表共24页,您现在浏览的是第16页!例3.2有两个循环单链表,头指针分为head1和head2,编写函数将链表head2链接到链表head1之后,链接后的链表仍保持是循环链表的形式。解:先分别找到两个链表的表尾,将head2放入链表head1的表尾,将两个链表链接起来,然后将head1放入原head2链表的表尾,构成新的循环链表。数据结构CC+循环链表共24页,您现在浏览的是第17页!1.带头指针的循环链表通常在循环链表的表头结点前面再加一个空结点,也叫空表头结点。表空时空表头结点的指针指向其本身,如下面的图所示为空循环链表。空表头结点除指针以外的数据域是没有用的,但为了将此结点与一般结点相区别,常常是将其赋以一个特别的数据,以与一般结点相区别。数据结构CC+循环链表共24页,您现在浏览的是第18页!二、双向链表双向链表中每个结点除了有向后指针外,还有指向其前一个结点的指针,这样形成的链表中有两条不同方向的链,因此从某一结点均可向两个方向访问。双链表的结点形式为:其中链域prior和next分别指向本结点的直接前趋和直接后继结点。数据结构CC+循环链表共24页,您现在浏览的是第19页!双链表较单链表虽然要多占用一些存储单元,但对其插入和删除操作以及查找结点的前趋和后继都非常方便。双链表结构是一种对称结构,设指针p指向双链表的某一结点,则双链表的对称性可用下式来表示:p=(p->prior)->next=(p->next)->prior即结点*p的地址既存放在其前趋结点*(p->prior)的后继指针域中,又存放在它的后继结点*(p->next)的前趋指针域中。数据结构CC+循环链表共24页,您现在浏览的是第20页!2.双链表的删除设p指向待删除的结点,则删除该结点步骤为:(p->prior)->next=p->next;(p->next)->prior=p->prior;这两个语句的执行顺序可以颠倒,执行这两个语句之后,可调用deletep,将*p结点释放。返回数据结构CC+循环链表共24页,您现在浏览的是第21页!将每行的非零元素结点链接成循环链表,又将每列的非零元素结点链接成循环链表,就构成了十字形的链接结构。对于每行、每列的循环链表都有一个空表头结点

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论