数据结构,C++,链表问题
设计一个算法:实现两个非递减的线性表的合并,采用链式存储结构,能够输出合并前和合并后链表的内容。
那要是不用运算符重载的话,要怎么实现合并啊?
“jiedian.h”
template<class T>
class LinList;
template<class T>
class ListNode{
private:
ListNode<T> *next;
T data;
public:
friend class LinList<T>;
ListNode(ListNode<T> *n=NULL){next=n;};
ListNode(T &d,ListNode<T> *n=NULL){next=n;data=d;};
~ListNode(){};
};
“lianbiao.h”
#include"jiedian.h"
template<class T>
class LinList{
private:
ListNode<T> *head;
int size;
ListNode<T> *Index(int i);
public:
LinList();
LinList(LinList<T> &list);
~LinList();
int Size();
T GetData(int i);
void OrderInsert(T x);
LinList<T> &operator=(LinList<T>&s);
void Link(LinList<T> list1,LinList<T> list2,LinList<T> &list3);
};
template<class T>
ListNode<T>*LinList<T>::Index(int i){
if(i<-1||i>size-1){
cout<<"参数i出界"<<endl;
exit(0);}
if(i==-1)return head;
ListNode<T> *p=head->next;
int j=0;
while(p!=NULL&&j<i)
{
p=p->next;
j++;}
return p;
}
template<class T>
LinList<T>::LinList(){
head=new ListNode<T>();
size=0;
}
template<class T>
LinList<T>::LinList(LinList<T> &list){
head=new ListNode<T>();
ListNode<T> *p,*q;
p=list.head->next;
q=head;
while(p)
{
ListNode<T> *n=new ListNode<T>(p->data,q->next);
p=p->next;
q->next=n;
q=n;
}
size=list.size;
}
template<class T>
LinList<T>::~LinList(){
ListNode<T> *p,*q;
p=head;
while(p!=NULL){
q=p;
p=p->next;
delete q;}
size=0;
head=NULL;
}
template <class T>
int LinList<T>::Size ()
{
return size;
}
template<class T>
T LinList<T>::GetData(int i){
if(i<0||i>size-1){
cout<<"参数i出界"<<endl;
exit(0);
}
ListNode<T> *p=Index(i);
return p->data;
}
template<class T>
void LinList<T>::OrderInsert(T x){
ListNode<T> *a,*b;
a=head->next;
b=head;
while(a!=NULL&&a->data<=x){
b=a;
a=a->next;}
ListNode<T> *q=new ListNode<T>(x,b->next);
b->next=q;
size++;
}
template<class T>
LinList<T>& LinList<T>::operator=(LinList<T>&s)
{
head=new ListNode<T>();
ListNode<T>*p,*q;
p=s.head->next;
q=head;
while(p)
{
ListNode<T> *n=new ListNode<T>(p->data,q->next);
p=p->next;
q->next=n;
q=n;
}
size=s.size;
return *this;
}
template<class T>
void LinList<T>::Link(LinList<T> list1,LinList<T> list2,LinList<T> &list3)
{
T x;
list3=list1;
for(int i=0;i<list2.Size();i++){
x=list2.GetData(i);
list3.OrderInsert(x);
}
for(int m=0;m<list3.Size();m++)
cout<<list3.GetData(m)<<" ";
};
“源.cpp”
#include<iostream>
#include<stdlib.h>
using namespace std;
#include"lianbiao.h"
void main(){
LinList<int>mylist1,mylist2,mylist3;
int p,q,x;
int a[10],n=5;
int b[10],m=5;
cout<<"链表1:"<<endl;
for(int i=0;i<n;i++){
cout<<"请输入第"<<i+1<<"个数据:";
cin>>x;
a[i]=x;}
cout<<"链表1已经建成!"<<endl;
for(int i=0;i<n;i++){
mylist1.OrderInsert(a[i]);}
cout<<"链表1输出为:";
for(int i=0;i<mylist1.Size();i++){
p=mylist1.GetData(i);
cout<<p<<" ";}
cout<<endl;
cout<<endl;
cout<<"链表2:"<<endl;
for(int i=0;i<m;i++){
cout<<"请输入第"<<i+1<<"个数据:";
cin>>x;
b[i]=x;}
cout<<"链表2已经建成!"<<endl;
for(int j=0;j<m;j++)
mylist2.OrderInsert(b[j]);
cout<<"链表2输出为:";
for(int j=0;j<mylist2.Size();j++){
q=mylist2.GetData(j);
cout<<q<<" ";}
cout<<endl;
cout<<endl;
cout<<"合并后链表输出为:";
mylist2.Link(mylist1,mylist2,mylist3);
}