C++数据结构上机作业DS作业和实验参考答案总汇Word下载.docx
《C++数据结构上机作业DS作业和实验参考答案总汇Word下载.docx》由会员分享,可在线阅读,更多相关《C++数据结构上机作业DS作业和实验参考答案总汇Word下载.docx(95页珍藏版)》请在冰豆网上搜索。
![C++数据结构上机作业DS作业和实验参考答案总汇Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/10/628a7120-cbbe-48ed-8a9b-5b339d5472ec/628a7120-cbbe-48ed-8a9b-5b339d5472ec1.gif)
模拟考试
复习C++9000,9002
9000:
矩形面积
ProblemDescription
声明一个名为rect的矩形类,其属性为矩形的左下角和右上角两个点的x和y坐标,该类有效矩形只存在于直角坐
标系的第一象限内。
若所构成的矩形有效,则计算矩形的面积;
若所构成的矩形无效,则输出“dataerror”。
Input
输入的第一行为一个数字n,表示下面有n组数据,每组数据包括2行;
每组数据中的第一行表示矩形左下角点的
x和y坐标,第二行表示矩形右上角点的x和y坐标。
Output
SampleInput
2
22
44
12
34
SampleOutput
4
//9000ANSWERCODE1
#include<
iostream>
usingnamespacestd;
classrect{
public:
rect(inta,intb,intc,intd);
~rect(){}
intarea();
private:
intx1,y1,x2,y2;
};
rect:
:
rect(inta,intb,intc,intd){x1=a;
y1=b;
x2=c;
y2=d;
}
intrect:
area(){return(x2-x1)*(y2-y1);
intmain(){
inta,b,c,d,n;
cin>
>
n;
while(n--)
{
a>
b>
c>
d;
if(a<
0||b<
0||c<
0||d<
0||a>
=c||b>
=d)
cout<
<
"
dataerror"
endl;
else
{rectr(a,b,c,d);
r.area()<
return0;
9002:
数组的循环移位
对于一个给定的字符型数组循环左移i位,要求尽量不申请空间,实现“原地”操作。
输入的第一行为一个数字n,代表接下来有n组数据,每组数据包括2行;
每组数据中的第一行为一个字符串(长度
不超过50),第二行为一个数字m,代表要左移的位数。
循环左移后的字符型数组内容。
1
abcdefgh
3
defghabc
//9002ANSWERCODE1
#defineN20
voidReverse(chara[],intfrom,intto){
inti,j;
chart;
i=from;
j=to;
while(i<
j)
{t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}}
voidConverse(chara[],intn,inti){Reverse(a,0,i-1);
Reverse(a,i,n-1);
Reverse(a,0,n-1);
intmain()
chara[N];
intm,n,i;
m;
while(m--){
i;
n=strlen(a);
i=i%n;
Converse(a,n,i);
a<
}
9003:
合并顺序表
假设有两个由小到大有序的有序顺序表A和B,现要求将表B并入表A中,且A表仍保持由小到大的有序性。
若
合并后的顺序表表长超过总容量20,则输出“notenough”。
第一行为一个数字n,表示下面有n组数据,每组数据包括4行;
每组数据中的第一行表示表A的表长,第二行表示
表A的数据元素,第三行表示表B的表长,第四行表示表B的数据元素。
若合并成功,输出两行信息,第一行表示合并后A表的表长,第二行表示合并后A表的数据元素,元素之间用一
个空格分隔;
若合并后的顺序表表长超过总容量20,则输出“notenough”。
13817
61015
7
1368101517
//9003ANSWERCODE1
#include<
constintMaxSize=20;
//有两个由小到大有序的有序顺序表A和B
voidcombine(intA[],intA_len,intB[],intB_len){
if((A_len+B_len)>
MaxSize)cout<
notenough\n"
;
inti=0,j=0,k=0;
for(i=0;
i<
B_len;
i++)
while(B[i]>
A[j])//找到B[i]在A表中的插入位置j
{j++;
for(k=A_len-1;
k>
=j;
k--)//把j(包括j)后的元素往后挪一个位置,空出j来。
{A[k+1]=A[k];
A[j]=B[i];
//把B[i]插入A表中的位置j
A_len++;
//A表长度加1
A_len<
(A_len-1);
i++)cout<
A[i]<
"
voidmain(){
intA[MaxSize],B[MaxSize],A_len,B_len,n,i;
while(n--){
A_len;
i++){cin>
A[i];
B[i];
combine(A,A_len,B,B_len);
9004:
连续删除
从由小到大有序的顺序表中删除其值在[s,t]之间(含s和t)的所有元素,且不改变顺序表的有序性。
如果s>
=t则显示“dataerror”;
否则输出顺序表的表长和顺序表中的元素,若处理后的顺序表为空,则不输出任何信息。
输入的第一行为一个数字n,表示下面有n组数据,每组数据包括3行;
每组数据中的第一行包含两个数字s和t,第二行为顺序表的表长len(0<
len<
=20),第三行为顺序表的数据元素。
对于每组数据,如果s>
=t,则直接输出“dataerror”,否则输出两行信息:
第一行为处理后顺序表的表长,第二行为处理后顺序表中的元素,元素之间用一个空格分隔,如果处理后的顺序表为空,则不输出任何信息。
818
13510171925
5
1351925
//9004ANSWERCODE1
intn,s,t,len,A[21],i,s_i,t_i,j,span;
s>
t>
len;
i++)cin>
if(s>
=t||len<
=0||len>
20)
{cout<
continue;
s_i=0;
t_i=len-1;
while(A[s_i]<
s&
&
s_i<
len)s_i++;
while(A[t_i]>
t&
t_i>
=0)t_i--;
if(s_i<
=t_i)
span=t_i-s_i+1;
for(j=s_i;
j<
j++)A[j]=A[j+span];
len-=span;
if(len!
=0)
len-1;
9012:
找唯一数
在一个表长为n的顺序表中,除一个元素之外,其余的元素都出现了两次。
请找出这个仅出现一次的元素。
有多组数据,每组第一行表示表长n(1<
=n<
=11111);
第二行表示顺序表的各元素。
输出这个唯一数。
22131
2113-123
-1
//9012ANSWERCODE1
intn,i,j,A[11112],B[11112];
while(cin>
n)
if(n>
=1&
n<
=11111)
i++)B[i]=1;
{for(j=i+1;
j++)
{if(A[i]==A[j]){B[i]=0;
B[j]=0;
break;
}}
{if(B[i]==1)cout<
9006:
单链表的建立和遍历
输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。
输入数据有多组,每组数据占两行;
每组第一行为一个数字N(N<
=50);
第二行有N个整数。
输出这组整数,数字之间用一个空格分隔。
1232457854
//9006ANSWERCODE1
structNode{intdata;
Node*next;
intmain()
intN,i,A[51];
Node*head=newNode,*p,*tail;
N)
if(N>
0)
N;
tail=head;
p=newNode;
p->
data=A[i];
tail->
next=p;
tail=p;
next=NULL;
p=head->
next;
N-1;
{cout<
p->
data<
p=p->
9014:
删最小值
设有一单链表,现要求删除其最小值(假设最小值唯一)。
若删除成功,则输出被删的最小值;
若删除失败,则输
出“notexist”。
有多组数据,每组第一行为单链表的元素个数n(0<
100);
第二行为单链表的各个元素。
若删除失败,则输出“notexist”。
8
426-319145
24167
-3
//9014ANSWERCODE1
Node*next;
inti,n,data[100],min;
Node*first,*p,*q,*s,*tail;
if(n==0){cout<
notexist\n"
data[i];
first=newNode;
first->
tail=first;
{s=newNode;
s->
data=data[i];
next=s;
tail=s;
p=first;
min=first->
next->
data;
while(p->
next)
{q=p;
if(p->
min)min=p->
p=first->
q=first;
while(p)
{if(p->
data==min)break;
else{q=p;
if(p&
q){q->
next=p->
deletep;
min<
else{cout<
9016:
查找倒数第k个结点
有一单链L,请输出该单链表中倒数第k个结点的值。
若该结点不存在,则输出“notfind”。
有多组数据,每组第一行为单链表元素个数n和k值(0<
n<
100,k>
0);
第二行为单链表的各元素。
输出该单链表中倒数第k个结点的值。
51
12345
55
//9016ANSWERCODE1
structNode{intdate;
Node*next;
intn,k,i,c,data[100];
Node*first,*r,*p,*s;
n>
k)
r=first;
{s=newNode;
date=data[i];
r->
r=s;
//倒数第k个就是正数第n-k+1个。
if(k<
=n&
k>
=1)
c=1;
while(p&
c<
(n-k+1)){p=p->
c++;
c==(n-k+1)){cout<
date<
elsecout<
notfind"
9017:
统计选票
设有m个候选人n张选票,每张选票选且只选一人,候选人编号依次为1,2,3,...,m。
现将这n张选票存于一
单链表中,要求统计并输出每个候选人的得票结果。
有多组数据,每组第一行为候选人总数m和选票总数n(m>
0,0<
第二行为n张选票的内容。
输出每个候选人的得票结果,数字之间用一个空格隔开。
36
131221
58
33433211
321
21410
//9017ANSWERCODE1
intvotes[100],n,i,m,c;
m>
for(i=1;
=m;
i++)votes[i]=0;
{cin>
c;
votes[c]++;
}
votes[i]<
votes[m]<
9045:
判栈输出序列的有效性
ProblemDescription设一个栈的输入序列为1,2,3,...,n-1,n。
请编写一个算法,判断一个序列p1,p2,p3,...,pn是否是一个有效的栈输出序列。
若有效输出1,无效输出0。
有多组数据,每组第一行为序列长度n(n<
=50),第二行为一个由1~n值组成的长度为n且值无重复的序列。
栈输出序列有效输出1,无效输出0。
123
312
0
//9045ANSWERCODE1
intn,i,j,in,out;
//in输入序列指针,out输出序列指针
intoutput[51],stack[51],top=-1;
n){
output[i];
top=-1;
in=0;
i++){
out=output[i];
if(out>
in){
for(j=in+1;
=out;
j++)stack[++top]=j;
in=out;
if(stack[top]==output[i])top--;
0\n"
if(i==n&
top==-1)cout<
1\n"
9042:
判操作序列有效性
假设以I和O分别表示入栈和出栈操作。
栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成
的序列,称可以操作的序列为合法序列,否则成为非法序列。
请编写一个对该操作序列的有效性进行判断,若有效
,无效输出0。
输出1
有多组数据,每组为由I和O组成的序列,序列长度不超过50。
操作序列有效输出1,无效输出0。
IOIIOIOO
IOOIOIIO
//9042ANSWERCODE1
intn,i,flag;
charstr[51],stack[51],top=-1;
str)
n=strlen(str);
flag=0;
if(str[i]=='
I'
){stack[++top]=str[i];
elseif(str[i]=='
O'
)
if(top>
-1)top--;
flag=1;
if(top==-1&
i==n&
flag==0){cout<
else{if(flag==0)cout<
return