链表基础4(超简单)--创建一个长度为n的双向链表(代码可运行)

单链表的基础知识,创建,增删,逆序可以看我前几篇博客。点下面相应就可以跳过去咯!
链表基础1(超简单)–创建一个长度为n的单链表
链表基础2(超简单)–单链表的插入和删除
链表基础3(超简单)–单链表的逆序
首先我们来理解一下什么是双向链表,话不多说上图:
在这里插入图片描述
head是头节点地址,a1、a2分别是后面两个节点地址。
单项链表不就是a1的B存放head的地址嘛,a2的B存放a1的地址,这样不就连接起来了嘛
双向链表也是一样,只是在节点结构上比单项链表多了一个指针域,就是上图的A。尾节点a2的A中存放a1的地址,a1的A中存放头节点的地址,这样这条链表正反不都可以遍历了嘛。这就是双向链表。
下面开始上代码:
这是我的节点结构

typedef struct lianbiao
{
        int date;
        struct lianbiao *pnext;
        struct lianbiao *pturn;
}link;
link *pnew;//新节点
link *phead;//头节点
link *ptemp;//临时节点
link *pend;//保存尾节点

完整程序如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct lianbiao
{
        int date;
        struct lianbiao *pnext;
        struct lianbiao *pturn;
}link;
link *pnew;//新节点
link *phead;//头节点
link *ptemp;//临时节点
link *pend;//保存尾节点
int count=1;
void creat(void);
void add(void);
int main()
{
    int n,i;
    printf("请输入所需要创建的链表长度,不可为0\n");
    scanf("%d", &n);
    creat();
    for(i=0;i<n-1;i++)
    {
        add();
    }
  printf("链表创建完毕,双向链表头->尾遍历输出链表所有数据\n");

  //printf("%d ", phead->date);
  for(ptemp=phead;ptemp!=NULL;ptemp=ptemp->pnext)
   {
       printf("%d ", ptemp->date);
   }
   printf("\n");
    printf("双向尾->头遍历输出链表所有数据\n");
    for(ptemp=pend;ptemp!=NULL;ptemp=ptemp->pturn)
    {
    printf("%d ", ptemp->date);
    }

   return 0;
}
void creat(void)//创建头节点
{
    phead=(link*)malloc(sizeof(link));
    phead->pnext=NULL;
    phead->pturn=NULL;
    phead->date=0;
}
void add(void)//添加节点
{
    pnew=(link*)malloc(sizeof(link));
    pnew->date=count;
    pnew->pnext=0;
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        ptemp=ptemp->pnext;
    }
    ptemp->pnext=pnew;
    pnew->pturn=ptemp;
    pend=pnew;//注意保存尾节点地址,便于尾->头遍历
    //pnew=NULL;
    count++;
}

这里说一下,我习惯把头节点和尾节点的数据域里面都存放数据,个人认为这样比较完美利用空间
下面是运行结果:
在这里插入图片描述
感谢评阅,如有问题可以在评论区或者私信我!欢迎指正交流。qq:918619587

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值