【悬赏】数据结构,c语言,循环链表的问题!

2025-02-24 15:52:33
推荐回答(1个)
回答1:

在回答你们问题之前..我先把你的LinkList类型和LNode类型定义了..方便讲解
typedef struct NODE
{
int i;//假设这里是内容
struct NODE *next;//下一个节点连接
}LNODE;//定义了LNODE类型
typedef LNODE *LinkList;//定义了LinkList类型
问题1:头节点的next指向下一个节点的地址(不一定是最后一个节点的地址),而最后一个节点的next指针指向头节点的地址(因为这样才能形成环)
问题2:
不对;如果不考虑函数来创建循环列表..那么在main()函数中的创建代码应该为
LinkList head=NULL,p,q;//这里定义了头指针,并且初始化
p=q=head;
while (输入数字有效,否则停止)
{
//准备节点数据
p=(LinkList)malloc(sizeof(LNODE));//申请一个节点
p->i=你输入的数据;
p->next=NULL;//设为NULL..便于成为尾部时重复设置
if (head==NULL) head=p;//将表头设置为你才申请的地址
else q->next=p;//若头指针已经创建..那么连接下一个节点
q=p;//让q指向当前节点
}
//输入完成后..开始结成环..使之循环
q->next=head;//完成
问题3:
根据问题2创建的循环列表ha,hb,你会得到两个头指针ha,hb
p=ha;ha=hb-next;hb=p;
这样做相当于在hb这个环上第二个节点(相对于表头)接了一个ha环(环和循环列表同义)..所以实质上没有改变
如果你要合并它们两个..方法很多..如果只是单纯的连接在一块并且在形成一个新的循环列表
以ha表头为准(因为表头保留了地址..当然你可以选择任何节点..但是需要先寻找)
p=ha->next;//保留下下一个节点的地址
ha->next=hb;//ha表头将连接到hb表头,此时ha环已经断开
断开hb环..此时只能断开首尾相接处.
假设你已经保留了尾节点地址q(这需要你用算法取得.)
那么
q->next=p;//让hb的尾节点和ha断开后的第二个节点相连接
这样就完整的把两个循环列表连接了成了一个循环列表...
问题4:
free(hb)只是释放一个节点而已..不会影响hb->next这个地址(节点).因为hb和hb->next是两个独立的地址..
所以你要释放全部节点..
只需要遍历全表
将要释放的节点选出来..利用一个同类型变量来取值..然后依次释放..
综上:free(hb->next)只是下一个节点的释放..到最后..就是释放最后一个节点了..
PS:
从上面的描述..如果你要在其他函数中建立表..重新定义一个数据
typedef struct Link
{
LNODE *head;//这里完全就被封装了..提供了一个入口
int size;//记录循环表长度..
}Linklist;//这个类型就是一个入口.. 所以建立时需要判断入口是否建立..
typedef Linklist *LinkList;//这样可以产生一个size伴随函数记录环的长度..便于你寻找尾节点.
当然上述在main()中完成的定义.你只需要定义一个变量来记录环的长度就行了..
后面的定义就不给代码了.因为很长..相信你以后学习到后面时也可以掌握后面的定义..
GOOD LUCK