您的位置:首页 > 理论基础 > 数据结构算法

数据结构(一)顺序表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;}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: