- 1、本文档共98页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.3线行链表和其运算
2.3线性表的链式存储及其运算 ;2.3.1线性表的链式存储 ; 链式存储结构,既可用来表示线性结构,也可用来表示非线性结构。线性表的链式存储结构,称为线性链表。
对线性链表而言,它不要求逻辑上相邻的元素在物理位置上也相邻。其存储单元既可以是连续的,也可以是不连续的,甚至可以零散分布在内存中的任何位置上。 ;; 用下面例子,来说明线性链表的存储结构。
设线性表为(a1,a2,a3,a4), 存储空间具有9个存储结点。 ;数据域 指针域
A2 9
A1 1
A4 0
A3 5
;2.3.2线性链表的基本运算 ; 为了便于实现插入、删除结点的操作,通常在单链表的第一个结点之前增设一个表头结点。该结点的结构与表中其他结点的结构相同,其数据域可以不存储任何信息,也可以存储如线性表的表名、长度等附加信息;其指针域用来存放线性表中的第一个结点的地址。若线性表为空表,则表头结点的指针域为空,设H为单链表的头指针,指向头结点;存储单链表的第一个元素的结点称为开始结点(或称首结点),其指针域存放第二个结点的地址;称存储最后一个元素的结点称终端结点(或称尾结点),其指针域为空,如图3-5所示。 ;; 若用换行符‘\n’作为输入结束标志,用rear作为总是指向链表尾结点的尾指针,则建立带表头结点的先进先出单链表的算法如下: ; if(!H)
{
printf(\n 存储分配失败);
exit(1);
}
H-next=NULL; /*表初值为空*/
rear=H; /*尾指针指向表头结点*/
while((ch=getchar())!=\n)
{ p=(LinkList)malloc(sizeof(
ListNode)); /*生成新结点*/; if(!p)
{
printf(\n 存储分配失败);
exit(1);
}
p-data=ch;
p-next=p; /*新结点插入表尾*/
rear=p; /*尾指针指向新结点*/
}
return(H); /*返回头指针*/
}; ② 后进先出表:在建立单连表时,将每次生成的新结点,总是插入到当前链表的表头结点之后作为当前链表的首结点。若用换行符‘\n’作为输入结束标志,则建立带表头结点的后进先出单链表的算法如下: ; if(!H)
{
printf(\n 存储分配失败);
exit(1);
}
H-next=NULL; /*表初值为空*/
while((ch=getchar())!=\n)
{
p=(LinkList)malloc(sizeof(
ListNode)); /*生成新结点*/; if(!p)
{
printf(\n 存储分配失败);
exit(1);
}
p-data=ch;
p-next=H-next;
H-next=p;/*插入表头结点之后*/
}
return(H); /*返回头指针*/
}; ③ 有序单链表:是指原表中结点的数据值,按从小到大(或从大到小)的顺序排列。为了建立一个有序单链表,每次生成的新结点,总是插入到当前链表的合适位置。在带表头结点的单链表中,所有位置上的插入操作都是一致的,不需要做特殊处理。 ;LinkList CreateList_or( )
{
LinkList H,pre,cur; /*pre将指向当前结点的前件,cur将指向当前结点*/
char ch;
H =(LinkList)malloc(sizeof(
ListNode)); /*生成表头结点*/
if(!H)
{ printf(\n 存储分配失败);
exit(1);
};H-next=NULL;/*表初值为空*/
while((ch=getchar( ))!=’\n’)
{
pre=H;/*pre指向当前结点的前件*/
cur=H-next;/*cur指当前结点*/
while(curcur-datach)
/*找出新结点在表中的合适位置*/
{
pre=cur;
cur=cur-next;
};cur=(LinkList)malloc(sizeof(
ListNode)); /*生成新结点*/
if(!cur)
{
printf(\n 存储分配失败);
exit(1);
}
cur-data=ch;
cur-next=pre-next; /*新结点插在pre所指结点的后面*/ ;pre-next=cur;/
文档评论(0)