1. 程式人生 > >連結串列倒序問題(雙向連結串列的基礎運用)

連結串列倒序問題(雙向連結串列的基礎運用)

#include <stdio.h>
#include <stdlib.h>
struct node
{
    int key;
    struct node *next,*before;//結構中包含前向指標before,後向指標next
};
typedef struct node n;
void main()
{
    int a;
    n *head,*en,*p,*q,*p3,*p4;
    head=(n*)malloc(sizeof(struct node));//頭節點
    en=(n*)malloc(sizeof(struct node));//尾節點
    head->next=en;
    en->before=head;
    head->before=NULL;
    en->next=NULL;
    p=(n*)malloc(sizeof(struct node));
    head->next=p;
    p->before=head;
    en->before=p;
    p->next=en;
    while(1)
    {
        scanf("%d",&a);
        if(a)
            {
                p->key=a;
                p->next=q=(n*)malloc(sizeof(struct node));
                q->before=p;
                p=q;
            }
            else
            {
                p->before->next=en;//需要注意此處與en連線的節點並不是最終的p,而是它的前一個節點
                en->before=p->before;
                break;
            }

    }
    p3=head->next;//正序輸出:從頭節點開始輸出
     while(p3->next!=NULL)
    {
        printf("%d ",p3->key);
        p3=p3->next;
    }

    putchar('\n');
     p4=en->before;//翻轉輸出:從尾節點開始輸出
     while(p4->before!=NULL)
    {
        printf("%d ",p4->key);
        p4=p4->before;
    }

    putchar('\n');
}

在連結串列問題中,會遇到反向輸出的問題,而對於反向輸出,大部分人會利用輔助節點進行倒換指標然後進行輸出,而如此做會使用過多的語句。

而雙向連結串列則是在保持原連結串列結構不變的前提下,利用連結串列結構中的前向指標從尾節點向前依次輸出直到頭節點,

同理,順序輸出時也是如此,即利用後向指標,從頭節點向後輸出,

從而實現了連結串列的正向、反向輸出,比起單向連結串列更加的簡潔,且容易理解。

但要注意前後節點連結時需要兩個指向關係從而使前向、後向通路均暢通無阻。