声明:仅供留档查阅,仅用作起到提示引导性作用,仅用作学习交流,切勿直接照搬

代码主体
以下是一个简单的C++实现,用于维护单链表:
来自bing ai
| 12
 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
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 
 | #include <iostream>using namespace std;
 
 template <typename DataType>
 struct Node
 {
 DataType data;
 Node<DataType>* next;
 };
 
 template <typename DataType>
 class LinkList
 {
 public:
 LinkList();
 LinkList(DataType a[], int n);
 ~LinkList();
 int Length();
 int Empety();
 DataType Get(int i);
 int Locate(DataType x);
 void Insert(int i, DataType x);
 DataType Delete(int i);
 void PrintList();
 private:
 Node<DataType>* first;
 };
 
 template <typename DataType>
 LinkList<DataType>::LinkList()
 {
 first = new Node<DataType>;
 first->next = nullptr;
 }
 
 template <typename DataType>
 int LinkList<DataType>::Empety()
 {
 if (first->next == nullptr)
 return 1;
 else
 return 0;
 }
 
 template <typename DataType>
 void LinkList<DataType>::PrintList()
 {
 Node<DataType>* p = first->next;
 while (p != nullptr)
 {
 cout << p->data << "\t";
 p = p->next;
 }
 }
 
 template <typename DataType>
 int LinkList<DataType>::Length()
 {
 Node<DataType>* p = first->next;
 int count = 0;
 while (p != nullptr)
 {
 p = p->next;
 count++;
 }
 return count;
 }
 
 template <typename DataType>
 DataType LinkList<DataType>::Get(int i)
 {
 Node<DataType>* p = first->next;
 int count = 1;
 while (p != nullptr && count < i)
 {
 p = p->next;
 count++;
 }
 if (p == nullptr)
 throw "位置";
 else
 return p->data;
 }
 
 template <typename DataType>
 int LinkList<DataType>::Locate(DataType x)
 {
 Node<DataType>* p = first->next;
 int count = 1;
 while (p != nullptr)
 {
 if (p->data == x)
 return count;
 p = p->next;
 count++;
 }
 return 0;
 }
 
 template <typename DataType>
 void LinkList<DataType>::Insert(int i, DataType x)
 {
 Node<DataType>* p = first, * s = nullptr;
 int count = 0;
 while (p != nullptr && count < i - 1)
 {
 p = p->next;
 count++;
 }
 if (p == nullptr)
 throw "位置";
 else
 {
 s = new Node<DataType>;
 s->data = x;
 s->next = p->next;
 p->next = s;
 }
 }
 
 template <typename DataType>
 LinkList<DataType>::LinkList(DataType a[], int n)
 {
 first = new Node<DataType>;
 Node<DataType>* r = first, * s = nullptr;
 for (int i = 0; i < n; i++)
 {
 s = new Node<DataType>;
 s->data = a[i];
 r->next = s;
 r = s;
 }
 r->next = nullptr;
 }
 
 template <typename DataType>
 DataType LinkList<DataType>::Delete(int i)
 {
 DataType x;
 Node<DataType>* p = first, * q = nullptr;
 int count = 0;
 while (p != nullptr && count < i - 1)
 {
 p = p->next;
 count++;
 }
 if (p == nullptr || p->next == nullptr)
 throw "位置";
 else
 {
 q = p->next;
 x = q->data;
 p->next = q->next;
 delete q;
 return x;
 }
 }
 
 template <class DataType>
 LinkList<DataType>::~LinkList()
 {
 Node<DataType>* q = NULL;
 while (first != NULL)
 {
 q = first;
 first = first->next;
 delete q;
 }
 }
 
 int main()
 {
 int maxsize;
 cout << "请输入你要创建数组的大小" << endl;
 cin >> maxsize;
 int* a = new int[maxsize];
 for (int i = 0; i < maxsize; i++)
 {
 a[i] = i+1;
 cout << " " << endl;
 }
 cout << "已创建一个最大长度"<<maxsize<<"的随机数链表" << endl;
 LinkList<int> L{ a, maxsize };
 cout << "执行遍历链表" << endl;
 L.PrintList();
 cout << endl;
 cout << "请输入一个最大长度内的数字查找元素" << endl;
 int i;
 cin >> i;
 cout << L.Locate(i) << endl;
 cout << "请插入一个新数字元素,请依次输入位置和数据" << endl;
 int j, k;
 cin >> j >> k;
 L.Insert(j, k);
 cout << "执行遍历链表" << endl;
 L.PrintList();
 cout << endl;
 cout << "请删除一个新数字元素,请输入位置" << endl;
 int l;
 cin >> l;
 cout << "删除的元素位置是" << l << "数据是" << L.Get(l) << endl;
 L.Delete(l);
 cout << "执行遍历链表" << endl;
 L.PrintList();
 cout << endl;
 return 0;
 }
 
 | 
