实现将两段递增有序链表合并为一段递减有序链表时出现的错误.
代码如下:
//头文件
#ifndef LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED
#define LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED
using namespace std;
template<class T>
class LinkNode//节点类
{
public:
T data;//数据域
LinkNode<T> *next;//指针域
LinkNode(T data = 0)
{
this->data = data;
this->next = NULL;
}
};
template<class T>
class Link//链表类模板(该链表无头节点)
{
private:
int Size;
public:
LinkNode<T> *head;
LinkNode<T> *tail;
Link(int Size = 0)
{
this->head = NULL;
this->tail = NULL;
this->Size = 0;
}
void push(T data)//输入数据
{
LinkNode<T> *x = new LinkNode<T>(data);
if(tail == NULL)
{
head = tail = x;
}
else
{
tail->next = x;//尾节点后再加一位使之成为新的尾结点.
tail = x;//让原来的尾结点成为新的数据存储点.
}
Size += 1;
}
void print()//输出链表
{
LinkNode<T> *p = this->head;
for(;p!=tail;p = p->next)
{
cout << p->data;
}
cout << tail->data;
cout << endl;
cout<<"链表输出完毕。"<<endl;
}
LinkNode<T>* AddOfHead();//返回头节点地址
LinkNode<T>* AddOfTail();//返回尾结点地址
void upsidedown();//链表倒置
void FunForLink(Link<T> *a,Link<T> *b,Link<T> *New);//将两个元素递减有序的链表整合为一个递减有序的链表
};
template<class T>
LinkNode<T>* Link<T> :: AddOfHead()
{
return this->head;
}
template<class T>
LinkNode<T>* Link<T> :: AddOfTail()
{
return this->tail;
}
template<class T>
void Link<T> :: upsidedown()//链表倒置
{
LinkNode<T> *a = tail;
LinkNode<T> *p;
while(tail != head)
{
for(p = head;p->next!= tail;p = p->next)
{
;//每一次循环都是查找当前tail节点的前一位
}
tail->next = p;//这一步是让tail的后继指针域指向p所指向的节点.
tail=p;//让tail指向原来的它所指向的已经变化过的下一位节点.
}
head = a;
}
template<class T>
void Link<T> :: FunForLink(Link<T> *a,Link<T> *b,Link<T> *New)//将两个的递减有序的链表整合为一个递减有序的链表
{
LinkNode<T>* tempa=new LinkNode<T>();
LinkNode<T>* tempb=new LinkNode<T>();
tempa=a->head;
tempb=b->head;
//cout<<tempa->data<<endl;
//cout<<a->head->data<<endl;
if(tempa->data==tempb->data)
{
New->push(tempa->data);
tempa=tempa->next;
}
else
{
New->push(tempb->data);
tempb=tempb->next;
}
while(tempa!=NULL||tempb!=NULL)
{
if(tempa->data==NULL)
{
while(tempb!=NULL)
{
New->push(tempb->data);
tempb=tempb->next;
}
}
else if(tempb==NULL)
{
while(tempa!=NULL)
{
New->push(tempa->data);
tempa=tempa->next;
}
}
else if(tempa->data>=tempb->data)
{
New->push(tempa->data);
tempa=tempa->next;
}
else if(tempa->data<tempb->data)
{
New->push(tempb->data);
tempb=tempb->next;
}
}
delete tempa;
delete tempb;
}
#endif // LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED
以下是实现.
#include<iostream>
#include"LinkAndLinknodeOfIntForHomework.h"
using namespace std;
int main()
{
Link<int> *a=new Link<int>(0);
Link<int> *b=new Link<int>(0);
int lenofa=0;
int lenofb=0;
Link<int> *newlink=new Link<int>(0);
cout<<"请输入"<<endl;
cout<<"①a链表(递增有序)的长度:"<<endl;
cin>>lenofa;
int sta=lenofa;
while(lenofa!=0)
{
int tempa=0;
cout<<"请输入第"<<sta-lenofa+1<<"个数字"<<endl;
cin>>tempa;
a->push(tempa);
lenofa--;
}
a->upsidedown();
cout<<"②b链表(递增有序)的长度:"<<endl;
cin>>lenofb;
int stb=lenofb;
while(lenofb!=0)
{
int tempb=0;
cout<<"请输入第"<<stb-lenofb+1<<"个数字"<<endl;
cin>>tempb;
b->push(tempb);
lenofb--;
}
b->upsidedown();
cout<<"接下来开始执行主程序:"<<endl;
newlink->FunForLink(a,b,newlink);
cout<<newlink->head->data;
return 1;
}
运行窗口:
求大佬指点迷津.