数据结构例程——线性表顺序存储的应用
来源:互联网 发布:大数据测试工程师 编辑:程序博客网 时间:2024/06/10 14:54
本文是数据结构基础系列网络课程(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;}
1 0
- 数据结构例程——线性表顺序存储的应用
- 数据结构例程——线性表顺序存储的应用
- 数据结构例程——串的顺序存储应用
- 数据结构例程——线性表的顺序查找
- 数据结构——线性表的顺序存储结构
- 数据结构复习——线性表的顺序存储实现
- Java数据结构——线性表的顺序存储实现
- 数据结构——线性表的顺序存储
- 数据结构之线性表——栈的顺序存储
- 数据结构之线性表——队列的顺序存储
- 数据结构——线性表及线性表顺序存储
- 数据结构例程——线性表的应用:表的自然连接
- 数据结构——线性表(一)线性表的顺序存储和单链表
- 【数据结构】线性表的顺序存储结构
- 数据结构之线性表的顺序存储
- 数据结构 线性表的顺序存储
- 数据结构:线性表的顺序存储
- 【数据结构】线性表的顺序存储结构
- System.exit(0)和System.exit(1)区别
- [人月神话]读书笔记9--再论没有银弹("No Silver Bullet Refired")
- js setTimeout 和 setInterval实现多线
- gethostbyaddr ip到名字,gethostbyname名字到ip依赖于hosts、DNS服务器
- pic
- 数据结构例程——线性表顺序存储的应用
- windows10 x64 vs2015 MPI 1.4.1 环境配置
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
- Mysql管理用户权限
- 遍历二叉树的递归与非递归算法
- 设计模式概述
- C++ 墙角知识 04 我是用C++来写C的程序员.
- 【读书笔记】iOS-引用计数
- 在Storm中使用C++开发Bolt总结