数据结构代码题目主要看思想,实际不能执行也不要紧。
//1.删除表内最小元素,唯一,返回被删元素,空出来的最后一个元素填补,顺序表空返回错误退出运行。
bool del_minElem(sqList &L,elemType value)
if(L.length= =0) ??注意这里是==
return false;
elem e=L.data[0];
int pos =0; ??注意初始化
for(int i=1;i<L.length;i++)
if(e >L.data[i])
e=L.data[i];
pos=i;
L.data[pos]=L.data[L.length-1]; ??注意是pos不是e
L.length --;
return true;
//3 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法。
//该算法删除线性表中所有x数据元素
void del_x(SqList &L , ElemType x)
int
for(int i=0 ;i<L.length ;i++ )
if (L.data[i]==x)
for(int j=L.length;j>=i;j--)
L.data[i] =L.data[i+1];
L.length --;
return 0;
//书中答案:重新从0位置开始排跟x不相等的数据。
void del_x(SqList &L , ElemType x)
int k=0;i=0;
while (i<L.length)
if (L.data[i] !=x)
L.data[k] = L.data[i];
k++;
L.length=k; //??把 !=改成 == 就是删除不同的数据
// 4 删除给定值在s与t之间 s<t
bool delete_s_t(SqList &L ,elem s,elem t)
if (s>=t || L.length ==0)
return false;
for(int i =0;i<L.length ;i++)
if(L.data[i]>s && L.data[i] <t)
for(int j=L.length;j>=i;j--)
L.data[i] =L.data[i+1];
L.length --;
return true;
//答案:要考虑顺序表,表本身是有序的,所以删除的时候必须是一个整体。
算法思想:寻找值大于等于s的第一个元素(第一个删除的元素),寻找值大于t的元素(最后一个删除元素的下一个元素)
删除之后需要将之后的元素前移。
bool delete_s_t(SqList &L ,ElemType s,ElemType t)
int i,j;
if(L.length ==0 || s>=t)
return false;
for(i=0;i<L.length && L.data[i]<s;i++) //寻找大于s的
if(i>=l.length) //可以考虑替换if(L.data[0]>=t || L.data[L.length]<=s)
return false;
for(j=i;j<L.length && L.data[j]<t;j++) //寻找大于t的;
for(;j<L.length;i++,j++) //前移填补
L.data[i]=L.data[j];
L.length = i;
return ture;
//5 从顺序表中删除给定值 s与t 之间,包含s和t,要求s<t 的所有元素,若s或t不合理
或顺序表为空,显示错误信息并退出运行。
bool delete_s_t5(SqList &L ,ElemType s,ElemType t) //要声明两个变量
if (s >t || L.length ==0)
return false;
for(int i= 0; i<L.length ;i++)
if(L.data[i]>=s && L.data[i] <=t)
for(int j=i;j<L.length;j++)
L.data[j]=L.data[j+1];
L.length --;
return ture;
//书上答案
bool delete_s_t5(SqList &L ,ElemType s,ElemType t)
int j,i;
if (s >t || L.length ==0)
return false;
for(int 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 ture;
//6 从有序数列中删除所有其重复的元素,使表中所有的值均不同加粗样式
bool del_repeat(sqList &L)
int k,i,j;
if(L.length= =0) ??注意这里是==
return false;
for(i=0;i<L.length;i++)
for(j=0;j<L.length;j++)
if (L.data[i]=L.data[j])
k++;
L.data[i-k]=L.data[i];
L.length -=k;
return ture;
//书中答案
bool del_repeat(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;
return ture;
//7 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表
void return_seqList(SeqList &L1 ,SeqList &L2)
if(L1.length= =0)
return L2;
if(L2.length= =0)
return L1;
int i,j,k=0;
SeqList L;
for(i=0;i<L1.length;i++)
for(j=0;j<L2.length;j++)
if(L2.data[j]<L1.data[i])
L.data[++k]=L2.data[j];
else
L.data[++k]=L1.data[i];
return L;
//书中答案
bool Merge(SeqList A,SeqList B,SeqList C)
//A,B合并成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 ture;
8.已知在一维数组A[m+n]中依次存放两个线性表(a1…am)和
(b1…bn)试编写一个函数,将数组中两个顺序表的位置互换,即将
(b1…bn)放在(a1…am)的前面。
答案:
思想:先将数组A[m+n]中元素原地置换再对n个元素和后m个元素分别使用逆置算法。
typedef int DataType;
void Reverse(DataType A[],int left ,int right,int arraySize)
if(arraySize ==0 ||)
return false;
int mid=(left+right)/2
DataType temp;
for(int i=0;i<mid-left;i++)
temp = A[left+i];
A[left+i]=A[right-i];
A[right-i]=temp;
void Exchange(DataType A[],int left ,int right,int arraySize)
Reverse(A,0,m+n-1,arraySize)
Reverse(A,0,n-1,arraySize)
Reverse(A,n,m+n-1,arraySize)```
9.线性表(a1…an)中元素递增有序存储计算机内。要求设计一个算法
完成用最少的时间在表中查找数值为x的元素,若找到,则将其与其后继元素
位置相互交换,若找不到,则将其插入表中并使表中的元素仍然递增有序。
void Reverse(SeqList &L, int low ,int high,ElemType x) //这个是线性表 声明可以用数组[]
int min=(low+high)/2;
if(L.data[mid]=x) //这里应该==
L.data[mid]=L.data[mid+1]; //折半查找代码不熟
L.data[mid+1]=x;
else if(L.data[mid]>x) //x小应该在 low和mid之间找。
low=(low+high)/2;
else
high=(low+high)/2;
if(low>=high);
if(L.data[mid]>x)
for(int i=L.length;i>mid;i--)
L.data[i+1]=L.data[i];
L.length++;
L.data[mid]=x;
if(L.data[mid]>x)
for(int i=L.length;i>mid+1;i--)
L.data[i+1]=L.data[i];
L.length++;
L.data[mid+1]=x;
return 0;
答案:折半查找效率最快
void SearchExchangeInsert(ElemType A[],ElemType x)
int low=0,high=n-1,mid;
while(low<high)
mid=(low+high)/2;
if(A[mid]==x) break;
else if(A[mid]<x) low=mid+1;
else high=mid-1;
if(A[mid]==x && mid! = n-1) //若最后一个元素与x相等 则不存在与其后面交换操作
t=A[mid];A[mid]=A[mid+1];A[mid+1]=t; //答案里没有看到t的声明
if(low>high) //查找失败
for(i=n-1;i<high;i--) //后移元素,插入x
A[i+1]=A[i];
A[i+1]=x;
10.【2010真题】设将n(n>1)个整数存放到一维数组R中,设计一个在时间
和空间两方面都尽可能高效的算法。将R中保存的序列喜欢左移p(0<p<n)个
位置,即将R中的数据由(X0,X1…Xn-1)变换(Xp,Xp+1…Xn-1,X0
…Xp-1),要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度
思想:可将这个问题视为把数组ab转换成ba(a代表数组前p个元素,b代表数组
余下n-p个元素)。先将a逆置,再将b逆置,最后整个逆置。
void Reverse(int R[],int from ,int to)
int i,temp;
for(i=0;i<(to-from -1)/2;i++) //转置R
temp=R[from+i];
R[from+i]=R[to-i];
R[to-i]=temp;
void Converse(int R[],int n,int p)
Reverse(R,0,p-1); //转置p
Reverse(R,p,n-1); //转置除p外的
Reverse(R,0,n-1); //转置最终的
时间复杂度:O(n),空间复杂度O(1);
11.【2011真题】一个长度为L(L>=I)的升序序列S,处在第L/2 向上取整
的位置数称为S的中位数。两个有序列的中位数是喊他们所有元素的升序序列
中位数。现在有等长升序序列A和B,设计一个在空间和时间两方面都尽可能高
效的算法,找出两个序列A和B的中位数。要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度
思想:排序两个序列,找到L/2 向上取整。
或者s1的个数之和比上2。然后再去序列里面找对应的值。
void mid_number(A[],B[]) //没有数组的类型。1
int i=0,j=0,k=0,mid;
for(int i=0;i<(A.length+B.length)/2-1;i++) //没有考虑A,B中数据取玩的情况
if(A[k]<=B[j] || k>A.length)
k++;
if(k+j=(A.length+B.length)/2-1)
R[mid]=R[k];
else
j++;
if(k+j=(A.length+B.length)/2-1)
R[mid]=R[j];
return R[mid];
时间复杂度:O(n),空间复杂O(1);
答案
int M_Search(int A[],int B[],int n)
int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2;
//分别表示A和B的首位数、末尾数和中位数。
while(s1!=d1 ||s2!=d2)
m1=(s1+d1)/2;
m2=(s2+d2)/2;
if(A[m1]=A[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+1;
return A[s1]<B[s2]?A[s1]:b[S2];
12.【2013统考真题】已知整数数列A=(a0,a1…an-1),其中0<=ai<n
(0<=i<n),若存在ap1=ap2=…apm=x且m>n/2(0<=pk<n,1<=k=<m),
则称x为A的主元素。假设A中的n个元素保存在一个一维数组中,请设计一个在
空间和时间两方面都尽可能高效的算法。找出A的主元素。若存在输出该元素,
否则输出-1.要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度
13.【2018统考真题】给定一个含n(n>=1)整数数组,找出数组中未出现的最小
正整数,要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度
14.【2020统考真题】定义三元组(a,b,c均为正数)的距离D=|a-b|+|b-c|
+|c-d|.给定三个非空集合S1,S2,S3,按升序分别存储在三个数组中。计算并
输出所有可能的三元组(a,b,c)(a∈S1,b∈S2,c∈S3),例:S1={-1.0.9},
S2{-25.-10,10,11}, S3={2,9,17,30,41}.最小距离是2,相应三元组为
(9,10,9)。要求:
1)给出算法的基本思想
2)根据思想,采用语言描述,关键处给出注释
3)说明你所设计的算法时间和空间复杂度