ST数据结构作业与实验参考答案一资料Word格式.docx
- 文档编号:22920129
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:39
- 大小:27.07KB
ST数据结构作业与实验参考答案一资料Word格式.docx
《ST数据结构作业与实验参考答案一资料Word格式.docx》由会员分享,可在线阅读,更多相关《ST数据结构作业与实验参考答案一资料Word格式.docx(39页珍藏版)》请在冰豆网上搜索。
{
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);
cout<
r.area()<
}
return0;
9002:
数组的循环移位
对于一个给定的字符型数组循环左移i位,要求尽量不申请空间,实现“原地”操作。
输入的第一行为一个数字n,代表接下来有n组数据,每组数据包括2行;
每组数据中的第一行为一个字符串(长度不超过50),第二行为一个数字m,代表要左移的位数。
循环左移后的字符型数组内容。
1
abcdefgh
3
defghabc
//9002ANSWER
#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);
chara[N];
intm,n,i;
m;
while(m--)
cin>
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表的数据元素,元素之间用一个空格分隔;
13817
61015
7
1368101517
//9003ANSWER
#include<
constintMaxSize=20;
//有两个由小到大有序的有序顺序表A和B
voidcombine(intA[],intA_len,intB[],intB_len)
if((A_len+B_len)>
MaxSize)
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);
cout<
A[i]<
"
voidmain()
intA[MaxSize],B[MaxSize],A_len,B_len,n,i;
A_len;
{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
//9004ANSWER
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)
for(i=0;
len-1;
i++)cout<
}
9005:
最长相等子序列长度
给定一个有n个元素的整数数组b,b中连续的相等元素构成的子序列称为平台。
设计一个算法求b中最长平台的长度。
第一行为一个数字m,表示下面有m组数据,每组数据包括2行;
每组数据中的第一行表示数组的长度n(不会超过20,但可为空表),第二行表示数组的所有元素。
输出最长平台的长度。
8
113888887
10
113325888887
//9005ANSWER
intm,n,i,b[21],c,max;
if(n<
=0||n>
20){cout<
0\n"
b[i];
i=0;
c=max=1;
do
while((b[i]==b[i+1])&
(i<
n)){c++;
i++;
i++;
if(c>
max)max=c;
c=1;
while(i<
n);
max<
9006:
单链表的建立和遍历
输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。
输入数据有多组,每组数据占两行;
每组第一行为一个数字N(N<
=50);
第二行有N个整数。
输出这组整数,数字之间用一个空格分隔。
1232457854
//9006ANSWER
structNode{intdata;
Node*next;
intN,i,A[51];
Node*head=newNode,*p,*tail;
while(cin>
N)
if(N>
0)
N;
tail=head;
{
p=newNode;
p->
data=A[i];
tail->
next=p;
tail=p;
}
tail->
next=NULL;
p=head->
next;
N-1;
{cout<
p->
data<
p=p->
9007:
单链表按值操作
对值递增有序的单链表进行以下操作:
若表中存在值为x的结点,则将它从表中删除;
否则,就往表中插入一个值为x的结点,并保持表值递增有序的性质不变(假设表中没有值相同的元素)。
处理后若为空表则不输出。
每组数据包括3行,第一行表示单链表的长度n(不会超过50);
第二行表示单链表的所有元素;
第三行表示x值。
输出执行操作后的单链表,元素之间用一个空格分隔。
13579
1579
134579
//9007ANSWER
structNode{intdata;
Node*next;
intmain(){
inti,n,x,A[51];
Node*p,*first,*q,*r,*s;
n){
if(n==0){
cin>
x;
x<
continue;
first=newNode;
first->
s=newNode;
s->
data=x;
next=first->
first->
next=s;
elseif(n>
=1&
n<
=50){
i++){cin>
//尾插法creaLinkList
first->
r=first;
i++){
s=newNode;
s->
next=r->
r->
r=s;
//按值查找
p=first->
q=first;
while(p){
if(p->
data==x){
q->
next=p->
deletep;
break;
}
elseif(p->
x){q=p;
p=p->
data>
x){
s=newNode;
q->
break;
if(p==NULL){
q->
}
}//if
//遍历LinkList
if(first->
next){
data;
p=p->
while(p)
{cout<
//释放LinkList
p=first;
while(p){q=p->
p=q;
}
}//while
9008:
约瑟夫环问题(循环链表)
对任意n个人,密码为m,实现约瑟夫环问题。
约瑟夫环是一个数学的应用问题:
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为1的人开始报数,数到m的那个人出列;
他的下一个人又从1开始报数,数到m的那个人又出列;
依此规律重复下去,直到圆桌周围的人全部出列。
每行为一组数据,包括2个正整数n和m(n,m>
0)。
依次写出出圈的顺序,数字之间用一个空格分隔。
63
73
364251
3627514
//9008ANSWER
};
inti,j,n,m;
Node*first,*q,*p,*s,*r;
n>
m){
//构建无头结点的循环单链表
first=newNode;
first->
data=1;
r=first;
for(i=2;
=n;
{s=newNode;
s->
data=i;
r->
r=s;
next=first;
//PrintcirLinklist
//p=first->
if(first)cout<
//while(p!
=first){cout<
j=1;
q=r;
//q是p的前趋结点
while(p!
=q){
while(j<
m){q=p;
j++;
cout<
deletep;
p=q->
q->
9010:
拆分顺序表
有一顺序表A,请将其拆分成两个顺序表B和C,使A中大于0的元素存放在B中,小于或等于0的元素存放在C中。
有多组数据,每组第一行表示A表长n(0<
n<
=20);
第二行表示顺序表A的各元素。
将顺序表B和C的元素分两行输出,每行中相邻两元素之间用一个空格分隔,空表则不输出任何信息。
9
113-33-40-2632
1133632
-3-40-2
//9010ANSWER
intn,i,j,k,A[21],B[21],C[21];
n)
if(n>
0&
=20)
j=k=0;
if(A[i]>
0)B[j++]=A[i];
elseC[k++]=A[i];
if(j>
0){
j-1;
B[i]<
if(k>
k-1;
C[i]<
9012:
找唯一数
在一个表长为n的顺序表中,除一个元素之外,其余的元素都出现了两次。
请找出这个仅出现一次的元素。
有多组数据,每组第一行表示表长n(1<
=n<
=11111);
第二行表示顺序表的各元素。
输出这个唯一数。
22131
2113-123
-1
//9012ANSWER
intn,i,j,A[11112],B[11112];
=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<
9014:
删最小值
设有一单链表,现要求删除其最小值(假设最小值唯一)。
若删除成功,则输出被删的最小值;
若删除失败,则输出“notexist”。
有多组数据,每组第一行为单链表的元素个数n(0<
100);
第二行为单链表的各个元素。
426-319145
24167
-3
//9014ANSWER
Node*next;
inti,n,data[100],min;
Node*first,*p,*q,*s,*tail;
if(n==0){cout<
notexist\n"
data[i];
tail=first;
{s=newNode;
data=data[i];
tail->
tail=s;
tail->
min=first->
next->
while(p->
next)
{q=p;
if(p->
min)min=p->
p=first->
while(p)
{if(p->
data==min)break;
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ST 数据结构 作业 实验 参考答案 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)