顺序表数据结构
顺序表默认结构体
#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;
}