单链表
// 单链表,有头指针(头节点)
#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct node {
int data;
int length;
struct node * next;
}LNode, * LinkList;
void PrintList(LinkList head);
LinkList InitList() {
LinkList head = (LinkList)malloc(sizeof(LNode));
if (head != NULL) cout << "The linked list is created successfully" << endl;
else return head;
head->next = NULL;
head->length = 0;
return head;
}
// 连续输入节点值
// 尾插法
void CreateList_Hail(LinkList head) {
LinkList p = head;
int n, num;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> num;
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = num;
newnode->next = NULL;
p->next = newnode;
p = p->next;
head->length++;
}
}
// 头插法,若不指明,默认尾插
void CreateList_Head(LinkList head) {
LinkList p = head;
int n = 10;
for (int i = 1; i <= n; i++) {
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = i;
newnode->next = p->next;
p->next = newnode;
head->length++;
}
}
// 按值查找
LinkList find(LinkList head, int value) {
LinkList p = head->next;
while (p && p->data != value) p = p->next;
if (p == NULL) cout << "No such value" << endl;
return p;
}
// 按位删除,范围 [1, n]
void del(LinkList head, int k) {
LinkList p = head;
LinkList q = head->next;
while(q && --k) {
p = p->next;
q = q->next;
}
if (!q) cout << "Error" << endl;
else {
p->next = q->next;
head->length--;
cout << "delete successfully" << endl;
cout << "After deleted:" << endl;
PrintList(head);
}
}
// 按位插入,范围[0, n]
void insert(LinkList head, int k, int value) {
LinkList p = head;
while (p && k--) p = p->next;
if (!p) cout << "Error" << endl;
else {
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = value;
newnode->next = p->next;
p->next = newnode;
head->length++;
cout << "insert successfully" << endl;
cout << "After inserted:" << endl;
PrintList(head);
}
}
void PrintList(LinkList head) {
LinkList p = head->next;
cout << "The length of List is:" << head->length << endl;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main () {
LinkList head = InitList();
CreateList_Head(head);
PrintList(head);
LinkList tmp = find(head, 9);
if (tmp != NULL) cout << tmp->data << endl;
del(head, 1);
del(head, 9);
del(head, 10);
insert(head, 1, 12);
insert(head, 10, 10);
insert(head, 9, 10);
insert(head, 0, 1);
return 0;
}
双向链表
#include <iostream>
#include <cstdlib>
typedef struct node {
int data;
int length;
struct node * prior;
struct node * next;
}DLNode, * DLinkList;
using namespace std;
void PrintDList(DLinkList head);
DLinkList InitDList() {
DLinkList head = (DLinkList)malloc(sizeof(DLNode));
if (head) cout << "DList is created successfully" << endl;
head->length = 0;
head->prior = NULL;
head->next = NULL;
return head;
}
void CreateDList(DLinkList head) {
DLinkList p = head;
int n = 10;
for (int i = 1; i <= 10; i++) {
DLinkList newnode = (DLinkList)malloc(sizeof(DLNode));
newnode->data = i;
newnode->next = p->next;
newnode->prior = p;
p->next = newnode;
head->length++;
p = newnode;
}
}
void insert(DLinkList head, int k, int value) {
int tmp = k;
DLinkList p = head;
if (k > head->length) {
cout << "Error" << endl;
return;
}
while (p && tmp--) p = p->next;
// 插入表头
if (k == 0) {
DLinkList newnode = (DLinkList)malloc(sizeof(DLNode));
newnode->data = value;
newnode->next = head->next;
newnode->prior = head;
head->next = newnode;
head->length++;
}
// 插入表尾
else if (k == head->length) {
DLinkList newnode = (DLinkList)malloc(sizeof(DLNode));
newnode->data = value;
newnode->next = NULL;
newnode->prior = p;
p->next = newnode;
head->length++;
}
// 插入表中
else {
DLinkList newnode = (DLinkList)malloc(sizeof(DLNode));
newnode->data = value;
newnode->next = p->next;
p->next->prior = newnode;
p->next = newnode;
newnode->prior = p;
head->length++;
}
cout << "After inserted:" << endl;
PrintDList(head);
}
void del(DLinkList head, int k) {
int tmp = k;
if (k < 1 || tmp > head->length) {
cout << "Error" << endl;
return;
}
DLinkList p = head;
DLinkList q = p->next;
while (p && q && --tmp) {
p = p->next;
q = p->next;
}
// 表长为1,删除表头,也是删除表尾
if (head->length == 1) head->next == NULL;
// 删除表头
else if (k == 1) {
head->next = q->next;
q->next->prior = head;
}
// 删除表尾
else if (k == head->length)
p->next = NULL;
else {
p->next = q->next;
q->next->prior = p;
}
head->length--;
cout << "After deleted:" << endl;
PrintDList(head);
}
void PrintDList(DLinkList head) {
DLinkList p = head->next;
cout << "The length of the DList is: " << head->length << endl;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
DLinkList head = InitDList();
CreateDList(head);
PrintDList(head);
insert(head, 0, 1);
insert(head, 4, 19);
insert(head, 18, 10);
del(head, 1);
del(head, 11);
del(head, 4);
return 0;
}
循环链表
单向循环链表
#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct node {
int data;
int length;
struct node * next;
}CLnode, * CList;
void PrintCList(CList head);
CList InitCList() {
CList head = (CList)malloc(sizeof(CLnode));
head->length = 0;
head->next = head;
CList p =head;
for (int i = 1; i <= 10; i++) {
CList newnode = (CList)malloc(sizeof(CLnode));
newnode->data = i;
newnode->next = p->next;
p->next = newnode;
p = newnode;
head->length++;
}
return head;
}
void insert(CList head, int k, int value) {
if (k > head->length) {
cout << "Error" << endl;
return;
}
CList p = head;
while (p && k--) p = p->next;
CList newnode = (CList)malloc(sizeof(CLnode));
newnode->data = value;
newnode->next = p->next;
p->next = newnode;
head->length++;
cout << "After inserted:" << endl;
PrintCList(head);
}
void del(CList head, int k) {
if (k < 1 || k > head->length) {
cout << "Error" << endl;
return;
}
CList p = head;
CList q = p->next;
while (p && q && --k) {
p = p->next;
q = p->next;
}
p->next = q->next;
head->length--;
cout << "After deleted: " << endl;
PrintCList(head);
}
void PrintCList(CList head) {
CList p = head->next;
cout << "The length of the clist is: " << head->length << endl;
while (p != head) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
CList head = InitCList();
PrintCList(head);
insert(head, 0, 0);
insert(head, 11, 11);
insert(head, 7, 12);
del(head, 1);
del(head, 12);
del(head, 6);
return 0;
}
双向循环链表
#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct node {
int data;
int length;
struct node * prior;
struct node * next;
}DCLnode, * DCList;
void PrintDCList(DCList head);
DCList InitDCList() {
DCList head = (DCList)malloc(sizeof(DCLnode));
head->length = 0;
head->prior = head;
head->next = head;
DCList p = head;
for (int i = 1; i <= 10; i++) {
DCList newnode = (DCList)malloc(sizeof(DCLnode));
newnode->data = i;
newnode->next = p->next;
newnode->prior = p;
p->next = newnode;
p = newnode;
head->length++;
}
return head;
}
void insert(DCList head, int k, int value) {
if (k > head->length) {
cout << "Error" << endl;
return;
}
DCList p = head;
while (p && k--) p = p->next;
DCList newnode = (DCList)malloc(sizeof(DCLnode));
newnode->data = value;
newnode->next = p->next;
newnode->next->prior = newnode;
p->next = newnode;
head->length++;
cout << "After insert: " << endl;
PrintDCList(head);
}
void del(DCList head, int k) {
if (k < 1 || k > head->length) {
cout << "Error" << endl;
return;
}
DCList p =head;
DCList q = p->next;
while (p && q && --k) {
p = p->next;
q = p->next;
}
p->next = q->next;
q->next->prior = p;
head->length--;
cout << "After deleted: " << endl;
PrintDCList(head);
}
void PrintDCList(DCList head) {
DCList p = head->next;
cout << "The length of the list is: " << head->length << endl;
while (p != head) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
DCList head = InitDCList();
PrintDCList(head);
insert(head, 0, 0);
insert(head, 11, 11);
insert(head, 4, 79);
del(head, 1);
del(head, 12);
del(head, 7);
return 0;
}