数据结构(一)顺序表3:顺序表常见题型

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


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值