数据结构——链表(6)循环链表

循环链表是一种首尾相连的链表。
和单链表的区别在于对尾结点的处理:①单链表的尾结点指向空,而循环链表的尾结点指向头结点(或第一个结点)。
②单链表的局限是只能从头开始遍历链表;而循环链表可以从表中的任意一个位置开始遍历整个链表。
③单链表一般使用头指针head操作;循环链表通常使用尾指针rear标识链表,这样在链表尾部进行处理的时候使用rear指针效率较高。

对于两个循环链表,在合并成一个循环链表时,要注意释放掉第二个循环链表的头结点,代码实现如下:

p=rear1->next;//记录第一个链表的头结点
rear1->next=rear2->next->next;//头尾相连
free(rear2->next);  //释放第二个链表的头结点
rear2->next=p;  //将第二个链表的尾指针指向第一个链表的头结点

另外,对循环链表的实现如下:

/*创建一个==只有==尾指针rear的===单循环===链表*/
Linklist rear=NULL;
Linklist CreateSingleLoopList()
{
    int _data;
    Linklist pCurrrent,head;
    head=(Linklist)malloc(sizeof(Node));    //定义一个头结点
    scanf("%d",&_data);
    rear->data=_data;
    rear->next=head;
    head->next=rear;
    scanf("%d",&_data);
    while(_data!=-1)
    {
        pCurrrent=(Linklist)malloc(sizeof(Node));
        pCurrrent->data=_data;
        rear->next=pCurrrent;
        pCurrrent->next=head;
        rear=pCurrrent;
        scanf("%d",&_data);

    }
    return rear;
}

/*取开始结点和尾结点*/
void GetRearHead(Linklist L)
{
    printf("%d\n",L->data); //尾结点
    printf("%d\n",L->next->next->data);//有头结点,取第一个开始的结点

}

int main()
{
    rear=(Linklist)malloc(sizeof(Node));
    CreateSingleLoopList();
    GetRearHead(rear);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhangying_496/article/details/81368802