数据结构算法练习1——顺序表

1.从顺序表中删除具有最小元素(假设唯一)并由函数返回被删除函数的值,空出的位置由最后一个元素填补,如果顺序表为空显示出错信息并退出运行。

思想:遍历顺序表,找到最小值的位置,将末尾元素保存到此次,删除末尾元素

bool Del_Min(sqList &L,ElemType &value){
	if(L.length==0)//如果表为空,直接返回 
	return false;
	value=L.data[0];//value用来记录最小值 
	int flag=0;//flag用来记录数据的位置 
	for(int i=0;i<L.length;i++){
		if(L.data[i]<value){
			value=L.data[i];//得到最小值 
			flag=i;//得到最小值的位置 
		}
	}
	L.data[flag]=L.data[length-1];//把最后一个元素存到最小值元素的位置 
	L.length--; 
	return true;
}

2.设计一个高效算法,将顺序表中的所有元素逆置,要求算法的空间复杂度为O(1)

思想:扫描半个表将前半部分和后半部分进行交换

void Reverse(sqLit &L){
	ElemType temp;//辅助变量 
	for(int i=0;i<L.length/2;i++){
		temp=L.data[i];
		L.data[i]=L.data[L.length-1];//将对应元素进行交换 
		L.data[L.length-1]=temp;
	}
} 

 

3.长度为N的顺序表L,编写时间复杂度为O(n),空间复杂度为O(1),该算法删除链表中所有值为X的元素。

思想:用k记录值不为x的元素个数,一边扫描表,一边记录k值,将值不为x的元素向前放置在k的位置上。无重复是,k++,i++,有重复时只有i++.

void del_x(sqList &L,ElemType x){
	int k=0;//记录值不等于x值元素的个数
	for(int i=0;i<L.length;i++){
		if(L.data[i]!=x){
			L.data[k]=L.data[i]; 
			k++;
		}
	} 
	L.length=k;
} 

4.从顺序表中删除其值在定值为s与t之间(要求s<t)的所有元素,如果s或t不合理或者顺序表为空,则显示出错信息并运行退出

思想:找出值大于s和值大于t的第一个元素flag1,flag2.将后面的元素前移flag2-flag1个位置。

bool Del_s_t(Sqlist &L,ElemType s,ElemType t){
	int count=0;
	int flag1=-1;int flag2=-1;
	if(s>=t||L.length==0){
		printf("链表为空,或s,t输入错误");
		return false; 
	}
	for(int i=0;i<L.length;i++){ 
		if(L.data[i]>s&count==0){//找到大于s的第一个元素 
			flag1=i;
			count++;
		}
		if(L.data[i]>t&count==1){//找到大于t的第一个元素,跳出循环 
			flag2=i;
			count++;
			break;
		} 
	}
	if(flag1==-1){
		printf("s大于链表中的所有元素!");
		retuen false;
	}
	int sub=flag2-flag1;
	for(int i=flag1;i<leangth;i++){
		L.data[i]=L.data[i+sub];//将元素删除,后面的元素迁移 
	}
	L.length=L.ength-sub; 
} 

 

5.从无序链表中删除s到t之间的数 

思想:将小于s和大于t的元素,筛选出来添加进新的表

bool Del_s_t2(Sqlist &L,ElemType s,ElemType t){
	sqList L1;//用来暂存链表中的数据
	int k=0; 
	if(L.length==0||s>=t){
		printf("链表为空,或者s与t输入错误"); 
		return false;
	}
	for(int i=0;i<L.length;i++){
		if(L.data[i]<=s||L.data[i]>=t){
			L1.data[k]=L.data[i];//将链表L中不再s~t中的数据存到L1中 
			k++;
		}
	}
	L=L1; 
	return true; 
}

6.从有序表中删除,所有值重复的元素,使得无重复值
思想:因为是有序表,所以值相同的元素一定在连续的位置上。判断后面的元素值是否与前面的元素值相等,如果相等,将后面的元素前移,两个元素合并成一个元素。

bool delete_same(sqList &L){
    if(L.lenfth==0)
    reruen false;
    int i,j;
    for(i=0;j=1;j<L.length;j++){
          if(L.data[i]!=L.data[j]){//查找下一个元素,与上一个元素值不同的元素 
              L.data[i++]=data[j];//找到后将元素前移 
          }
    }
    L.length=i+1;//所有前移元素将前面相同的元素覆盖后,改变表长,移动的元素消去 
    return true;
} 

7.将两个有序顺序表合为一个合并成一个有序表,返回合并后的表
思想:按顺序比较表头值,将较小的存入新表,最后看哪个表有剩余,将剩余的部分加的新表后面

bool Merge(Sqlist &A,Sqlist &B,Sqlist &C){
    if(A.length+B.length>MaxSize){
    //如果两个表长度之和大于链表空间最大长度,直接返回false 
        return false;
    }
    int i=0,j=0,k=0;
    while(i<A.length&B<length){//比较两个表表头的值,将较小的元素存入新表 
        if(A.data[i]<B.data[j])
            C.data[k++]=A.data[i++];
        else
            C.data[k++]=B.data[j++];
    }
    //将剩余表的部分直接插的顺序表的后面
    while(i<A.length){
    C.data[k++]=A.data[i++];
    while(j<B.length){
    C.data[k++]=A.data[j++];
    C.length=k+1;
    return true;
} 

8.已知一个一位数组中A[M+N],依次存放着两个线性表(a1,a2,,,am),(b1,b2,,,bn).编写一个函数将数组中的两个顺序表位置互换

思想:将(a1,a1...am,b1,b2,,,bn)逆置换——》(bn...b2,b1,am,,,,a2,a1)——》前n个逆置换,后m个逆置换

typedef int DataType;
//函数1将任意数组进行逆序 
void Reverse(DataType A[],int left,int right,int arraySize){
	if(left>right||right>arraySize){
		return false;
	}
	int mid=(left+right)/2;
	for(int i=0;i<=mid-left;i++){//将(a1,a2,,,am),(b1,b2,,,bn)进行逆序 
		DateType temp=A[left+i];
		A[left+i]=A[right-i];
		A[right-i]=temp;
	}
} 
//函数2调用函数1解题 
void Exchenge(Date A[],int m,int n,int arraySizes){
	Reverse(A,0,m+n-1,arraySize); 
	Reverse(A,0,n-1,arraySize); 
	Reverse(A,n,m+n-1,arraySize); 
} 

 

9,线性表(a1,a2,,,an)中的元素递增有序地存在计算机内,要求设计一个算法完成最少时间在表中查找值为x的元素,如果找到与其后继元素位置交换。如果找不到将其插入表中使得表仍然递增有序。

思想:因为要求最短时间所以用折半查找。

void SearchExchangeInsert(ElemType A[],EleamType x){
	int low=0,high=n-1,mid;
	int temp;
	while(low<high){
		mid=(low+high)/2;
		if(A[mid]==x) break;//找到x退出循环 
		else if(A[mid]<x) low=mid+1;//到中点右边查询 
		else high=mid-1;//到中点左边查询 
	}//下面的两个if只会执行一个
	if(A[mid]==x&&mid!=n-1){//查询到x,并且不是最后一个元素进行后继节点间的交换 
		temp=A[mid];
		A[mid]=A[mid+1];
		A[mid+1]=temp;
	} 
	if(low>high){//查找失败,插入x 
		int i;
		for(i=n-1;i>high;i--){//x在low和high所对应值之间,所以将high的值后移,插入x 
			A[i+1]=A[i];
		}
		A[i+1]=x; 
	} 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值