MOOC 2.1 线性表及其实现
1. 顺序表
#include <cstdio> typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; int Last; }; struct LNode L; List PtrL; // 1. 初始化(建立空的顺序表) List MakeEmpty() { List PtrL; PtrL = (List )malloc(sizoef(struct LNode) ); PtrL->Last = -1; return PtrL; } // 2. 查找 int Find(ElementType X, List PtrL) { int i = 0; while( i <= PtrL->Last && PtrL->Data[i] != X) i ++; if(i > PtrL->Last) return -1; // 如果没有找到, 返回-1 else return i; // 找到后返回的是存储位置 } // 3. 插入(第i(1<=i<=n+1)个位置上插入一个值为X的新元素) void Insert(ElementType X, int i, List PtrL) { int j; if(PtrL->Last == MAXSIZE - 1) // 表空间已满, 不能插入 { printf(" 表满 \n"); return ; } if(i < 1 || i > PtrL->Last + 2) // 检查插入位置的合法性 { printf(" 位置不合法 \n"); return ; } for(j = PtrL->Last; j >= i - 1; -- j) { PtrL->Data[j + 1] = PtrL->Data[j]; // 将ai到an倒序向后移动 } PtrL->Data[i - 1] = X; // 新元素插入 PtrL->Last ++; // last仍指向最后元素 return ; } // 4. 删除 (删除表第i(1<=i<=n)个位置上的元素) void Delete(int i, List PtrL) { int j; if(i < 1 || i > PtrL->Last + 1) // 检查空表及删除位置的合法性 { printf("不存在第%d个元素\n", i); return ; } for(j = i; j <= PtrL->Last; ++ j) { PtrL->Data[j - 1] = PtrL->Data[j]; // 将ai+1~an顺序向前移动 } PtrL->Last --; // Last仍指向最后元素 return ; }
2. 链表
#include <cstdio> typedef struct LNode *List; struct LNode { ElementType Data; List Next; }; struct Lnode L; List PtrL; // 1. 求表长 int Length(List PtrL) { List p = PtrL; // p指向表的第一个结点 int j = 0; while( p ) { p = p->Next; j ++; // 当前p指向的是第j个结点 } return j; } // 2. 查找 // (1) 按序号查找: FindKth; List FindKth(int K, List PtrL) { List p = PtrL; int i = 1; while(p != NULL && i < K) { p = p->Next; i ++; } if(i == K) return p; // 找到第K个, 返回指针 else return NULL; // 否则返回空 } // (2) 按值查找: Find List Find(ElementType X, List PtrL) { List p = PtrL; while(p != NULL && p->Data != X) { p = p->Next; } return p; } // 3. 插入( 在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点) List Insert(ElementType X, int i, List PtrL) { List p, s; if(i == 1) // 新结点插入在表头 { s = (List )malloc(sizeof(struct LNode)); // 申请 填装结点 s->Data = X; s->Next = PtrL; return s; // 返回新表头指针 } p = Find(i - 1, PtrL); // 查找第i-1个结点 if(p == NULL) // 第i-1个不存在, 不能插入 { printf(" 参数i错 \n"); return NULL; } else { s = (List )malloc(sizeof(struct LNode)); // 申请 填装结点 s->Data = X; s->Next = p->Next; // 新结点插入在第i-1个结点的后面 p->Next = s; return PtrL; } } // 4. 删除 List Delete(int i, List PtrL) { List p, s; if(i == 1) // 若要是删除的是表的第一个结点 { s = PtrL; // s指向第一个结点 if(PtrL != NULL) PtrL = PtrL->Next; // 从链表中删除 else return NULL; free(s); // 释放被删除结点 return PtrL; } p = FindKth(i - 1, PtrL); // 查找第i-1个结点 if(p == NULL) { printf("第%d个结点不存在", i - 1); return NULL; } else if(p->Next == NULL) { printf("第%d个结点不存在", i); return NULL; } else { s = p->Next; // s指向第i个结点 p->Next = s->Next; // 从链表中删除 free(s); // 释放被删除结点 return PtrL; } }