408数据结构综合题(线性表)

P019

//01 
//搜索整个顺序表,
//查找最小值元素并记住其位置,
//搜索结束后最后一个元素填补空出的原最小元素的位置 

bool Del_Min(SqList &L,ElemType &value){
	if(L.length==0)
	return false;
	value=L.data[0];
	int pos=0;
	for(int i=1;i<L.length;i++)
	if(L.data[i]<value){
		value=L.data[i];
		pos=i;
	} 
	L.data[pos]=L.data[L.length-1];
	L.length--;
	return true;
} 


//02
//扫描顺序表L的前半部分,
//然后元素L.data[i](0<=i
//后半部分对应元素L.data[L.length-i-1]进行交换 
void reverse(Sqlist &L){
	ElemType temp;
	for(int i=0;i<L.length/2;i++){
		temp=L.data[i];
		L.data[i]=L.data[L.length-i-1];
		L.data[L.length-i-1]=temp; 
	}
}



//03 
//用k记录顺序表L中不等于x的元素个数
//将不等于x的元素移动到下标k的位置
//更新k值,修改L的长度 
void del_x_l(Sqlist &L,ElemType x){
	int k=0,i;
	for(i=0;i<L.length;i++)
	if(L.data[i]!=x){
		L.data[k]=L.data[i];
		k++;
	}
	L.length=k;
}



//04
//先寻找大于或等于s的第一个元素
//然后寻找值大于t的第一个元素
//将这段元素删除,后面元素直接前移 
bool Del_s_t2(SqList &L,ElemType s,Elemtype t){
	int i,j;
	if(s>=t||L.length==0)
	return false;
	for(i=0;i<L.length&&L.data[i]<s;i++);
	if(i>=L.length)
	return false;
	for(j=i;j<L.length&&L.data[j]<=t;j++);
	for(;j<L.length;i++,j++)
	L.data[i]=L.data[j];
	L.length=i;
	return true;
} 


//05
//从前到后扫描顺序表L
//用k记录元素值在s到t之间元素的个数
//值不在s到t之间则前移k个位置,否则k++ 
bool_Del_s_t(SaList &L,ElemType s,ElemType t){
	int i,k=0;
	if(L.length==0||s>=t)
	return false;
	for(i=0;i<L.length;i++){
		if(L.data[i]>=s&&L.data[i]<=t)
		k++;
		else
		L.data[i-k]=L.data[i];
	}
	L.length-=k;
	return true;
}



//06
//有序顺序表,值相同的元素一定在连续位置上
//初始将第一个元素视为非重复的有序表
//之后依次判断后面的元素是否与前面非重复有序表的最后一个元素相同
//相同则继续向后判断
//不同则插入前面的非重复有序表的最后,直到表尾
bool Delete_Same(SeqList &L){
	if(L.length==0)
	return false;
	int i,j;
	for(i=0,j=1;j<L.length;j++)
	if(L.data[i]!=L.data[j])
	L.data[++i]=L.data[j];
	L.length=i+1;
	retrun true;
}


//07
//按顺序不断取下两个顺序表表头较小的结点存入新的顺序表
//哪个表有剩余将剩余的部分加到新的顺序表后面 
bool Merge(SeqList A,SeqList B,SeqList &C){
	if(A.length+B.length>C.maxSize)
	return false;
	int i=0,j=0,k=0;
	while(i<A.length&&j<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++]=B.data[j++];
	C.length=k;
	return true; 
}


//08
//先将全部元素原地逆置
//再对前n个元素和m个元素分别使用逆置算法
typedef int DataType
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++){
		DataType temp=A[left+i];
		A[left+i]=A[right-i];
		A[right-i]=temp;
	}
} 
void Exchange(DataType A[],int m,int n,int arraySize){
	Reverse(A,0,m+n-1,arraySize);
		Reverse(A,0,n-1,arraySize);
			Reverse(A,n,m+n-1,arraySize);
}


//09
//顺序存储的线性表递增有序
//可以顺序查找也可以折半查找
//最少时间用折半查找
void SearchExchangeInsert(ElemType A[],ElemType x){
	int low=0,high=n-1,mid;
	while(low<=hight){
		mid=(low+high)/2;
		if(A[mid]==x) break;
		else if(A[mid]<x) low=mid+1;
		else hight=mid-1;
	}
	if(A[mid]==x&&mid!=n-1){
		t=A[mid];A[mid]=A[mid+1];A[mid+1]=t;
	}
	if(low>hight){
		for(i=n-1;i>hight;i--) A[i+1]=A[i];
		A[i+1]=x;
	}
} 


//10
//同08,复杂度待解决

//11
//求两个升序序列AB中位数
//分=<>三种情况
int M_Search(int A[],int B[],int n){
	int s1=0;d1=n-1,m1,s2=0,d2=n-1,m2;
	while(s1!=dl||s2!d2){
		m1=(s1+d1)/2;
		ma=(s2+d2)/2;
		if(A[m1]==B[m2])
		return A[m1];
		if(A[m1]<B[m2]){
			if((s1+d1)%2==0){
				s1=m1;
				d2=m2;
			}
			else{
				s1=m1+1;
				d2=m2;
			}
		}
		else{
			if((s2+d2)%2==0){
				d1=m1;
				s2=m2;
			}
			else{
				d1=m1;
				s2=m2+i;
			}
		}
	}
	retrun A[s1]<B[s2]?A[s1]:B[s2];
} 



//12
//从前向后扫描数组元素,标记出一个可能成为主元素的元素Num
int Majority(int A[],int n){
	int i,c,count=1;
	c=A[0];
	for(i=1;i<n;i++)
	if(A[i]==c)
	count++;
	else
	if(count>0)
	count--;
	else{
		c=A[i];
		count=1;
	}
	if(count>0)
	for(i=count=0;i<n;i++)
	if(A[i]==c)
	count++;
	if(count>n/2) return c;
	else return -1;
} 


//13
int findMissMin(int A[],int n){
	int i,*B;
	B=(int *)malloc(sizeof(int)*n);
	mement(B,0,sizeof(int)*n);
	for(i=0;i<n;i++)
	if(A[i]>0&&A[i]<=n)
	B[A[i]-1]=1;
	for(i=0;i<n;i++)
	if(B[i]==0) break;
	return i+1;
}


//14
#define INT_MAX 0x7fffffff
int aba_(int a){
	if(a<0) return -a;
	else return a;
	}
	bool xls_min(int a,int b,int c){
		if(a<=b&&a<=c) return true;
		return false;
	}
	int findMinoTrip(int A[],int n,int B[],int m,int C[],int p){
		int i=0,j=0,k=0,D_min=INT_MAX,D;
		while(i<n&&j<m&&k<p&&D_min>0){
			D=abs_(A[i]-B[j])+abs_(B[j]-C[k])+abs_(C[k]-A[i]);
			if(D<D_min) D_min=D;
			if(xls_min(A[i],B[j],C[k])) i++;
			else if(xls_min(B[j],C[k],A[i])) j++;
			else k++;
		}
		return D_min;
	}

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