循环链表
单循环链表
由上一节的单向链表可知,如果我们想要遍历链表中的所有元素必须要知道链表的头结点,通过头结点开始顺着指针链依次访问每个结点,知道最后一个结点,因此访问的方式受到了一定的限制,假设我们知道的是链表中的任意一个结点,那么,要想访问单链表的所有结点我们该怎么办呢?所以我们要引入一种新的链表形式来解决这个问题,这种形式就是单循环链表。
图解
注意:一般循环链表都是用尾指针的表示方法(即rear),这样既可以找到第一个结点也可以找到最后一个结点
数据类型表示
typedef int DataType;
struct Node
{
DataType data;
struct Node*next;
};
typedef struct Node*PNode;
typedef structNode*CLinkList;
建立单循环链表
CLinkList CreatRearCircle()
{
int data;
PNode rear,p;
CLinkList head = (CLinkList)malloc(sizeof(struct Node));
if(head!=NULL)
{
head->next=head;
rear=head;
printf("请输入整型数据以-1结束:\n")
scanf("%d",&data);
while(data!=-1)
{
p = (PNode)malloc(sizeof(struct Node));
p->data=data;
p->next=head;
rear->next=p;
rear=p;
scanf("%d",&data);
}
}
return rear;
}
例题:两个单循环链表的合并
//代码实现
CLinkList Combine(CLinkList ra,CLinkList rb)
{
PNode p =ra->next;
ra->next=rb->next->next;
free(rb->next);
rb->next=p;
return rb;
}