NKU C++ 高级语言程序设计2-2上机考试 第一题:链表(A卷)

解答第一题:链表(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如下:

  1. 当输入链表节点个数为0时,该组测试数据按规则需要输出三个NULL

  2. 当输入链表节点个数为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;
	}

	

}

本人水平有限,分享仅为学弟学妹提供真题。 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值