本文是数据结构基础系列网络课程(2):线性表中第6课时线性表顺序存储的应用中所讲的例程。
问题:已知长度为n的线性表A采用顺序存储结构,设计算法,删除线性表中所有值为x的数据元素。 要求:时间复杂度为O(n)、空间复杂度为O(1)的算法
解法0:用基本运算实现,不满足复杂度要求 (注:本文中所需要的list.h和list.cpp见点击参照…)
#include "list.h" #include <stdio.h> void delnode1(SqList *&L,ElemType x) { int i; ElemType e; while((i=LocateElem(L,x))>0) { ListDelete(L, i, e); } } //用main写测试代码 int main() { SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("删除前 "); DispList(sq); delnode1(sq, 7); printf("删除后 "); DispList(sq); return 0; }解法1:复制要保留的元素
#include "list.h" #include <stdio.h> void delnode2(SqList *&L,ElemType x) { int k=0,i; //k记录非x的元素个数 for (i=0; i<L->length; i++) if (L->data[i]!=x) { L->data[k]=L->data[i]; k++; } L->length=k; } //用main写测试代码 int main() { SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("删除前 "); DispList(sq); delnode2(sq, 7); printf("删除后 "); DispList(sq); return 0; }问题 :设顺序表有10个元素,其元素类型为整型。 设计一个算法,以第一个元素为分界线,将所有小于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面
解法1:
#include "list.h" #include <stdio.h> void move1(SqList *&L) { int i=0,j=L->length-1; ElemType pivot=L->data[0]; //以data[0]为基准 ElemType tmp; while (i<j) //从区间两端交替向中间扫描,直至i=j为止 { while (i<j && L->data[j]>pivot) j--; //从右向左扫描,找第1个小于等于pivot的元素 while (i<j && L->data[i]<=pivot) i++; //从左向右扫描,找第1个大于pivot的元素 if (i<j) { tmp=L->data[i]; //L->data[i]和L->data[j]进行交换 L->data[i]=L->data[j]; L->data[j]=tmp; } } tmp=L->data[0]; //L->data[0]和L->data[j]进行交换 L->data[0]=L->data[j]; L->data[j]=tmp; } //用main写测试代码 int main() { SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("移动前 "); DispList(sq); move1(sq); printf("移动后 "); DispList(sq); return 0; }解法2:
#include "list.h" #include <stdio.h> void move2(SqList *&L) { int i=0,j=L->length-1; ElemType pivot=L->data[0]; //以data[0]为基准 while (i<j) //从顺序表两端交替向中间扫描,直至i=j为止 { while (j>i && L->data[j]>pivot) j--; //从右向左扫描,找一个小于等于pivot的data[j] L->data[i]=L->data[j]; //找到这样的data[j],放入data[i]处 i++; while (i<j && L->data[i]<=pivot) i++; //从左向右扫描,找一个大于pivot的记录data[i] L->data[j]=L->data[i]; //找到这样的data[i],放入data[j]处 j--; } L->data[i]=pivot; } //用main写测试代码 int main() { SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("移动前 "); DispList(sq); move2(sq); printf("移动后 "); DispList(sq); return 0; } 相关资源:数据结构实验一 线性表的应用(班级通讯录代码及测试界面)