第一次上机一共四道题,话不多说上题
第一题
输入第1行为1个正整数 n,表示当前单链表长度;第2行为 n 个空格间隔的整数,为该链表 n 个元素的数据域值。第3行为1个正整数 m,表示对该链表施加的操作数量;接下来 m 行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第 k 个结点后插入一个数据域值为 d 的结点,若 k = 0则表示表头插入。1 k表示删除链表中第 k 个结点,此时 k 不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n 和 m 不超过100000。
输出为一行整数,表示实施上述 m 个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。
输入样例:
5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0
1 6
输出样例:
7 1 2 8 3 5
先上代码
#include
using namespace std;
struct A{
int x;
struct A* next;
};
int main(){
A *head,*p,*current;
head=new A;
head->next=NULL;
p=head;
int n;
cin>>n;
int i=0;
while(inext=new A;
p=p->next;
p->next=NULL;
cin>>p->x;
i++;
}
int m;//对链表施加操作数量
cin>>m;
int j=0;
int a,b,c;
while(jnext;
cin>>a;
j++;
if(a==0){
cin>>b>>c;
if(b>n||b<0) continue;
else if(b==0){
p=new A;
p->x=c;
current=head->next;
head->next=p;
p->next=current;
n+=1;
continue;
}
else {
for(int k=0;knext;
}
p=new A;
p->x=c;
p->next=current->next;
current->next=p;
n+=1;
continue;
}
}//在第b个结点后插入数值为c的结点
else if(a==1){
cin>>b;
if(b<=0||b>n) continue;
current=head->next;
for(int k=0;knext;
}
if(b==n){
current->next=NULL;
n-=1;
continue;
}
else if(b==1){
head->next=current->next;
n-=1;
continue;
}
else{
p=current->next;
current->next=p->next;
n-=1;
}
}//删除第b个结点
else
continue;
}
current=head->next;
while(current!=NULL){
cout<x<<' ';
current=current->next;
}
return 0;
}
写的时候没分函数一口气写下来的
要写这道题首先要回链表,放上我的个人创建链表方式,应该是市面上流传的链表方式里面最简单的了,从cprimerplus学来的
#include
using namespace std;
struct A{
int x;
struct A* next;
};
int main() {
A* p;
A *head=NULL,*current;//head哨位结点,current当前节点
head=new A;//为head开辟空间
head->next=NULL;//空链表哨位结点下一项为空
p=head;//p为创建链表而设
int a;//输入总数据项数量
cin>>a;//输入所读入数据项数量
int i=0;//计数器
while(inext=new A;
p=p->next;
p->next=NULL;
cin>>p->x;
i++;
}//创建链表
return 0;
}
这段单纯是创链表,我的current是当前操作结点位置,这个简单的创建思路代码里面不涉及其他操作所以没用上。
下面讲具体实现细节。
首先head是一个哨位结点(不包含数据项),为方便链表创立操作而建
先给head空间,next为空
然后爱建几个建几个,记住最后为空就行
看图咋也想明白了,不行私信我。
然后这题先读入链表长度,然后读入链表元素建链表,读入操作数,在分别处理每行的操作(一行一组操作数)
写个if判断一下,然后读入,然后分别处理,注意判断操作数是否非法,注意插入的时候头节点要特殊处理,删除首尾都要做特殊处理。
然后是栈和队列两道题,赶ddl我就用数组糊弄了,以后再更正经版本
上题
2.栈
给定一个初始为空的栈和一系列压栈、弹栈操作,请编写程序输出每次弹栈的元素。栈的元素值均为整数。
输入第1行为1个正整数 n,表示操作个数;接下来 n 行,每行表示一个操作,格式为1 d 或0。1 d 表示将整数 d 压栈,0表示弹栈。n 不超过20000。
按顺序输出每次弹栈的元素,每个元素一行。若某弹栈操作不合法(如在栈空时弹栈),则对该操作输出 invalid。
输入样例:
7
1 1
1 2
0
0
0
1 3
0
输出样例:
2
1
invalid
3
#include
using namespace std;
int main() {
int a,d,n,*c=new int[20000];
cin>>n;
int j=-1;
for(int i=0;i>a;
if(a==1){
cin>>d;
c[++j]=d;
}
if(a==0){
if(j==-1)
cout<<"invalid"<
3.队列
给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。
输入第1行为1个正整数 n,表示操作个数;接下来 n 行,每行表示一个操作,格式为1 d或0。1 d表示将整数 d 入队,0表示出队。n 不超过20000。
按顺序输出每次出队的元素,每个元素一行。若某出队操作不合法(如在队列空时出队),则对该操作输出 invalid。
输入样例:
7
1 1
1 2
0
0
0
1 3
0
输出样例:
1
2
invalid
3
/**************在此输入您的代码*****************/
#include
using namespace std;
int main() {
int a,d,n,*c=new int[20000];
cin>>n;
int j=-1;
int k=0;
for(int i=0;i>a;
if(a==1){
cin>>d;
c[++j]=d;
}
if(a==0){
if(k==(j+1))
cout<<"invalid"<
4.特殊约瑟夫(我改了一个数组模拟的代码)
编号为1…N的N个小朋友玩游戏,他们按编号顺时针围成一圈,从第一个人开始按逆时针次序报数,报到第M个人出列;然后再从下个人开始按顺时针次序报数,报到第 K 个人出列;再从下一个人开始按逆时针次序报数,报到第 M 个人出列;再从下个人开始按顺时针次序报数,报到第K个人出列……以此类推不断循环,直至最后一人出列。请编写程序按顺序输出出列人的编号。
输入为3个正整数,分别表示 N、M、K,均不超过1000
输出为一行整数,为出列人的编号。每个整数后一个空格。
输入样例:
6 3 5
输出样例:
5 3 1 2 4 6
#include
using namespace std;
int main(){
int n, m, k;
int q[1000];
cin>>n>>m>>k;
int i,j;
for(i=1;i<=n;i++)
q[i]=i;
int t=1,r=m,s1,s2;
s1=1;
s2=-1;
for(j=0;jn)s1=1;
if(q[s1]!=0)t++;
}
cout<