数据结构-双向循环链表

单向循环链表:

单链表通过首尾连接可以构成单向循环链表

数据结构-双向循环链表_第1张图片

 

双向循环链表:

双向链表进行首尾连接

当问题中涉及到需要 "循环往复" 地遍历表中数据时,就需要使用双向循环链表。

创建双向链表:

//创建双向循环链表
line* initLine(line * head){
    head=(line*)malloc(sizeof(line));
    head->prior=NULL;
    head->next=NULL;
    head->data=1;
    line * list=head;
    for (int i=2; i<=3; i++) {
        line * body=(line*)malloc(sizeof(line));
        body->prior=NULL;
        body->next=NULL;
        body->data=i;
        list->next=body;
        body->prior=list;
        list=list->next;
    }
    //通过以上代码,已经创建好双线链表,接下来将链表的首尾节点进行双向连接
    list->next=head;
    head->prior=list;
    return head;
}

 通过向 main 函数中调用 initLine 函数,就可以成功创建一个存储有 {1,2,3} 数据的双向循环链表,

#include 
#include 
typedef struct line{
    struct line * prior;
    int data;
    struct line * next;
}line;
line* initLine(line * head);
void display(line * head);
int main() {
    line * head=NULL;
    head=initLine(head);
    display(head);
    return 0;
}
//创建双向循环链表
line* initLine(line * head){
    head=(line*)malloc(sizeof(line));
    head->prior=NULL;
    head->next=NULL;
    head->data=1;
    line * list=head;
    for (int i=2; i<=3; i++) {
        line * body=(line*)malloc(sizeof(line));
        body->prior=NULL;
        body->next=NULL;
        body->data=i;
        list->next=body;
        body->prior=list;
        list=list->next;
    }
    //通过以上代码,已经创建好双线链表,接下来将链表的首尾节点进行双向连接
    list->next=head;
    head->prior=list;
    return head;
}
//输出链表的功能函数
void display(line * head){
    line * temp=head;
    //由于是循环链表,所以当遍历指针temp指向的下一个节点是head时,证明此时已经循环至链表的最后一个节点
    while (temp->next!=head) {
        if (temp->next==NULL) {
            printf("%d\n",temp->data);
        }else{
            printf("%d->",temp->data);
        }
        temp=temp->next;
    }
    //输出循环链表中最后一个节点的值
    printf("%d",temp->data);
}

输出结果:

数据结构-双向循环链表_第2张图片

 

你可能感兴趣的:(#,数据结构与算法下,链表,数据结构)