- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                线性表链存储结构
                    2.3  线性表的链式存储结构             线性表顺序存储结构的特点             它是一种简单、方便的存储方式。它要求线性表的数据元素依次存放在连续的存储单元中,从而利用数据元素的存储顺序表示相应的逻辑顺序,这种存储方式属于静态存储形式。             暴露的问题             l	在做插入或删除元素的操作时,会产生大量的数据元素移动;    l	对于长度变化较大的线性表,要一次性地分配足够的存储空间,但这些空间常常又得不到充分的利用;    l	线性表的容量难以扩充。     线性表的链式存储结构               线性表的链式存储结构是指用一组任意的存储单元(可以连续,也可以不连续)存储线性表中的数据元素。为了反映数据元素之间的逻辑关系,对于每个数据元素不仅要表示它的具体内容,还要附加一个表示它的直接后继元素存储位置的信息。假设有一个线性表(a,b,c,d),可用下图2所示的形式存储:            术语             表示每个数据元素的两部分信息组合在一起被称为结点;            其中表示数据元素内容的部分被称为数据域(data);             表示直接后继元素存储地址的部分被称为指针或指针域(next)。             单链表简化为下图描述形式             其中,head是头指针,它指向单链表中的第一个结点,这是单链表操作的入口点。由于最后一个结点没有直接后继结点,所以,它的指针域放入一个特殊的值NULL。NULL值在图示中常用(^)符号表示。             带头结点的单链表             为了简化对链表的操作,人们经常在链表的第一个结点之前附加一个结点,并称为头结点。这样可以免去对链表第一个结点的特殊处理。(头结点中数据域根据需要存放一些便于操作的信息,如元素个数等;或不存放任何信息。其引入使得所有链表(即使是空表)的值都不为NULL。)如下图所示:             链式存储结构的特点           (1)线性表中的数据元素在存储单元中的存放顺序与逻辑顺序不一定一致;           (2)在对线性表操作时,只能通过头指针进入链表,并通过每个结点的指针域向后扫描其余结点,这样就会造成寻找第一个结点和寻找最后一个结点所花费的时间不等,具有这种特点的存取方式被称为顺序存取方式。 在C语言中,实现线性表的链式存储结构的类型定义 typedef strcut LNode{    //结点类型   ElemType  data;   struct LNode *next; }LNode; typedef struct{ //链表类型   LNode *head; }LinkList;       2.3.2 典型操作的算法实现 1.  初始化链表L:创建带头结点的空链表。 int InitList(LinkList *L)    {   L-head=(*LNode)malloc(sizeof(LNode));         //为头结点分配存储单元   if (L-head) {L-head-next=NULL; return OK;}        else  return ERROR ; } 2.  销毁链表L:删除链表中包括头结点在内所有结点。  void DestoryList(LinkList *L) {   LNode *p;   while (L-head){             //依次删除链表中的所有结点     p=L-head;  L-head=L-head-next;     free(p);   } }//从头结点开始删,直到删完为止。 3.  清空链表L :删除链表中除头结点外的所有结点。  void ClearList(LinkList *L) {    LNode *p;    while (L-head-next){       p=L-head-next;  //p指向链表中头结点后面的第一个结点       L-head-next=p-next;     //删除p结点       free(p);     //释放p结点占据的存储空间    } }//从头结点后的第一个结点开始删,直到删完为止。 4.  求链表L的长度 int ListLength(LinkList  L) {   LNode *p;   int len;   for(p=L.head, len=0;p-next==NULL;  p=p-next,len++);   return(len);                循环条件表达式   重复执行的语句 } 
                
原创力文档
                        

文档评论(0)