- 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 线性表的链式表示和实现; 其中:data域是数据域,用来存放结点的值。next是指针域(亦称链域),用来存放结点的直接后继的地址(或位置)。
链表正是通过每个结点的链域将线性表的n个结点按其逻辑次序链接在一起的。由于上述链表的每一个结点只有一个链域,故将这种链表称为单链表(Single Linked)。
显然,单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。同时,由于最后一个结点无后继,故结点的指针域为空,即NULL(图示中常用^表示)。 ;例1、线性表:(bat,cat,eat,fat,hat,jat,lat,mat); 单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名。; 一旦p所指的结点变量不再需要了,应该通过 delete p;释放所指的结点变量空间。;一、建立单链表
问题:假设线性表中结点的数据类???是字符,逐个输入这些字符型的数据,并以换行符‘$’为输入结束标记。
动态地建立单链表的常用方法有如下两种:
1、头插法建表
该方法从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志(比如$)为止。;void CreateList1( LNode *h)
{ char ch;
LNode *p;
h=NULL;
cinch;
while (ch!=‘$’){
p=new LNode;
p–data=ch;
p–next=h;
h=p;
cin ch; }
} ;;类表示; {
p=new LNode;
p-data=ch;
p-next=head;
head=p;
cin ch;
}
}
/*
void List::CreateList1( List h)
{
char ch;
LNode *p;
cinch;
while (ch!=$)
{
p=new LNode;
p-data=ch;
p-next=head;
;2、尾插法建表
头插法建立链表虽然算法简单,但生成的链表中结点的次序和输入的顺序相反。若希望二者次序一致,可采用尾插法建表。该方法是将新结点插入到当前链表的表尾上。
为此必须增加一个尾指针r,使其始终指向当前链表的尾结点。例:;头结点(哨兵结点)引入:
增加一个表头结点,数据域可根据需要使用或不用。; 上述算法里动态申请新结点空间时未加错误处理,在实际使用时间,可作下列判定与处理:
p= new LNode;
if(p= =NULL) 错误处理; ;二、查找运算
1、按序号查找
在链表中,即使知道被访问结点的序号i,也不能象顺序表中那样直接按序号i访问结点,而只能从链表的头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点为止。因此,链表不是随机存取结构。
设单链表的长度为n,要查找表中第i个结点,仅当1=i=n时,i的值是合法的。但有时需要找头结点的位置,故我们将头结点看做是第0个结点,其算法如下:;LNode * getnode( head ,i)
//在链表head中取第i个数据链表有头结点
{
p=head;
j=0; //计数用
while(p–next ji){
p=p–next;
j++;
}
if (i==j)
return p;
else return NULL;
};2、按值查找
按值查找是在链表中,查找是否有结点值等于给定值key的结点,若有,则返回首次找到的其值为key的结点的存储位置;否则返回NULL。查找过程从开始结点出发,顺着链表逐个将结点的值和给定值key作比较。其算法如下:;三、插入运算
插入运算是将值为x的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间。因此,必须首先找到ai-1的存储位置p,然后生成一个数据域为x的新结点,并令q指针指向该新结点,新结点的指针域指向结点ai。从而实现三个结点ai-1,x和ai之间的逻辑关系的变化;三、插入运算
插入运算是将值为x的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间。因此,必须首先找到ai-1的存储位置
文档评论(0)