一、顺序表
1. 顺序表的初始化
#define InitSize 10
typedef struct {
int data[InitList];
int length;
}SqlList;
typedef struct {
int* data;
int length;
int MaxSize;
}SqlList;
void InitList(SqlList& L) {
L.data = (int*)malloc(InitSize * sizeof(int));
L.length = 0;
L.MaxSize = InitSize;
}
void IncreaseSize(SqlList& L, int len) {
int* p = L.data;
L.data = (int*)malloc((L.MaxSize + len) * sizeof(int));
for (int i = 0; i < L.length; i++) {
L.data[i] = p[i];
}
L.MaxSize += len;
free(p);
}
2. 顺序表的插入
bool ListInsert(SqlList& L, int i, int e) {
if (i<1 || i>L.length + 1) return false;
if (L.length >= L.MaxSize) return false;
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
3. 顺序表的删除
bool ListDelete(SqlList& L, int i, int& e) {
if (i<1 || i>L.length) return false;
e = L.data[i - 1];
for (int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
bool Delete_s_t(SqlList& L, int s, int t) {
if (L.length == 0 || s >= t) return false;
int k = 0;
for (int i = 0; i < L.length; i++) {
if (L.data[i]<s || L.data[i]>t) {
L.data[k++] = L.data[i];
}
}
L.length = k;
return true;
}
4. 顺序表的修改
void find(SqlList &L, int e, int n) {
int pos = LocateElem(L, e);
L.data[pos] = n;
}
5. 顺序表的索引
int GetElem(SqlList L, int i) {
if (i<1 || i>L.length) return -1;
return L.data[i - 1];
}
int LocateElem(SqlList L, int e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) return i + 1;
}
return -1;
}
6. 顺序表的输出
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << " ";
}
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
二、单链表(不带头结点)
1. 初始化
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
bool InitList(LinkList& L) {
L = NULL;
return true;
}
2. 插入
bool ListInsert(LinkList& L, int i, int e) {
if (i < 1) return false;
if (i == 1) {
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
return true;
}
LNode* p;
p = L;
int j = 1;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p) return false;
return InsertNextNode(p, e);
}
bool InsertPriorNode(LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
bool InsertPriorNode(LNode* p, LNode* s) {
if (!p || !s) return false;
s->next = p->next;
p->next = s;
swap(s->data, p->data);
return true;
}
bool InsertNextNode(LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
LinkList List_TailInsert(LinkList& L) {
InitList(L);
LNode* s, * r = L;
int x;
bool is_head = true;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
if (is_head) {
is_head = false;
s->data = x;
L = s;
r = s;
}
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
LinkList List_HeadInsert(LinkList& L) {
InitList(L);
LNode* s;
int x;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L;
L = s;
}
return L;
}
3. 删除
bool ListDelete(LinkList& L, int i, int& e) {
if (L == NULL) {
e = -1;
return false;
}
if (i < 1) return false;
if (i > 1) {
LNode* p = GetElem(L, i - 1);
if (!p || !(p->next)) return false;
LNode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
}
else {
if (L->next == NULL) {
e = L->data;
L = NULL;
}
else {
e = L->data;
L = L->next;
}
}
return true;
}
bool DeleteNode(LNode* p) {
if (p->next == NULL) return false;
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
4.索引
LNode* GetElem(LinkList L, int i) {
if (i <= 0) return NULL;
int j = 1;
LNode* p = L;
while (p && j < i) {
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L, int e) {
LNode* p = L;
while (p && p->data != e) {
p = p->next;
}
return p;
}
5. 长度
int Length(LinkList L) {
int len = 0;
LNode* p = L;
while (p) {
len++;
p = p->next;
}
return len;
}
6. 输出
void print(LinkList L) {
LNode* s = L;
while (s != NULL) {
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
三、 单链表(带头结点)
1. 初始化
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (!L) return false;
L->next = NULL;
return true;
}
2. 插入
bool InsertNextNode(LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListInsert(LinkList& L, int i, int e) {
if (i < 1) return false;
LNode* p = GetElem(L, i - 1);
if (!p) return false;
return InsertNextNode(p, e);
}
bool NoHead_ListInsert(LinkList& L, int i, int e) {
if (i < 1) return false;
if (i == 1) {
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
return true;
}
LNode* p;
p = L;
int j = 1;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p) return false;
return InsertNextNode(p, e);
}
bool InsertPriorNode(LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
bool InsertPriorNode(LNode* p, LNode* s) {
if (!p || !s) return false;
s->next = p->next;
p->next = s;
swap(s->data, p->data);
return true;
}
LinkList List_TailInsert(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode* s, * r = L;
int x;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
LinkList List_HeadInsert(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode* s;
int x;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
3. 删除
bool ListDelete(LinkList& L, int i, int& e) {
if (i < 1) return false;
LNode* p = GetElem(L, i - 1);
if (!p || !(p->next)) return false;
LNode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
bool DeleteNode(LNode* p) {
if (p->next == NULL) return false;
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
4. 索引
LNode* GetElem(LinkList L, int i) {
if (i < 0) return NULL;
int j = 0;
LNode* p = L;
while (p && j < i) {
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L, int e) {
LNode* p = L->next;
while (p && p->data != e) {
p = p->next;
}
return p;
}
5. 长度
int Length(LinkList L) {
int len = 0;
LNode* p = L;
while (p->next) {
len++;
p = p->next;
}
return len;
}
6. 输出
void print(LinkList L) {
LNode* s = L;
while (s->next != NULL) {
s = s->next;
cout << s->data << " ";
}
cout << endl;
}
四、双链表
1. 初始化
typedef int ElemType;
typedef struct DNode {
ElemType data;
struct DNode* prior, * next;
}DNode, * DLinkList;
bool InitDLinkList(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) {
return false;
}
L->prior = NULL;
L->next = NULL;
return true;
}
2. 判空
bool empty(DLinkList L) {
if (L->next = NULL) {
return true;
}
return false;
}
3. 查找
DNode* GetElem(DLinkList L, int i) {
if (i < 0) return NULL;
int j = 0;
DNode* p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
DNode* LocateElem(DLinkList L, ElemType e) {
DNode* p = L;
if (p == NULL) return NULL;
p = p->next;
while (p != NULL && p->data != e) {
p = p->next;
}
return p;
}
4. 插入
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
if (p->next != NULL)
p->next->prior = s;
s->prior = p;
p->next = s;
}
bool InsertNextDNode(DNode* p, ElemType e) {
if (p == NULL) return false;
DNode* q = (DNode*)malloc(sizeof(DNode));
if (q == NULL) return false;
q->data = e;
q->next = NULL;
q->prior = p;
if (p->next != NULL) {
p->next->prior = q;
q->next = p->next;
}
p->next = q;
return true;
}
bool InsertPriorDnode(DNode* p, DNode* s) {
return InsertNextDNode(p->prior, s);
}
bool InsertDLinkList(DLinkList& L, int i, ElemType e) {
if (i <= 0) return false;
DNode* p = GetElem(L, i - 1);
return InsertNextDNode(p, e);
}
DLinkList List_TailInsert(DLinkList& L) {
InitDLinkList(L);
DNode* p = L;
ElemType x;
while (cin >> x) {
InsertNextDNode(p, x);
p = p->next;
}
return L;
}
DLinkList List_HeadInsert(DLinkList& L) {
InitDLinkList(L);
ElemType x;
while (cin >> x) {
InsertNextDNode(L, x);
}
return L;
}
5. 删除
bool DeleteNextNode(DNode* p) {
if (p == NULL) return false;
DNode* q = p->next;
if (q == NULL) return false;
p->next = q->next;
if (q->next != NULL) q->next->prior = p;
free(q);
return true;
}
bool DestoryList(DLinkList& L) {
while (L->next != NULL) {
DeleteNextNode(L);
}
free(L);
L = NULL;
return true;
}
bool DeleteNode(DNode* s) {
DNode* p;
p = s->prior;
p->next = s->next;
if (s->next != NULL) {
s->next->prior = p;
}
free(s);
return true;
}
bool ListDelete(DLinkList& L, int i, ElemType& e) {
if (i <= 0 || i > Length(L)) return false;
DNode* s;
s = GetElem(L, i);
if (s == NULL) return false;
e = s->data;
return DeleteNode(s);
}
6. 长度
int Length(DLinkList L) {
DNode* p = L;
int len = 0;
while (p->next != NULL) {
len++;
p = p->next;
}
return len;
}
7. 输出
void print(DLinkList L) {
DNode* p = L->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
五、循环单链表(L指向表头)
1. 初始化
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) return false;
L->next = L;
return true;
}
2. 查找
LNode* GetElem(LinkList L, int i) {
if (i < 0) return NULL;
if (i == 0) return L;
int j = 1;
LNode* p = L->next;
while (p != L && j < i) {
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L, int e) {
LNode* p = L->next;
while (p != L && p->data != e) {
p = p->next;
}
if (p->data == e) return p;
return NULL;
}
3. 长度
int Length(LinkList L) {
int len = 0;
LNode* p = L;
while (p->next != L) {
len++;
p = p->next;
}
return len;
}
4. 插入
bool InsertNextNode(LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListInsert(LinkList& L, int i, int e) {
if (i < 1) return false;
LNode* p = GetElem(L, i - 1);
if (!p) return false;
return InsertNextNode(p, e);
}
bool InsertPriorNode(LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
bool InsertPriorNode(LNode* p, LNode* s) {
if (!p || !s) return false;
s->next = p->next;
p->next = s;
swap(s->data, p->data);
return true;
}
LinkList List_TailInsert(LinkList& L) {
InitList(L);
LNode* s, * r = L;
int x;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
}
r->next = L;
return L;
}
LinkList List_HeadInsert(LinkList& L) {
InitList(L);
LNode* s, * r = L;
int x;
bool isFirst = true;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
if (isFirst) {
r = s;
isFirst = false;
}
}
r->next = L;
return L;
}
5. 删除
bool ListDelete(LinkList& L, int i, int& e) {
if (i < 1) return false;
LNode* p = GetElem(L, i - 1);
if (p == NULL || p->next == L) return false;
LNode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
bool DeleteNode(LinkList& L, LNode* p) {
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
if (L == q) {
L = p;
}
free(q);
return true;
}
6.判空
bool Empty(LinkList L) {
if (L->next == L) {
return true;
}
return false;
}
7.判尾
bool isTail(LinkList L, LNode* p) {
if (p->next == L) return true;
return false;
}
8.输出
void print(LinkList L) {
LNode* s = L->next;
while (s != L) {
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
六、循环单链表(L指向表尾)
1. 初始化
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) return false;
L->next = L;
return true;
}
2. 查找
LNode* GetElem(LinkList L, int i) {
if (i < 0) return NULL;
if (i == 0) return L->next;
int j = 1;
LNode* p = L->next->next;
while (p != L->next && j < i) {
p = p->next;
j++;
}
if (p == L->next) return NULL;
return p;
}
LNode* LocateElem(LinkList L, int e) {
LNode* p = L->next->next;
while (p != L->next && p->data != e) {
p = p->next;
}
if (p->data == e) return p;
return NULL;
}
3. 长度
int Length(LinkList L) {
int len = 0;
LNode* p = L;
while (p->next != L) {
len++;
p = p->next;
}
return len;
}
4. 插入
bool InsertNextNode(LinkList& L, LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->data = e;
s->next = p->next;
p->next = s;
if (p == L) L = s;
return true;
}
bool ListInsert(LinkList& L, int i, int e) {
if (i < 1) return false;
LNode* p = GetElem(L, i - 1);
if (!p) return false;
return InsertNextNode(L, p, e);
}
bool InsertPriorNode(LNode* p, int e) {
if (!p) return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s) return false;
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
bool InsertPriorNode(LNode* p, LNode* s) {
if (!p || !s) return false;
s->next = p->next;
p->next = s;
swap(s->data, p->data);
return true;
}
LinkList List_TailInsert(LinkList& L) {
InitList(L);
LNode* s, * r = L;
int x;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
}
r->next = L;
L = r;
return L;
}
LinkList List_HeadInsert(LinkList& L) {
InitList(L);
LNode* s, * r = L;
int x;
bool isFirst = true;
while (cin >> x) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
if (isFirst) {
r = s;
isFirst = false;
}
}
r->next = L;
L = r;
return r;
}
5. 删除
bool ListDelete(LinkList& L, int i, int& e) {
if (i < 1) return false;
LNode* p = GetElem(L, i - 1);
if (p == NULL || p == L) return false;
if (p->next == L) {
L = p;
}
LNode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
bool DeleteNode(LinkList& L, LNode* p) {
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
if (L == p) {
q = p;
while (q->next != p) {
q = q->next;
}
L = q;
}
return true;
}
6.判空
bool Empty(LinkList L) {
if (L->next == L) {
return true;
}
return false;
}
7.判尾
bool isTail(LinkList L, LNode* p) {
if (p == L) return true;
return false;
}
8.输出
void print(LinkList L) {
LNode* s = L->next->next;
while (s != L->next) {
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
七、循环双链表
1. 初始化
typedef int ElemType;
typedef struct DNode {
ElemType data;
struct DNode* prior, * next;
}DNode, * DLinkList;
bool InitDLinkList(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) {
return false;
}
L->prior = L;
L->next = L;
return true;
}
2. 查找
DNode* GetElem(DLinkList L, int i) {
if (i < 0) return NULL;
if (i == 0) return L;
int j = 1;
DNode* p = L->next;
while (p != L && j < i) {
p = p->next;
j++;
}
if (p == L) return NULL;
return p;
}
DNode* LocateElem(DLinkList L, ElemType e) {
DNode* p = L;
if (p == NULL) return NULL;
p = p->next;
while (p != L && p->data != e) {
p = p->next;
}
if (p == L) return NULL;
return p;
}
3. 长度
int Length(DLinkList L) {
DNode* p = L;
int len = 0;
while (p->next != L) {
len++;
p = p->next;
}
return len;
}
4. 插入
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
}
bool InsertNextDNode(DNode* p, ElemType e) {
if (p == NULL) return false;
DNode* q = (DNode*)malloc(sizeof(DNode));
if (q == NULL) return false;
q->data = e;
q->prior = p;
p->next->prior = q;
q->next = p->next;
p->next = q;
return true;
}
bool InsertPriorDnode(DNode* p, DNode* s) {
return InsertNextDNode(p->prior, s);
}
bool InsertDLinkList(DLinkList& L, int i, ElemType e) {
if (i <= 0) return false;
DNode* p = GetElem(L, i - 1);
return InsertNextDNode(p, e);
}
DLinkList List_TailInsert(DLinkList& L) {
InitDLinkList(L);
DNode* p = L;
ElemType x;
while (cin >> x) {
InsertNextDNode(p, x);
p = p->next;
}
return L;
}
DLinkList List_HeadInsert(DLinkList& L) {
InitDLinkList(L);
ElemType x;
while (cin >> x) {
InsertNextDNode(L, x);
}
return L;
}
5. 删除
bool DeleteNextNode(DNode* p) {
if (p == NULL) return false;
DNode* q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);
return true;
}
bool DestoryList(DLinkList& L) {
while (L->next != L) {
DeleteNextNode(L);
}
free(L);
L = NULL;
return true;
}
bool DeleteNode(DNode* s) {
DNode* p;
p = s->prior;
p->next = s->next;
s->next->prior = p;
free(s);
return true;
}
bool ListDelete(DLinkList& L, int i, ElemType& e) {
if (i <= 0 || i > Length(L)) return false;
DNode* s;
s = GetElem(L, i);
if (s == NULL) return false;
e = s->data;
return DeleteNode(s);
}
6.判空
bool empty(DLinkList L) {
if (L->next = L) {
return true;
}
return false;
}
7.判尾
bool isTail(DLinkList L, DNode* p) {
if (p->next == L) return true;
return false;
}
8.输出
void print(DLinkList L) {
DNode* p = L->next;
while (p != L) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
八、静态链表
1. 初始化
#define MaxSize 10
#define ElemType int
typedef struct {
ElemType data;
int next;
}SLinkList[MaxSize];
void InitSLinkList(SLinkList L) {
for (int i = 0; i < MaxSize; i++) {
L[i].next = -2;
}
L[0].next = -1;
}
2. 查找
int Get_Index(SLinkList L, int i) {
int j = 0;
int cnt = 0;
while (j != -1 && cnt < i) {
cnt++;
j = L[j].next;
}
if (cnt != i) return -1;
return j;
}
int Get_First_Empty_Node(SLinkList L) {
for (int i = 1; i < MaxSize; i++) {
if (L[i].next == -2) return i;
}
}
ElemType GetElem(SLinkList L, int i) {
int j = Get_Index(L, i);
return L[j].data;
}
3. 插入
bool InsertNextSNode(SLinkList L, int i, ElemType e) {
int j = Get_Index(L, i);
int k = Get_First_Empty_Node(L);
L[k].next = L[j].next;
L[j].next = k;
L[k].data = e;
return true;
}
bool List_Insert(SLinkList L) {
int tot = 1, pre = 0;
ElemType x;
while (cin >> x) {
L[tot].data = x;
L[tot].next = -1;
L[pre].next = tot;
pre = tot++;
}
return true;
}
4. 删除
bool DeleteNode(SLinkList L, int i, ElemType& e) {
int j = Get_Index(L, i);
if (L[j].next == -1) {
int k = Get_Index(L, i - 1);
L[j].next = -2;
e = L[j].data;
L[k].next = -1;
return true;
}
e = L[j].data;
int tmp = L[j].next;
L[j].data = L[L[j].next].data;
L[j].next = L[L[j].next].next;
L[tmp].next = -2;
return true;
}
5.判空
bool empty(SLinkList L) {
if (L[0].next = -1) {
return true;
}
return false;
}
6.输出
void print(SLinkList L) {
int i = L[0].next;
while (~i) {
cout << L[i].data << " ";
i = L[i].next;
}
cout << endl;
}