这个程序首先创建了一个空的单链表,然后向其中添加了一些节点。然后,它遍历了整个列表,查找了一个元素,插入了一个新的元素,删除了一个元素,然后再次遍历了整个列表。希望这个示例能对你有所帮助!
两个有序单链表合并为一个有序单链表
当然,这是一个包含main函数的完整程序,它创建了两个有序链表,并将它们合并为一个有序链表:
| 12
 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
 
 | #include <iostream>
 
 struct ListNode {
 int val;
 ListNode *next;
 ListNode(int x) : val(x), next(NULL) {}
 };
 
 
 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 if (l1 == NULL) {
 return l2;
 }
 if (l2 == NULL) {
 return l1;
 }
 if (l1->val < l2->val) {
 l1->next = mergeTwoLists(l1->next, l2);
 return l1;
 } else {
 l2->next = mergeTwoLists(l1, l2->next);
 return l2;
 }
 }
 
 int main() {
 
 ListNode *l1 = new ListNode(1);
 l1->next = new ListNode(3);
 l1->next->next = new ListNode(5);
 
 
 ListNode *l2 = new ListNode(2);
 l2->next = new ListNode(4);
 l2->next->next = new ListNode(6);
 
 
 ListNode *merged = mergeTwoLists(l1, l2);
 
 
 while (merged != NULL) {
 std::cout << merged->val << " ";
 merged = merged->next;
 }
 
 return 0;
 }
 
 | 
这个程序首先创建了两个有序链表l1和l2,然后调用mergeTwoLists函数将它们合并为一个新的有序链表。最后,它遍历新的链表并打印出每个节点的值。
请注意,这个程序没有释放分配给链表节点的内存。在实际使用中,你应该在不再需要节点时释放它们的内存,以防止内存泄漏。此外,这个程序假设输入的链表已经排序。如果输入的链表没有排序,你需要先对它们进行排序。	
双链表
双链表是一种更复杂的线性数据结构,它的每个节点都有两个链接,一个指向前一个节点,另一个指向后一个节点。以下是一个使用C++实现的双链表的基本设计:
| 12
 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
 
 | #include <iostream>
 
 struct ListNode {
 int val;
 ListNode *prev;
 ListNode *next;
 ListNode(int x) : val(x), prev(NULL), next(NULL) {}
 };
 
 
 void addNode(ListNode* &head, int val) {
 ListNode* newNode = new ListNode(val);
 if (head == NULL) {
 head = newNode;
 } else {
 ListNode* temp = head;
 while (temp->next != NULL) {
 temp = temp->next;
 }
 temp->next = newNode;
 newNode->prev = temp;
 }
 }
 
 
 void printList(ListNode* head) {
 ListNode* temp = head;
 while (temp != NULL) {
 std::cout << temp->val << " ";
 temp = temp->next;
 }
 std::cout << std::endl;
 }
 
 int main() {
 
 ListNode* head = NULL;
 
 
 addNode(head, 1);
 addNode(head, 2);
 addNode(head, 3);
 
 
 printList(head);
 
 return 0;
 }
 
 | 
这个程序首先定义了一个双链表节点的结构,然后定义了两个函数:addNode用于向双链表的末尾添加新的节点,printList用于打印双链表的所有节点。在main函数中,它创建了一个空的双链表,然后添加了几个节点,并打印出了这个双链表。
请注意,这个程序没有释放分配给链表节点的内存。在实际使用中,你应该在不再需要节点时释放它们的内存,以防止内存泄漏。此外,你可能还需要实现其他操作,如删除节点、查找节点等。这取决于你的具体需求。如果你需要帮助实现这些操作,请随时向我询问!
循环链表
循环链表是一种特殊的链表,其中最后一个元素指向链表的第一个元素。这种类型的数据结构可以用于实现需要循环或重复的算法。以下是一个使用C++实现的循环链表的基本设计:
| 12
 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 <iostream>
 
 struct ListNode {
 int val;
 ListNode *next;
 ListNode(int x) : val(x), next(NULL) {}
 };
 
 
 void addNode(ListNode* &head, int val) {
 ListNode* newNode = new ListNode(val);
 if (head == NULL) {
 head = newNode;
 newNode->next = head;
 } else {
 ListNode* temp = head;
 while (temp->next != head) {
 temp = temp->next;
 }
 temp->next = newNode;
 newNode->next = head;
 }
 }
 
 
 void printList(ListNode* head) {
 if (head == NULL) return;
 ListNode* temp = head;
 do {
 std::cout << temp->val << " ";
 temp = temp->next;
 } while (temp != head);
 std::cout << std::endl;
 }
 
 int main() {
 
 ListNode* head = NULL;
 
 
 addNode(head, 1);
 addNode(head, 2);
 addNode(head, 3);
 
 
 printList(head);
 
 return 0;
 }
 
 | 
这个程序首先定义了一个链表节点的结构,然后定义了两个函数:addNode用于向循环链表的末尾添加新的节点,printList用于打印循环链表的所有节点。在main函数中,它创建了一个空的循环链表,然后添加了几个节点,并打印出了这个循环链表。
请注意,这个程序没有释放分配给链表节点的内存。在实际使用中,你应该在不再需要节点时释放它们的内存,以防止内存泄漏。此外,你可能还需要实现其他操作,如删除节点、查找节点等。这取决于你的具体需求。如果你需要帮助实现这些操作,请随时向我询问!