深度
在创建带头结点的双链表前我们需要先了解什么是双链表:
双链表是在单链表的基础上多了一个 指向其直接前驱的指针初始状态因为只有一个头结点所以,L->next=NULL;L-.prior=NULLL;这样在任何一个结点都可以很方便的访问其前驱结点和后继结点
在访问其前驱和后继是时间复杂度都为O(1)
创建头结点的双链表可以使用头插法和尾插法来实现
下面依次讲解:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
LNode *prior;
LNode *next;
}LNode, *LinkList;
void CreateListtail(LinkList &L)
{
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;//初始化前驱后继指向空
L->prior = NULL;
LNode *r, *s;
r = L;
int x;
scanf_s("%d", &x);
while (x!=9999)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;//尾指针指向新节点
s->prior = r;//新节点的前驱指向尾指针
r = s;//尾指针后移
scanf_s("%d", &x);
}
r->next = NULL;
}
void CreateListHead(LinkList &L)
{
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;//初始化前驱后继指向空
L->prior = NULL;
LNode *s;
int x;
scanf_s("%d", &x);
while (x != 9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;//新节点赋值
s->next = L->next;//新节点的后继等于头结点的后继
if (L->next != NULL)//为空的时候特殊处理因为双链表的尾结点是始终指向空的
{
L->next->prior = s;//让新节点变成变成其后继的前驱
}
L->next = s;//头结点的后继赋值新节点
s->prior = L;//新节点的前驱赋值为头结点
scanf_s("%d", &x);
}
}
void printL(LinkList L)//打印数据
{
LNode *p = L->next;
while (p)
{
printf("%d\n", p->data);
p = p->next;
}
}
int main()
{
LinkList L;
LinkList L1;
// CreateListtail(L);
CreateListHead(L1);
printL(L1);
}