数据结构算法练习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

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

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

void Reverse(sqLit &L){
	ElemType temp;//辅助变量 
	for(int i=0;i

 

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

4.从顺序表中删除其值在定值为s与t之间(要求s

思想:找出值大于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;is&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

 

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=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

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

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(lowhigh){//查找失败,插入x 
		int i;
		for(i=n-1;i>high;i--){//x在low和high所对应值之间,所以将high的值后移,插入x 
			A[i+1]=A[i];
		}
		A[i+1]=x; 
	} 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(算法,C,数据结构)