双向链表也叫双链表_第1页
双向链表也叫双链表_第2页
双向链表也叫双链表_第3页
双向链表也叫双链表_第4页
双向链表也叫双链表_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。一、循环链表循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。循环链表的运算与单链表的运算基本一致。所不同的有以下几点:1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。二、双向链表双向链表其实是单链表的改进。当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。在c语言中双向链表结点类型可以定义为:typedefstructnode{intdata;/*数据域*/structnode*llink,*rlink;/*链域,*llink是左链域指针,*rlink是右链域指针*/}JD;当然,也可以把一个双向链表构建成一个双向循环链表。双向链表与单向链表一样,也有三种基本运算:查找、插入和删除。双向链表的基本运算:1、查找假若我们要在一个带表头的双向循环链表中查找数据域为一特定值的某个结点时,我们同样从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾。下例就是应用双向循环链表查找算法的一个程序。

searchpoint二search(head,studname);printfC你所要查找的人的姓名是:%s",*&searchpoint->name);}/*线性表的双向链表存储结构*/typedefstructDuLNode{ElemTypedata;structDuLNode*prior,*next;}DuLNode,*DuLinkList;/*带头结点的双向循环链表的基本操作(14个)*/voidInitList(DuLinkList*L){/*产生空的双向循环链表L*/*L=(DuLinkList)malloc(sizeof(DuLNode));(*L)->next=(*L)->prior=*L;elseexit(OVERFLOW);}voidDestroyList(DuLinkList*L){/*操作结果:销毁双向循环链表L*/DuLinkListq,p=(*L)->next;/*p指向第一个结点*/while(p!=*L)/*p没到表头*/{q=p->next;free(p);p=q;

*L=NULL;voidClearList(DuLinkListL)/*不改变L*/{/*初始条件:L已存在。操作结果:将L重置为空表*/DuLinkListq,p=L->next;/*p指向第一个结点*/while(p!=L)/*p没到表头*/1q=“free(p);P=q;L->next二L->prior二L;/*头结点的两个指针域均指向自身*/}StatusListEmpty(DuLinkListL){/*初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE*/讦(L->next==L&&L->prior==L)returnTRUE;elsereturnFALSE;}intListLength(DuLinkListL){/*初始条件:L已存在。操作结果:返回L中数据元素个数*/inti=0;DuLinkListp=L->next;/*p指向第一个结点*/while(p!二L)/*p没到表头*/{i++;p=p->next;}returni;}StatusGetElem(DuLinkListL,inti,ElemType*e){/*当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/intj=1;/*j为计数器*/DuLinkListp=L->next;/*p指向第一个结点*/while(p!=L&&jnext;j++;}if(p二二L||j>i)/*第i个元素不存在*/returnERROR;*e=p->data;/*取第i个元素*/returnOK;}intLocateElem(DuLinkListL,ElemTypee,Status(*compare)(ElemType,ElemType)){/*初始条件:L已存在,compare。是数据元素判定函数*//*操作结果:返回L中第1个与e满足关系compare。的数据元素的位序。*//* 若这样的数据元素不存在,则返回值为0*/inti=0;DuLinkListp=L->next;/*p指向第1个元素*/while(p!二L){i++;讦(compare(p->data,e))/*找到这样的数据元素*/returni;p=p->next;}return0;}StatusPriorElem(DuLinkListL,ElemTypecur_e,ElemType*pre_e){/*操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,*//* 否则操作失败,pre_e无定义*/DuLinkListp=L->next->next;/*p指向第2个元素*while(p!=L)/*p没到表头*/讦(p->data==cur_e){*pre_e=p->prior->data;returnTRUE;}p=p->next;}returnFALSE;

StatusNextElem(DuLinkListL,ElemTypecur_e,ElemType*next_e){/*操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,*//* 否则操作失败,next_e无定义*/DuLinkListp=L->next->next;/*p指向第2个元素*/while(p!=L)/*p没到表头*/{讦(p->prior->data二二cur_e){*next_e=p->data;returnTRUE;}p=p->next;returnFALSE;DuLinkListGetElemP(DuLinkListL,inti)/*另加*/{/*在双向链表L中返回第i个元素的地址。i为0,返回头结点的地址。若第i个元素不存在,*//*返回NULL*/intj;DuLinkListp=L;/*p指向头结点*/if(i<0||i>ListLength(L))/*i值不合法*/returnNULL;for(j=1;j<二i;j++)p=p->next;returnp;StatusListlnsert(DuLinkListL,inti,ElemTypee){/*在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1<i<表长+1*//*改进算法2.18,否则无法在第表长+1个结点之前插入元素*/DuLinkListp,s;if(i<1||i>ListLength(L)+1)/*i值不合法*/returnERROR;p=GetElemP(L,i-1);/*在L中确定第i个元素前驱的位置指针p*/if(!p)/*p二NULL,即第i个元素的前驱不存在(设头结点为第1个元素的前驱)*/returnERROR;s=(DuLinkList)malloc(sizeof(DuLNode));if(!s)

returnOVERFLOW;s->data=e;s->prior二p;/*在第i-1个元素之后插入*/s->next二p->next;p->next->prior=s;p->next=s;returnOK;}StatusListDelete(DuLinkListL,inti,ElemType*e){/*删除带头结点的双链循环线性表L的第i个元素,i的合法值为1<i<表长*/DuLinkListp;if(i<1)/*i值不合法*/returnERROR;p二GetElemP(L,i);/*在L中确定第i个元素的位置指针p*/if(!p)/*p二NULL,即第i个元素不存在*/returnERROR;*e=p->data;p->prior->next二p->next;p->next->prior二p->prior;free(p);returnOK;}voidListTraverse(DuLinkListL,void(*visit)(ElemType)){/*由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit()*/DuLinkListp二L->next;/*p指向头结点*/while(p!二L){visit(p->data

温馨提示

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

最新文档

评论

0/150

提交评论