所有算法涉及的顺序表的类型定义:
//线性表的动态储存分配
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[n]=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[n]=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;
}