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单链表--结点交换的主要内容,如果未能解决你的问题,请参考以下文章

DS单链表--类实现

单链表反转

链表习题-寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下

链表结点的交换

单链表冒泡排序(交换节点)

1.7交换链表中的相邻节点