解答第一题:链表(A卷)
题目 | #402
题目描述
运用类结构的相关知识,构造链表类,根据给定输入数据完成链表对象的构造,并重载+=运算符,完成链表对象的拼接,具体规则如下:
给定一组数,分别取其中的奇节点以及偶节点构造出两个链表对象A,B,然后将这两个链表对象使用+=运算符进行拼接,+=运算符的调用顺序取决于输入,当输入1时:运算顺序为A+=B;当输入2时:运算顺序为B+=A。+=运算符运算规则以A+=B为例说明如下:将A、B链表节点交叉构造出一个新链表,存于A,如果A链表为空链表,则A+=B的结果链表与B相同。最后,将链表A、B以及+=运算后的结果链表输出。
注:奇节点和偶节点指的是节点位置编号的奇偶性,而不是节点的值的奇偶性,例如:输入的第一个数据节点位置编号为1,是奇节点。
链表结构可参考:
class List{
public:
Node* head;
Node* tail;
List(){head=NULL;};
List(int[] a,bool case);//根据给定输入数组构造链表,case为真时取奇节点构造链表,为假时取偶节点构造链表
void Insert(int n);//插入节点
void Print();//打印链表的数据项
};
注:必须实现链表结构,以及链表节点的插入等操作,否则计0分。
输入
第一行两个整数N和K,代表有N组测试数据,紧接着是K代表行为,值为1或2,接下来的N行每行第一个数为链表节点个数M,接下来为M个节点。
输出
每组测试数据输出规则如下:
输出奇节点构造的链表,输出偶节点构造的链表,输出使用+=运算符拼接后的链表
一个链表的输出占用一行,链表中相邻元素之间使用空格隔开,最后一个节点后没有空格
各组测试数据输出之间相隔一行,最后一组测试数据之后也需要添加空行
说明:当链表为空链表时,输出“NULL”字符串,特殊case如下:
-
当输入链表节点个数为0时,该组测试数据按规则需要输出三个NULL
-
当输入链表节点个数为1时,按规则只能构造出一个链表,但还是需要进行+=运算符的调用,输出链表A,NULL,以及运算后的结果链表
样例输入
5 1
0
1 1
2 1 2
3 1 5 8
4 1 8 34 67
样例输出
NULL
NULL
NULL
1
NULL
1
1
2
1 2
1 8
5
1 5 8
1 34
8 67
1 8 34 67
解答 (PE):
#include<iostream>
using namespace std;
class Node{
public:
int num;
Node* next;
Node(int n){
num=n;
next=NULL;
}
};
class List{
public:
Node* head;
Node* tail;
int nodecount;
void Insert(int n){
Node* tmp=new Node(n);
if(head==NULL){
head=tail=tmp;
nodecount++;
}
else {
tail->next=tmp;
tail=tmp;
nodecount++;
/*Node* curr=head;
while(curr->next!=NULL){
if((curr->num<=n)&&(curr->next->num>n)){
tmp->next=curr->next;
curr->next=tmp;
nodecount++;
}
curr=curr->next;
}*/
}
}
List(int*a,bool Case,int num){
head=tail=NULL;
nodecount=0;
if(Case){
if(num==0){}
else{
for(int i=0;i<num;i=i+2){
Insert(a[i]);
}
}
}
else{
if(num==0||num==1){}
else{
for(int i=1;i<num;i=i+2){
Insert(a[i]);
}
}
}
}
List(){
head=tail=NULL;
nodecount=0;
}
friend List operator+=(List a,List b){
List final;
if(a.nodecount==0)return b;
else if(b.nodecount==0)return a;
else{
Node* curra=a.head;
Node* currb=b.head;
final.Insert(curra->num);
final.Insert(currb->num);
for(;;){
if(curra->next!=NULL){curra=curra->next;final.Insert(curra->num);}
else{};
if(currb->next!=NULL){currb=currb->next;final.Insert(currb->num);}
else{};
if(curra->next==NULL&&currb->next==NULL)break;
}
return final;
}
}
void Print(){
if(nodecount==0)cout<<"NULL";
else{
Node* curr=head;
cout<<curr->num<<" ";
while(curr->next!=NULL){
curr=curr->next;
cout<<curr->num<<" ";
}
}
}
};
int main(){
//第一行两个整数N和K,代表有N组测试数据,紧接着是K代表行为,值为1或2,
//接下来的N行每行第一个数为链表节点个数M,接下来为M个节点。
int N,K;
cin>>N>>K;
int* M=new int[N];
int k[100][100];
for(int i=0;i<N;i++){
cin>>M[i];//存放链表节点个数
for(int j=0;j<M[i];j++){
cin>>k[i][j];//k[N][M]
}
}
for(int i=0;i<N;i++){
List a(k[i],1,M[i]);
a.Print();
cout<<endl;
List b(k[i],0,M[i]);
b.Print();
cout<<endl;
if(K==1){//K:当输入1时:运算顺序为A+=B;当输入2时:运算顺序为B+=A
(a+=b).Print();
}
else (b+=a).Print();
cout<<endl<<endl;
}
}
本人水平有限,分享仅为学弟学妹提供真题。