链表实现

Posted by XDong on September 19, 2022

链表

结构体定义

1
2
3
4
5
// 单链表结构体
typedef struct LNode {
  ElemType data;
  struct LNode *next;
} LNode, *LinkedList;

头插法

1
2
3
4
5
6
7
8
9
10
11
12
13
// 头插法
LinkedList HeadInsert(LinkedList &L) {
  int x;
  L = new LNode;  // 创建头结点
  L->next = NULL;        // 初始化为空链表
  while (cin >> x && x != -1) {  // 输入-1表示结束
    LNode *s = new LNode;
    s->data = x;
    s->next = L->next;
    L->next = s;
  }
  return L;
}

尾插法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 尾插法
LinkedList TailInsert(LinkedList &L) {
  int x;
  L = new LNode;  // 创建头结点
  L->next = NULL;        // 初始化为空链表
  LNode *r = L;          // r为表尾结点
  while (cin >> x && x != -1) {  // 输入-1表示结束
    LNode *s = new LNode;
    s->data = x;
    r->next = s;
    r = s;
  }
  return L;
}

按序号查找结点值

1
2
3
4
5
6
7
8
9
10
11
12
// 按序号查找结点值
LNode *GetElem(LinkedList L, int i) {
  int j = 1;              // 计数器
  LNode *p = L->next;     // p为第1个结点指针
  if (i < 0) return NULL; // i无效,返回NULL
  if (i == 0) return L;   // i=0,返回表头
  while (p && j < i) {    // 查找第i个结点
    p = p->next;
    j++;
  }
  return p;               // 返回第i个结点的指针,若i>表长,返回NULL
}

按值查找表结点

1
2
3
4
5
6
7
8
// 按值查找表结点
LNode *LocateElem(LinkedList L, ElemType e) {
  LNode *p = L->next;
  while (p && p->data != e) {  // 从第1个结点查找数据为e的结点
    p = p->next;
  }
  return p;
}

插入操作

1
2
3
4
5
6
7
8
9
// 插入操作
void Insert(LinkedList L, int i, ElemType e) {
  LNode *p = GetElem(L, i-1);  // 查找i的前驱结点
  while (p) {
    LNode *q = new LNode;
    q->next = p->next;
    p->next = q;
  }
}

删除操作

1
2
3
4
5
6
7
8
9
// 删除操作
void Delete(LinkedList L, int i) {
  LNode *p = GetElem(L, i-1);  // 查找i的前驱结点
  while (p) {
    LNode *q = p->next;
    p->next = q->next;
    delete q;
  }
}

双链表结构体定义

1
2
3
4
5
6
// 双链表结构体
typedef struct DLNode {
  ElemType data;
  struct DLNode *prev;
  struct DLNode *next;
} DLNode, *DLinkedList;

所有代码

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
using namespace std;
typedef int ElemType;

// 单链表结构体
typedef struct LNode {
  ElemType data;
  struct LNode *next;
} LNode, *LinkedList;

// 头插法
LinkedList HeadInsert(LinkedList &L) {
  int x;
  L = new LNode;  // 创建头结点
  L->next = NULL;        // 初始化为空链表
  while (cin >> x && x != -1) {  // 输入-1表示结束
    LNode *s = new LNode;
    s->data = x;
    s->next = L->next;
    L->next = s;
  }
  return L;
}

// 尾插法
LinkedList TailInsert(LinkedList &L) {
  int x;
  L = new LNode;  // 创建头结点
  L->next = NULL;        // 初始化为空链表
  LNode *r = L;          // r为表尾结点
  while (cin >> x && x != -1) {  // 输入-1表示结束
    LNode *s = new LNode;
    s->data = x;
    r->next = s;
    r = s;
  }
  return L;
}

// 按序号查找结点值
LNode *GetElem(LinkedList L, int i) {
  int j = 1;              // 计数器
  LNode *p = L->next;     // p为第1个结点指针
  if (i < 0) return NULL; // i无效,返回NULL
  if (i == 0) return L;   // i=0,返回表头
  while (p && j < i) {    // 查找第i个结点
    p = p->next;
    j++;
  }
  return p;               // 返回第i个结点的指针,若i>表长,返回NULL
}

// 按值查找表结点
LNode *LocateElem(LinkedList L, ElemType e) {
  LNode *p = L->next;
  while (p && p->data != e) {  // 从第1个结点查找数据为e的结点
    p = p->next;
  }
  return p;
}

// 插入操作
void Insert(LinkedList L, int i, ElemType e) {
  LNode *p = GetElem(L, i-1);  // 查找i的前驱结点
  while (p) {
    LNode *q = new LNode;
    q->next = p->next;
    p->next = q;
  }
}

// 删除操作
void Delete(LinkedList L, int i) {
  LNode *p = GetElem(L, i-1);  // 查找i的前驱结点
  while (p) {
    LNode *q = p->next;
    p->next = q->next;
    delete q;
  }
}

// 双链表结构体
typedef struct DLNode {
  ElemType data;
  struct DLNode *prev;
  struct DLNode *next;
} DLNode, *DLinkedList;