链表倒序问题(双向链表的基础运用)

来源:互联网 发布:益盟资金博弈指标源码 编辑:程序博客网 时间:2024/06/16 03:27
#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');}

在链表问题中,会遇到反向输出的问题,而对于反向输出,大部分人会利用辅助节点进行倒换指针然后进行输出,而如此做会使用过多的语句。

而双向链表则是在保持原链表结构不变的前提下,利用链表结构中的前向指针从尾节点向前依次输出直到头节点,

同理,顺序输出时也是如此,即利用后向指针,从头节点向后输出,

从而实现了链表的正向、反向输出,比起单向链表更加的简洁,且容易理解。

但要注意前后节点链接时需要两个指向关系从而使前向、后向通路均畅通无阻。

0 0
原创粉丝点击