线性表包括顺序表和链表(单链表、双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现。
线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从0开始的,而线性表的下标是从1开始的)。
首先声明一个顺序类型的线性表:
//定义一个结构体类型 #define InitSize 100 //初始大小 typedef struct { int data[InitSize]; //定义一个int型数组,理论上在伪代码中该类型应该为泛型即任意类型(ElementType),在此我用int代替方便代码的编写 int length, maxSize; //长度、最大容量 }SeqList; //别名
然后依次实现线性表的相关操作;
向线性表中插入一个元素:
/* function:线性表的插入 1.插入的位置不能大于线性表的长度+1(可以等于:即插在末尾) 2.在某个指定位置插入时,需要依次将需要插入元素位置的元素向后移动,且从最后一个开始移动 3.长度加一 */ /* L: 线性表 i:需要插入的元素下标索引 e:需要插入的元素(int e:这里假设为int类型,实际上用伪代码表示为不局限任何类型ElementType) */ bool ListInsert(SeqList L, int i, int e) { //不能大于长度+1 且不能小于1 if (i<1 || i > L.length+1) { return false; } for (int j = L.length - 1;j >= i - 1;j--) { L.data[j + 1] = L.data[j]; } L.data[i - 1] = e; L.length++; return true; }
从线性表中删除一个元素:
/* function:删除指定下标的元素 1.将需要删除元素下标后的元素位置全部向前移动一位即可 2.长度减一 */ /* L: 线性表 i:需要删除的元素下标索引 */ bool ListDelete(SeqList L,int i) { if (i<1 || i > L.length) { return false; } for (int j = i;j < L.length; j++) { L.data[j-1] = L.data[j]; } L.length--; return true; }
从线性表中查找指定的元素:
/* function:查找指定元素 1.依次遍历线性表进行判断,存在即返回下标 */ /* L: 线性表 e:需要查找的元素的 */ int ListFind(SeqList L, int e) { for (int j = 0;j < L.length;j++) { if (L.data[j] == e) { return j+1; } } return 0; }
删除线性表中的最小值:
/* function:删除线性表中最小的值,并将最后一个元素填充 1.遍历线性表取出最小值 2.将最后一个元素赋值给当前位置 3.返回最小值 */ int ListDeleteMin(SeqList L) { if (L.length == 0) { return 0; } int min = 0; for (int i = 0;i < L.length;i++) { if (L.data[i] < min) { min = L.data[i]; L.data[i] = L.data[L.length - 1]; } } return min; }
将线性表反转:
/* function:将线性表反转 */ void ListReverse(SeqList L) { if (L.length == 0) { return; } int length = L.length / 2; for (int i = 0;i <= length;i++) { int startIndex = i; int endIndex = L.length - i - 1; int temp; temp = L.data[endIndex]; L.data[i] = temp; L.data[endIndex] = L.data[i]; } }
以上为线性表-顺序表的简单操作。