typedefstructLNode *List;//用*List指针代替LNode structLNode{//定义LNode结构体 ElementType Data[MAXSIZE]; int Last; //数组最后一个元素的位置 }; structLNodeL;//声明L为LNode类型的结构体 List PtrL; //ptrl为List型指针
访问下标为 i 的元素,L.Data[i] 或 PtrL->Data[i]
线性表的长度:L.Last + 1 或 PtrL->Last + 1
List MakeEmpty()
初始化一个空表
代码
1 2 3 4 5 6
List MakeEmpty(){ //初始化一个空表 List Ptrl; Ptrl = (List) malloc (sizeof(struct LNode)); //申请出一个空表的空间 Ptrl->Last = -1; return Ptrl; }
Last = -1: 因为表长为Last + 1,所以Last = -1 表示空表。
ElementType FindKth()
根据位序K,返回相应元素
代码
1 2 3 4 5 6 7 8
voidElementType_FindKth(int i){ //根据位序K,返回相应元素 if (i < 0 || i > Ptrl->Last + 1){ //检查输入位置的合法性 printf(" 位置不合法 "); return; } else return Ptrl->Data[i-1]; //位置合法,返回结果 }
int Find(ElementType X, List Ptrl)
在线性表L中查找X的第一次出现位置
代码
1 2 3 4 5 6 7 8 9
intFind(ElementType X, List Ptrl){ //在线性表L中查找X的第一次出现位置 int i = 0; while (i <= Ptrl->Last && Ptrl->Data[i] != X) //限定查找条件(不越界,没找到) i++; if (i > Ptrl->Last) return-1; //没找到,返回-1 else return i; //找到,返回位置i }
void Insert(ElementType X,int i,List Ptrl)
在位序i前插入一个新元素
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
voidInsert(ElementType X,int i,List Ptrl){ //在位序i前插入一个新元素(先移动,再插入) int j; if (Ptrl->Last == MAXSIZE - 1){ //表空间已满,不能插入 printf(" 表满 "); return; } if (i < 1 || i > Ptrl->Last+2){ //检查插入位置的合法性 printf(" 位置不合法 "); return; } for (j = Ptrl->Last;j >= i - 1;j--) Ptrl->Data[j + 1] = Ptrl->Data[j]; //将a[i]~a[n]倒序向后移动 Ptrl->Data[i - 1] = X; //插入新元素 Ptrl->Last++; //Last仍指向最后元素 return; }
void Delete(int i,List L)
删除指定位序 i 的元素
代码
1 2 3 4 5 6 7 8 9 10 11 12
voidDelete(int i,List L){ //删除指定位序i的元素 int j;
if (i > Ptrl->Last + 1 || i < 1){ //检查空表及删除位置的合法性 printf(" 不存在第%d个元素 ",i); return; } for (j = i;j <= Ptrl->Last;j++) Ptrl->Data[j - 1] = Ptrl->Data[j]; //将a[i + 1]~a[n]倒序向前移动 Ptrl->Last--; //Last仍指向最后元素 return; }
typedefstructLNode *List; structLNode{ ElementType Data; // 节点所储存的数据 List Next; // 下一个节点的位置 List 指针 }; structLNodeL; List PtrL;
用链表实现:
Data 用来储存结点的数据
Next 用来放下一节点的指针
int Length(List PtrL)
求表长
代码
1 2 3 4 5 6 7 8 9
intLength(List PtrL){ // 求表长 List p = PtrL; // p 指向表的第一个结点 int j = 0; while (p){ // 遍历链表 直到p指针为null p = p->Next; j++; // 当前p指向第j个结点 } return j; }
List FindKth(int K, List PtrL)
按序号查找
代码
1 2 3 4 5 6 7 8 9 10 11 12
List FindKth(int K, List PtrL){ //按序号查找 List p = PtrL; int i = 1; while (p != NULL && i < K){ // 排除错误序号及遍历链表 直到第K个为止 p = p->Next; i++; } if (i == K) return p; // 找到第k个,返回指针 else returnNULL; // 否则返回空 }
while循环条件:
指针不为空,且查找的序号小于要查找的序号
List Find(ElementType X,List PtrL)
按值查找
代码
1 2 3 4 5 6
List Find(ElementType X,List PtrL){ // 按值查找 List p = PtrL; while (p != NULL && p->Data != X) // 遍历链表 p = p->Next; return p; }