数据结构(一)顺序表3:顺序表常见题型
2016-11-03 16:26
579 查看
所有算法涉及的顺序表的类型定义: //线性表的动态储存分配 const int MAXSIZE=(100); typedef struct { int *data; int length; }Sqlist; 动态分配语句为: data=(int *)malloc(sizeof(int)*MAXSIZE); //data=new int[MAXSIZE];
1.将线性表的就地逆置:
算法思路就是:将1号和n号交换,然后2号和n-1号交换。。。。。直到到顺序表中位置。 n为偶数;中间就是n/2和n/2+1,将两者交换即可; n为奇数:中间只有一项n/2,自己交换即可; //线性表的就地逆置 int Reverse(Sqlist &l) { if(l.length==0) { cout<<"空表不用交换"<<endl; return; } int tem; //引进临时变量,用于交换 for(int i=1;i<=n/2;i++) { temp=l.data[i-1]; l.data[i-1]=l.data[n-i]; l.data[n-i]=temp; } return 1; //交换成功返回1 }
2.删除链表中具有最小值的元素并返回,空出的位置由最后一个元素填补。
算法思路:用pos来表示最小的元素,将第一个数据元素l.data[0]假设成最小元素,在循环中遇到比l.data[0]小的数值,令pos等于其,直到循环结束。 //删除顺序表中数值最小的元素 int Deletemin(Sqlist &l,int &e) { if(l.length==0) { cout<<"顺序表为空表不能删除"<<endl; return; } int pos; //删除顺序表中的最小元素值 for(int i=1;i<l.length;i++) if(l.data[i]<l.data[pos]) pos=i; e=l.data[pos]; l.length--; l.data[pos]=l.data[l.length]; return 1; //删除成功,返回1 }
3.删除线性表中所有值为x的元素
算法思路:用n来表示删除元素后顺序表的长度(初始值为0),i来表示当前待检测的元素(初始值为0)l.data[i]==x; i++;l.data[i]!=x; l.data=l.data[i]; n++; i++;//删除顺序表中数值为x的元素int Deleteelem(Sqlist &l,int x) {if(l.length==0) {cout<<"顺序表为空表不能删除"<<endl;return;}int n=0;//删除操作for(int i=0;i<l.length;i++)if(l.data[i]!=x)l.data[n++]=l.data[i];l.length=n;return 1; //删除成功返回1}
4.删除线性表中元素值在 [x,y] 之间的所有元素值
算法思路:和上一题一样用n来表示删除元素后顺序表的长度(初始值为0),i来表示当前待检测的元素(初始值为0)l.data[i]>=x && l.data[i]<=y; i++;l.data[i]<x || l.data[i]>y ; l.data=l.data[i]; n++; i++;//删除顺序表中元素值在 [x,y] 之间的所有元素值int DeleteAllelem(Sqlist &l,int x,int y) {if(l.length==0) {cout<<"顺序表为空表不能删除"<<endl;return;}int n=0;//删除操作for(int i=0;i<l.length;i++)if(l.data[i]<x || l.data[i]>y)l.data[n++]=l.data[i];l.length=n;return 1; //删除成功返回1}<h3><5.将两个顺序表合并成一个顺序表</h3>算法思路:检测指针i用来检测l1,检测指针j用来检测l2,记忆指针n用来记录l3的长度l1.data[i]<=l2.data[j] l3.data[n++]=l1.data[i++];l1.data[i]>l2.data[j] l3.data[n++]=l2.data[j++];若两个顺序表中有一个顺序表已经遍历完毕,则将另一顺序表中的元素全部转移到l3中i<=l1.length l3.data[n++]=l1.data[i++];j<=l2.length l3.data[n++]=l2.data[j++];//将两个顺序表合并成一个顺序表void Merge(Sqlist &l1,Sqlist &l2,Sqlist &l3) {int i,j,n;int i=j=n=0;while(i<l1.length && j<l2.length )if(l1,data[i]<=l2.data[j]) l3.data[n++]=l1.data[i++];else l3.data[n++]=l2.data[j++];//复制剩余部分while(i<l1.length) l3.data[n++]=l1.data[i++];while(j<l2.length) l3.data[n++]=l2.data[j++];l3.length=n;return 1;}
相关文章推荐
- 再回首,数据结构——字符串与数组的常见操作(顺序存储)
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 【数据结构_顺序表_List_1038】顺序表中重复元素的删除
- 数据结构与算中树相关常见题型
- 数据结构之顺序表增、删、查找、初始化以及顺序表输出基本相关操作
- 再回首,数据结构——顺序表的常见算法
- 数据结构——顺序表有序顺序表归并
- 【数据结构作业六a】建立一个顺序表,用顺序查找、折半查找的方法对其实施查找
- 【数据结构_顺序表_List_1102】顺序表上数据划分
- 再回首,数据结构——顺序栈上的常见操作
- 数据结构——链表(面试常见题型总结)
- C#数据结构二:顺序表Sequence List
- 数据结构——顺序表
- 数据结构——顺序表
- 数据结构顺序表
- 数据结构实现顺序线性表的一些小应用
- 数据结构之表(1)顺序表的实现
- 数据结构与算法(C++)之一——顺序表(SeqList)
- c++数据结构之顺序表
- 数据结构之线性表顺序存储的常用操作(转载)