【数据结构】双向循环链表

  • 双向循环链表的结构体定义
  • 初始化双向循环链表
  • 尾插法构建双向循环链表
  • 双向循环链表的后序遍历操作
  • 主函数调用

目录:

    • 目录:
    • 各部分实现:
      • 双向循环链表的结构体定义
      • 初始化双向循环链表
      • 尾插法构建双向循环链表
      • 双向循环链表的后序遍历操作
      • 主函数调用
    • 全部代码:


各部分实现:

双向循环链表的结构体定义

双向链表的每个结点需要连接前一个结点和后一个结点,所以需要定义两个指针域,分别指向前一个结点和后一个结点。

typedef struct tagNode
{
    int data;
    struct tagNode *pre,*next;
}Node,*LinkList;

初始化双向循环链表

初始化时两个指针都指向其自身。

void InitList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=(*L)->pre=*L;
}

尾插法构建双向循环链表

利用尾插法插入时,新插入的结点的后驱指向头结点,同时更新头结点的前驱指针指向新加入的结点,前一个结点的后驱指针更新为指向新的结点。

void CreateLink(LinkList L,int n)
{
    LinkList p=L,q;
    while(n--)
    {
        q=(LinkList)malloc(sizeof(Node));
        scanf("%d",&q->data);
        p->next=q;
        q->pre=p;
        q->next=L;//尾插法
        L->pre=q;
        p=q;
    }
}

双向循环链表的后序遍历操作

void TraverseList(LinkList L)
{
    LinkList p=L->pre;
    while(p!=L)
    {
        printf("%d ",p->data);
        p=p->pre;
    }
}

主函数调用

int main()
{
    int n;
    LinkList L;
    InitList(&L);
    scanf("%d",&n);
    CreateTailList(L,n);
    TraverseList(L);
    return 0;
}

全部代码:


#include 
#include 

typedef struct tagNode
{
    int data;
    struct tagNode *next,*pre;
}Node,*LinkList;

void InitList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=(*L)->pre=*L;
}

void CreateLink(LinkList L,int n)
{
    LinkList p=L,q;
    while(n--)
    {
        q=(LinkList)malloc(sizeof(Node));
        scanf("%d",&q->data);
        p->next=q;
        q->pre=p;
        q->next=L;//尾插法
        L->pre=q;
        p=q;
    }
}

void TraverseList(LinkList L)
{
    LinkList p=L->pre;
    while(p!=L)
    {
        printf("%d ",p->data);
        p=p->pre;
    }
}

int main()
{
    int n;
    LinkList L;
    InitList(&L);
    scanf("%d",&n);
    CreateLink(L,n);
    TraverseList(L);
    return 0;
}

你可能感兴趣的:(acm)