双链表的初始化(带头结点)

初始化代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>

typedef struct DNode{
int data;
struct DNode *prior, *next;
}DNode, *DLinklist;

// 初始化双链表
bool InitDLinkList(DLinklist &L)
{
// 分配头节点
L = (DNode *) malloc (sizeof(DNode));
if (L == NULL)return false;

L->prior = NULL; //前头结点指向NULL
L->next = NULL;
return true;
}

void testDLinklist()
{
DLinklist L;
InitDLinkList(L);

}

// 判断双链表是否为空
bool Empty(DLinklist L)
{
if (L->next == NULL) return true;
else return false;
}

image-20221203155841502

插入结点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <stdlib.h>

typedef struct DNode{
int data;
struct DNode *prior, *next;
}DNode, *DLinklist;

// 初始化双链表
bool InitDLinkList(DLinklist &L)
{
// 分配头节点
L = (DNode *) malloc (sizeof(DNode));
if (L == NULL)return false;

L->prior = NULL; //前头结点指向NULL
L->next = NULL;
return true;
}

void testDLinklist()
{
DLinklist L;
InitDLinkList(L);

}

// 判断双链表是否为空
bool Empty(DLinklist L)
{
if (L->next == NULL) return true;
else return false;
}

//再p结点之后插入s结点

bool InsertNextDNode(DNode *p, DNode *s)
{
if (p ==NULL || s == NULL) return false;

// NULL不需要指向s
s->next = p->next;
// 如果p结点有后继结点
if (p->next != NULL) p->next->prior = s;
s->prior = p;
p->next = s;
return true;

}

image-20221203201327382

image-20221203160319038

说明图

image-20221203162838256

双链表的删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 删除p结点的后继结点
bool DeleteNextDNode(DNode *p)
{
if (p == NULL) return false;
DNode *q = p->next;
// p没有后继节点
if (q == NULL) return false;
p->next = q->next;
// 等号的右边是指针指向的方向
if (q->next != NULL) q->next->prior = p;

delete q;
return true;
}

循环链表

循环单链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>


typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;

bool InintList(LinkList L)
{
L = new LNode;
if (L == NULL) return false;

L->next = L;
return true;
}

// 判断是否为空
bool Empty(LinkList L)
{
if (L->next == L) return true;
else return false;
}

// 判断结点p是否为循环单链表的表位结点

bool isTail(LinkList L, LNode *p)
{
if (p->next == L) return true;

else return false;
}

image-20221203172604789

循环双链表

image-20221203203249800