【数据结构】问题 C: DS单链表--结点交换

【数据结构】问题 C: DS单链表–结点交换

题目描述

用C++实现含头结点的单链表,然后实现单链表的两个结点交换位置。

注意不能简单交换两个结点包含数据,必须通过修改指针来实现两个结点的位置交换

交换函数定义可以参考:

swap(int pa, int pb) //pa和pb表示两个结点在单链表的位置序号

swap (ListNode * p, ListNode * q) //p和q表示指向两个结点的指针

输入

第1行先输入n表示有n个数据,接着输入n个数据

第2行输入要交换的两个结点位置

第3行输入要交换的两个结点位置

输出

第一行输出单链表创建后的所有数据,数据之间用空格隔开

第二行输出执行第1次交换操作后的单链表数据,数据之间用空格隔开

第三行输出执行第2次交换操作后的单链表数据,数据之间用空格隔开

如果发现输入位置不合法,输出字符串error,不必输出单链表

-----------------

样例输入
5 11 22 33 44 55
1 4
2 6
样例输出
11 22 33 44 55
44 22 33 11 55
error

代码

#include <iostream>
using namespace std;
#define ok 0
#define error -1

class Node{
public:
	int data;
	Node *next;
	Node() {next = NULL;}
};

class LinkList{
public:
	Node *head;
	int len;
	
	LinkList(){
		head = new Node();
		head->next = NULL;
		len=0;
	}
	
	~LinkList(){
		Node *p;
		while(head){
			p=head;
			head=head->next;
			delete p;
		}
	}

	int LL_create(int n){//向新建的链表插入n个数据 
		int item;
		len+=n;
		Node *p=head;
		while(p->next){
			p=p->next;
		}
		
		while(n--){
			cin>>item;
			Node *q=new Node;
			q->data=item;
			q->next=NULL;
			p->next=q;		
			p=q;
		}
	}
	
	

	void LL_display(){
		Node *p=head->next;
		while(p){
			cout<<p->data<<" ";
			p=p->next;
			
		}
		cout<<endl;
	}
	
	int swap(int pa,int pb){
		if((pa<=0 || pa>len) || (pb<=0 || pb>len)){	
			return error;
		} 
		
		Node *a,*a_prev,*a_next,*b,*b_prev,*b_next;
		Node *p=head->next;
		if(pa==1){
			int j=0;
			while(j<pb-1){
				b_prev=p;
				p=p->next;
				j++;
			}
			b=p;
			b_next=b->next;
			a=head->next;
			a_next=a->next;
			
			a->next=b_next;
			b_prev->next=a;
			
			b->next=a_next;
			head->next=b;
			
			return ok;
		}
		else{	
			int j=0;
			while(j<pa-1){
				a_prev=p;
				p=p->next;
				j++;
			}
			a=p;
			a_next=a->next;
			
			j=0;
			p=head->next;
			while(j<pb-1){
				b_prev=p;
				p=p->next;
				j++; 
			}
			b=p;
			b_next=b->next;
			
			b->next=a_next;
			a_prev->next=b;
			a->next=b_next;
			b_prev->next=a;
			return ok;
		}
	}

};

 
int main(){
	int n,pos1,pos2;
	LinkList L;
	
	cin>>n;
	L.LL_create(n);
	L.LL_display();
	
	cin>>pos1>>pos2;
	if( L.swap(pos1,pos2)==-1)
		cout<<"error"<<endl;
	else L.LL_display();
	
	cin>>pos1>>pos2;
	if( L.swap(pos1,pos2)==-1)
		cout<<"error"<<endl;
	else L.LL_display();
	
	return 0;
}











  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值