int Find( ElementType X, List L ):在线性表L中查找X的第一次的出现位置
void Insert( ElementType X, int i, List L ):在位序i前插入一个新元素X
void Delete( int i, List L ):删除指定位序i的元素
int Length( List L ):返回线性表L的长度n
1.3 线性表的顺序存储实现
利用数组的连续存储空间顺序存放线性表的各元素
1 2 3 4 5 6 7
typedefstructLNode *List; structLnode{ ElementType Data[MAXSIZE]; int Last; //包含一个数组和表示最后一个元素的Last }; structLNodeL; List Ptrl;
访问下标为i的元素:L.Data[i] 或 Ptrl->Data[i]
线性表长度:L.Last+1 或 PtrL->Last+1
接下来是主要操作的实现:
1.3.1 初始化
建立空的顺序表
1 2 3 4 5 6 7
List MakeEmpty() { List PtrL; PtrL = (List) malloc(sizeof(struct LNode)); //申请结构空间 PtrL->Last = -1; //最后一个元素声明为-1,代表没有元素了 return PtrL; }
1.3.2 查找
1 2 3 4 5 6 7 8
intFind(ElementType X, List PtrL) { int i = 0; while (i <= PtrL->Last && PtrL->Data[i] != X) i++; if (i > PtrL->Last) return-1; /* 如果没找到,返回-1 */ elsereturn i; /* 找到后返回的是存储位置 */ }
1.3.3 插入
第i(1≤i≤n+1)个位置上插入一个值为X的新元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
voidInsert(ElementType X, int i, List PtrL) { 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--) { /* 将a_i~a_n倒序向后移动 */ PtrL->Data[j + 1] = PtrL->Data[j]; } PtrL->Data[i - 1] = X; /* 新元素插入 */ PtrL->Last++; /* Last仍指向最后元素 */ return; }
1.3.4 删除
删除表上的第i个位置上的元素
1 2 3 4 5 6 7 8 9 10 11 12 13
voidDelete(int i, List PtrL) { int j; if (i < 1 || i > PtrL->Last + 1) { /* 检查空表及删除位置的合法性 */ printf("不存在第%d个元素", i); return; } for (j = i; j <= PtrL->Last; j++) { /* 将a_i+1 ~ a_n顺序向前移动 */ PtrL->Data[j - 1] = PtrL->Data[j]; } PtrL->Last--; /* Last仍指向最后元素 */ return; }
1.4 线性表的链式存储实现
不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
插入、删除不需要移动数据元素,只需要修改“链”
1 2 3 4 5 6 7
typedefstructLNode *List; structLNode{//链表的每一个节点都是结构 ElementType Data; //数据域 List Next; //指针域 }; structLNodeL; List PtrL;
1.4.2 求表长
1 2 3 4 5 6 7 8 9
intLength( List PtrL){ List p = PtrL; //p指向表的第一个结点 int j = 0; while (p){ p = p->Next j++; //当前p指向的是第j个结点 } return j; }
1.4.3 查找
按序号查找
1 2 3 4 5 6 7 8 9
List FindKth( int K, List PtrL){ List p = PtrL; //将临时指针p定位到表头 while( p!=NULL && i<K ){ p = p->Next; //将p位移到下一个结点 i++; } if( i==K ) return p; elsereturnNULL; //没找到 }
按值查找
1 2 3 4 5 6 7
List Find( ElementType X, List PtrL){ List p = PtrL; while ( p!=NULL && p->Data!=X){ p=p->Next; } return p; }