求单链表的数据交换解决思路
求单链表的数据交换
实现单链表内的元素交换操作,注意元素交换不是交换两个元素内的数据,而是整个元素的交换位置。
所以程序要实现链表结点的指针修改,而不是结点内的数据交换。
Input
第一行输入n表示顺序表包含的·n个数据
第二行输入n个数据,数据是小于100的正整数
第三行输入两个参数,表示要交换的两个位置,这里是执行第1次交换
第四行输入两个参数,表示要交换的两个位置,这里是执行第2次交换
Output
第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开
第二行输出执行第1次交换操作后,顺序表内的所有数据,数据之间用空格隔开
第三行输出执行第2次交换操作后,顺序表内的所有数据,数据之间用空格隔开
注意加入交换位置的合法性检查,如果发现位置不合法,输出error。
Sample Input
5
11 22 33 44 55
1 4
2 6
Sample Output
11 22 33 44 55
44 22 33 11 55
error
------解决方案--------------------
#include <iostream.h>
#include <stdlib.h>
template <class T>
class linkNode
{ //结点类
public:
T data;
linkNode *link;
linkNode(linkNode *ptr)
{
link=ptr;
}
linkNode()
{
link = NULL;
}
};
template <class T>
class list:public linkNode<T>
{
public:
list();
linkNode<T> *locate(int i);
int lenght()const;
void input();
void output();
void change(int a,int b);
private:
linkNode<T> *first,*current;
};
template <class T>
void list<T>::output()
{
current=first->link;
while (current->link!=NULL)
cout<<current->data<<' ';
}
template <class T>
list<T>::list()
{
first=current=new linkNode<T>;
first->link=NULL;
current=first;
}
template <class T>
int list<T>::lenght()const{
int count=0;
linkNode<T> *chaxun;
chaxun=new linkNode<T>;
chaxun=first->link;
while(chaxun !=NULL)
{
count++;
}
return count;
};
template<class T>
linkNode<T> *list<T>::locate(int i){
if (i<0)
return NULL;
linkNode<T> *a=first;
int k=0;
while (a!=NULL && k<i)
{
a=a->link;
k++;
}
return a;
};
template <class T>
void list<T>::input(){
linkNode<T> *newNode;
newNode = new linkNode<T>;
if(newNode==NULL){
cerr<<"存储分配错误"<<endl;
exit(1);
}
cin>>newNode->data;
newNode->link=current->link;
current->link=newNode;
};
template <class T>
void list<T>::change(int a,int b)
{
int count=lenght();
if (a<1 || b>count || a>b)
{
cerr<<"交换有误";
exit(1);
}
linkNode<T> *srt,*ptr,*p,*q,*qian,*hou;
qian=locate(a-1);
hou=locate(b-1);
p=srt=locate(a);
q=ptr=locate(b);
qian->link=q;
q->link=p->link;
hou->link=srt;
srt=ptr->link;
};
void main()
{
int n,a,w;
list<int> arrary;
cout<<"请输入N的大小";
cin>>n;
for (int i=0;i<n;i++)
{
arrary.input();
}
cout<<"请输入要交换的顺序位置:";
实现单链表内的元素交换操作,注意元素交换不是交换两个元素内的数据,而是整个元素的交换位置。
所以程序要实现链表结点的指针修改,而不是结点内的数据交换。
Input
第一行输入n表示顺序表包含的·n个数据
第二行输入n个数据,数据是小于100的正整数
第三行输入两个参数,表示要交换的两个位置,这里是执行第1次交换
第四行输入两个参数,表示要交换的两个位置,这里是执行第2次交换
Output
第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开
第二行输出执行第1次交换操作后,顺序表内的所有数据,数据之间用空格隔开
第三行输出执行第2次交换操作后,顺序表内的所有数据,数据之间用空格隔开
注意加入交换位置的合法性检查,如果发现位置不合法,输出error。
Sample Input
5
11 22 33 44 55
1 4
2 6
Sample Output
11 22 33 44 55
44 22 33 11 55
error
------解决方案--------------------
#include <iostream.h>
#include <stdlib.h>
template <class T>
class linkNode
{ //结点类
public:
T data;
linkNode *link;
linkNode(linkNode *ptr)
{
link=ptr;
}
linkNode()
{
link = NULL;
}
};
template <class T>
class list:public linkNode<T>
{
public:
list();
linkNode<T> *locate(int i);
int lenght()const;
void input();
void output();
void change(int a,int b);
private:
linkNode<T> *first,*current;
};
template <class T>
void list<T>::output()
{
current=first->link;
while (current->link!=NULL)
cout<<current->data<<' ';
}
template <class T>
list<T>::list()
{
first=current=new linkNode<T>;
first->link=NULL;
current=first;
}
template <class T>
int list<T>::lenght()const{
int count=0;
linkNode<T> *chaxun;
chaxun=new linkNode<T>;
chaxun=first->link;
while(chaxun !=NULL)
{
count++;
}
return count;
};
template<class T>
linkNode<T> *list<T>::locate(int i){
if (i<0)
return NULL;
linkNode<T> *a=first;
int k=0;
while (a!=NULL && k<i)
{
a=a->link;
k++;
}
return a;
};
template <class T>
void list<T>::input(){
linkNode<T> *newNode;
newNode = new linkNode<T>;
if(newNode==NULL){
cerr<<"存储分配错误"<<endl;
exit(1);
}
cin>>newNode->data;
newNode->link=current->link;
current->link=newNode;
};
template <class T>
void list<T>::change(int a,int b)
{
int count=lenght();
if (a<1 || b>count || a>b)
{
cerr<<"交换有误";
exit(1);
}
linkNode<T> *srt,*ptr,*p,*q,*qian,*hou;
qian=locate(a-1);
hou=locate(b-1);
p=srt=locate(a);
q=ptr=locate(b);
qian->link=q;
q->link=p->link;
hou->link=srt;
srt=ptr->link;
};
void main()
{
int n,a,w;
list<int> arrary;
cout<<"请输入N的大小";
cin>>n;
for (int i=0;i<n;i++)
{
arrary.input();
}
cout<<"请输入要交换的顺序位置:";