如何用尾插法建立双链表
其实本来是想完成汪队给的链表快排的作业,但是我写完建立双链表以后就12点了龟龟,明天还要早起QAQ,我菜死了
一,为啥要有双链表
先说单链表吧
单链表长这样
他的一个结点结构就是
【元素域 | next指针域】
每次后插法进行单链表的建立时,上一个的结点里的指针域都会指向下一个结点,比如上图的第一个结点(e1元素所在结点,蓝色阴影结点为头结点)的指针域就指向了下一个结点
以此类推
我们就可以得到一个由指针链接的链表,这就叫单链表
我们可以看到,如果我有某元素所在结点的指针域是可以很轻松在这个元素所在结点的左右进行结点的插入的
但是!!!如果我想在这个元素的前一个元素进行前插的话,我必须又要将这个表从头开始遍历一遍,这就大大浪费了时间(就是在开车在单行线不能掉头)
所以我们引入了双链表
二,双链表的建立
双链表长下面这样
他的一个节点结构就是
【prior指针域 | 元素域 | next指针域】
双链表就比上面的单链表多了一个“prior指针域”,prior是指向前一个结点的针,next和上面的单链表一样都是指向后面的一个结点指针
回到上面的问题
如果我们还要进行在某个元素的前一个元素进行前插的话,用双链表就会快很多
因为我们不再需要去从头开始遍历整个表,双链表的每个结点都存着的上一个结点的地址
我们只需要将指针前移就能完成(单行线变双行线虚线!随时可以掉头回去)
下面就是如何建立双链表的步骤
1.双链表的结点类型定义
1 typedef struct DNode{ 2 int data; 3 struct DNode *prior, *next; 4 }DNode, *DLinkList;
定义了一个元素域(我这里用的int类型,可更换),两个指针域*prior和*next,分别用来指向该结点的前一个结点和后一个结点
2.双链表的建立
1 DLinkList DList_Create(DLinkList &D) 2 { 3 int num; 4 scanf("%d",&num); 5 D = (DNode*)malloc(sizeof(DNode)); //定义头结点 6 DNode *s,*p = D;//s为待插入结点的指针 7 p->next = NULL; 8 while(num != -1)//输入-1时停止 9 { 10 s = (DNode*)malloc(sizeof(DNode));//为待插入的s申请空间 11 s->data = num; 12 s->next = p->next;//s的next复制上一个结点p的next域 13 p->next = s;//上一个结点p的next指向s 14 s->prior = p;//s的prior指向前一个结点p 15 p = p->next;//p指针后移一位 16 scanf("%d",&num);//下个元素的值 17 } 18 return D; 19 }
while里的步骤如下
s = (DNode*)malloc(sizeof(DNode));//为待插入的s申请空间
s->next = p->next;//s的next复制上一个结点p的next域
p->next = s;//上一个结点p的next指向s
s->prior = p;//s的prior指向前一个结点p
p = p->next;//p指针后移一位
现在1.22了再不睡我就要猝死了,链表快排要不明天抄作业叭
嘿嘿