数据结构代码练习02

 顺序表数据结构

顺序表默认结构体
#include<stdio.h> 
//顺序表默认结构体
typedef struct{
    int data[Maxsize];
    int length;
}Sqlist;
 顺序表相关操作

//
//顺序表递增有序,插入元素x,仍递增有序
int find(Sqlist L,int x){
    int i=0;
    for(i;i<L.length;++i){
        if(x<L.data[i])
        break;
    }
    return i;
}
void insert(Sqlist &L,int x){
    int j,p;
    p=find(L,x);
    for(j=L.length-1;j>=p;--j)
       L.data [j+1]=L.data[j];
   L.data [p]=x;
   ++(L.length);
}

//
//用顺序表最后一个元素覆盖整个顺序表中最小元素,并返回该最小元素
int Del_Min(Sqlist &L){
    int min = L.data [0];
    int pos=0;
    for(int i=0;i<L.length;i++)
        if(L.data[i]<min){
            min=L.data[i];
            pos=i;
        }
    L.data[pos]=L.data[L.length-1];
    L.length--;
    return min;
}

//
//将顺序表中元素逆置
void Reverse(Sqlist &L){
    int temp,i=0,j=L.length-1;
    for(i;i<L.length/2;i++,--j){
        temp=L.data[i];
        L.data[i]=L.data[j];
        L.data[j]=temp;
    }
}

//
//将(a1,a2…am,b1,b2,…bn)转换成(b1,b2,…bn,a1,a2,…am)
void Reverse(int A[],int m,int n){
    int mid=(m+n)/2;
    for(int i=m,j=0;i<=mid;++i,++j){
        int temp=A[i];
        A[i]=A[n-j];
        A[n-j]=temp;
    }
}
void change(int A[],int m,int n){
    Reverse(A,0,m+n-1);
    Reverse(A,0,n-1);
    Reverse(A,0,m+n-1);
}
//删除顺序表中所有值为x的元素
//法一
void del(Sqlist &L,int x){
	int k=0;
	for(i<=L.length-1;++i)
		if(L/data[i]!=x){
			L.data[k]=L.data[i];
			++k;
		}
	L.length=k;
}
//法二
void del(Sqlist &L,int x){
	int k=0;
	for(i<=L.length-1;++i){
		if(L/data[i]==x)
			++k;
		else
			L.data[i-k]=L.data[i];
	}
	L.length=L.length-k;
}

//
//从顺序表中删除给定值在s到t之间(包含s和t)的所有元素
bool del(Sqlist &L,int s,int t){
	int i,k=0;
	if(L.length==0||s>=t)
		return fase;
	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;
} 

//
//从有序表中删除所有值重复的元素
bool del(Sqlist &L){
	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;
	return true; 
} 

//
//两个递增有序表合成一个递增有序表
bool merge(Sqlist A,Sqlist B,Sqlist &C){
	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;
	}
} 
//
//求两个递增序列合并后的中位数
int Find(Sqlist &A,Sqlist &B){
	int i,j,k;
	i=j=k=0;
	Sqlist C;
	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(i<B.length)
		C.data[k++]==B.data[j++];
	return C.data[(A.length+B.length-1)/2];
} 

//
//设计一个时间上尽可能高效,找出数组中未曾出现的最小正整数
int find(int A[],int 0){
	int i;
	int *B=(int *)malloc(sizeof(int)*n);
	for(int k=0;k<n;++k)
		B[k]=0;
	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;
	deltete[] B;
	return i+1;
} 

//
//若一个整数序列有过半相同元素,则称其为主元素
//设计找出数组A(a0,a1,...an-1)中的主元素,若存在则输出,若没有返回-1
int fun(int A[],int n){
	int *B=new int[n];
	for(int i=0;i<n;++i)
		B[i]=0;
	int i,k,max=0;
	for(i=0;i<n;++i)
		if(A[i]>0&&A[i]<=n)
			B[A[i]-1]++;
	for(i=0;i<n;++i)
		if(B[i]>max){
			max=B[i];
			k=i;
		}
	delete[] B;
	if(max>n/2)
		return k+1;
	else
		return -1;	
} 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值