DS单链表--结点交换
Posted szu-ds-wys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 CNode { int data; CNode *next; public: CNode() { next=NULL; } CNode(int n,CNode *p) { data=n; next=p; } int getdata() { return data; } CNode *getnext() { return next; } void setnext(CNode *p) { next=p; } }; class CList { friend class CNode; CNode *head; int nodenumber; public: CList() { head=NULL; nodenumber=0; } ~CList() { for(int i=0;i<nodenumber;i++) { CNode *p=head; head=head->getnext(); delete p; } } void nodeplus() { nodenumber++; } void nodeminus() { nodenumber--; } void createTailList(int *num,int n) { CNode *tail; CNode *s; head=new CNode(); tail=head; for(int i=0;i<n;i++) { s=new CNode(num[i],NULL); tail->setnext(s); tail=s; nodeplus(); } } CNode *findreal(int i) { if(i<=0||i>nodenumber) { cout<<"error"<<endl; return NULL; } else return indexfind(i); } CNode *indexfind(int i) { if(i<0) { return NULL; } CNode *p=head; int k=1; while(k<=i&&p!=NULL) { p=p->getnext(); k++; } return p; } int Insert(int i,int num) { if(i<=0||i>nodenumber+1) { cout<<"error"<<endl; return error; } nodeplus(); CNode *p=indexfind(i-1); CNode *temp=new CNode(num,p->getnext()); p->setnext(temp); return ok; } int Delete(int i) { if(i<1||i>nodenumber) { cout<<"error"<<endl; return error; } nodeminus(); CNode *p=indexfind(i-1); CNode *temp=p->getnext(); p->setnext(temp->getnext()); delete temp; return ok; } void display() { CNode *p=head->getnext(); while(p!=NULL) { cout<<p->getdata()<<" "; p=p->getnext(); } cout<<endl; } int nodeswap(int a1,int b1) { if(a1<=0||a1>nodenumber||b1<=0||b1>nodenumber) { cout<<"error"<<endl; return error; } CNode *t1=indexfind(a1-1); CNode *t2=indexfind(b1-1); CNode *a=indexfind(a1); CNode *b=indexfind(b1); CNode *temp=b->getnext(); t1->setnext(b); b->setnext(a->getnext()); t2->setnext(a); a->setnext(temp); return ok; } }; int main() { int n; cin>>n; int *num=new int[n]; for(int i=0;i<n;i++) { cin>>num[i]; } CList L; L.createTailList(num,n); L.display(); int a,b; cin>>a>>b; if(L.nodeswap(a,b)!=error) L.display(); cin>>a>>b; if(L.nodeswap(a,b)!=error) L.display(); delete []num; return 0; }
以上是关于DS单链表--结点交换的主要内容,如果未能解决你的问题,请参考以下文章