循环链表Word格式.docx

上传人:b****6 文档编号:17685205 上传时间:2022-12-08 格式:DOCX 页数:15 大小:17.21KB
下载 相关 举报
循环链表Word格式.docx_第1页
第1页 / 共15页
循环链表Word格式.docx_第2页
第2页 / 共15页
循环链表Word格式.docx_第3页
第3页 / 共15页
循环链表Word格式.docx_第4页
第4页 / 共15页
循环链表Word格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

循环链表Word格式.docx

《循环链表Word格式.docx》由会员分享,可在线阅读,更多相关《循环链表Word格式.docx(15页珍藏版)》请在冰豆网上搜索。

循环链表Word格式.docx

所以我们必须改变一下做法,从思考的全过程中,我们可以采用下列两种方式:

第1种方式:

将循环链表改为单链表,即可用单链表释放的方式。

第一步将Pointer节点指向首节点的指针所指的节点(即第2个节点)。

第二步将首节点的指针指向NULL。

如此一来便成了一个单向的链表。

一个以Pointer节点为首节点的单链表。

Pointer=Head->

Next;

Head->

Next=NULL;

Head=Pointer;

Delete_List(Head);

第2种方式:

从循环链表的第2个节点开始释放

第二步持续往下一个节点释放,直到节点是首节点为止,最后再将首节点释放。

Next=Head->

while(Next!

=Head)

{

Pointer=Next;

Next=Next->

deletePointer;

}

deleteHead;

程序实例:

设计一个将输入的数据建立成循环链表、输出循环链表数据,并释放循环链表。

程序构思:

循环链表的建立:

先声明一个首节点Head,并将Head->

Next设为NULL;

每输一笔数据就声明一个新节点New,把New->

Next设为NULL,并且链接到之前列表的尾端。

最后一个节点的指针则指向首节点Head。

循环链表的输了出先将Pointer节点的指针指向第一个节点,将Pointer节点(即第一个节点)的数据输了出。

重复执行止步骤直到Pointer节点等等于首节点Head为止。

链接串状链表的释放:

将Pointer节点指向首节点的指针所指的节点(即第二个节点)。

持续往下一个节点释放,直到节点是首节点为止。

最后再将首节点释放。

程序源代码:

#include<

stdlib.h>

#defineMax110

structnode

intNumber;

node*Next;

};

//释放循环链表

voiddel_CList(node*Head)

node*Pointer;

node*Next;

=Head)//当下一个节点为首节点时,结束循环

//输出循环链表的数据

voidPrint_CList(node*Head)

Node*Pointer;

Pointer=Head;

printf(”请输入数据:

\n”);

do

printf(“[%d]”,Pointer->

Number);

Pointer=Pointer->

}while(Pointer!

=Head);

printf(“\n”);

//建立循环链表

node*Create_CList(node*Head,int*Data,intMax)

node*New;

inti;

Head=newnode;

if(Head==NULL)

printf(“内存申请失败!

else

{

Number=Data[0];

//定义首节点的数据编号

for(i=1;

i<

Max;

i++)

New=newnode;

New->

Number=Data[i];

Pointer->

Next=New;

Pointer=New;

returnHead;

//主程序

voidmain()

node*Head;

Head=Create_CList(Head,Data1,Max1);

if(Head!

=NULL)

Print_CList(Head);

del_CList(Head);

二、循环链表内节点的插入

循环链表内的节点插入,我们可以分为几个情况来讨论:

1、插入在循环链表开头之前

P324

如果新的节点插入在循环链表的开始。

第一步需要将新节点的指针指向循环链表的首节点,第二步将循环链表的最后一个节点的指针指向新的节点,最后再将首节点设为新节点。

Last->

Head=New;

2、插入在循环链表中间

如果新节点插入在循环链表的中间,我们可找到Pointer节点,则需要将新节点的指针指向Pointer节点的指针(即下一个节点),但不能让链表断裂缝。

所以第一步,必须将新节点的指针指向Pointer节点的指针、第二步再将Pointer节点的指针指向新节点。

Next=Pointer->

3、插入在循环链表尾端

新的节点插入在循环链表的尾端(Pointer节点),所以第一步,必须将新节点的指针指向Pointer节点的指针(即首节点Head),第二步再将Pointer节点的指针指向新节点。

设计一个循环链表内节点插入的程序。

声明一个新节点供用户输入欲插入节点的内容。

持续往下一个节点,直到节点内容等于Key或节点指针为Head(即找不到该节点)。

如果找到该节点,且该节点的指针是首节点,则插入在环状列表尾端之后:

如果找到该节点,且该节点的指针不是首节点(Head),则插入在环状列表中间:

如果找不到,则插入在首节点之前,即首节点之前:

intData1[Max1]={1,2,3,4,5,6,7,8,9,0};

node*Pointer;

//插入节点至链表内

node*Insert_CList(node*Head,node*New,intKey)

node*Last;

while

(1)

//插入在链表中间或尾端

if(Pointer->

Number==Key)

break;

//找不到数据,插入在链表首节点前

Number!

=Key&

&

Pointer->

Next==Head)

//输出循环链表数据

printf(“输出数据:

}while(Pointr!

node*Create_CList(node*Head,int*Data,intMax)

node*New;

printf(“内存配置失败!

intKey;

//调用建立环状链接串行

printf(“输0退出循环:

”);

printf(“请输入要插入的数据:

scanf(“[%d]”,&

New->

Numbe);

if(New->

Number==0)

printf(“PleaseinputthedatanumberforInsert:

scanf(“%d”,&

Key);

Head=Insert_CList(Head,New,Key);

三、循环链表内节点的删除

循环链表内节点的删除,依欲删除节点的位置来分,可分为下列几类:

1、删除循环链表首节点

P329

如果欲删除的节点是循环链表的首节点。

第一步需要将首节点指向下一个节点,第二步将循环链表的最后一个节点的指针指向首节点,最后再将原来的节点从内存中释放。

Head=Pointer->

2、删除循环链表中间节点

欲删除的节点在循环链表的中间,如果我们找到Pointer节点,则需要将前一个节点的指针指向Pointer节点的指针(即下一个节点),并将原来的节点从内存中释放。

3、删除循环链表尾端的节点

图:

P330

删除的节点在链表的尾端(Pointer节点),如果我们找到Pointer节点,则需要将前一个节点的指针指向Pointer节点(即为首节点)。

并将原来的节点从内存中释放。

Back->

设计一个删除循环链表内节点的程序。

持续往下一个节点查找欲删除节点,直到节点内容找到或节点指针为Head(即找不到该节点)。

在删除时,必须记录前一个节点的位置。

如果该节点不存在,输出消息说节点不存在。

如果该节点存在,且是首节点,则必须找到尾端的节点。

如果该节点存在,但非首节点(即链表列表中节点或尾端节点),则:

#include<

IntData1[Max1]={1,2,3,4,5,6,7,8,9,10};

voiddel_CList(node*Head)

//删除循环链表内节点

node*del_CList(node*Head,intKey)

node*Back;

if((Pointer->

=Key)&

(Pointer->

Next==Head))

printf(“NotFound!

!

if(Head->

Number==Key)//删除首节点

Last=Head;

while(Last->

Next!

Last=Last->

printf(“请输入要删除的数据:

if(Key==0)

Head=del_CList(Head,Key);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1