帮我看看这个将两个有序单链表合并的程序,好像有逻辑错误

帮我看看这个将两个有序单链表合并的程序,好像有逻辑错误,解释结果输出不来,请哪位高手帮我指正一下了~万分感激~主要帮我看一下formalMerge这个函数,我感觉有点问题... 帮我看看这个将两个有序单链表合并的程序,好像有逻辑错误,解释结果输出不来,请哪位高手帮我指正一下了~万分感激~
主要帮我看一下 formalMerge 这个函数,我感觉有点问题~
#include<iostream.h>

class IntSLLNode {//链表节点类的定义
public:
int info;//节点储存的数值
IntSLLNode *next;//此节点的下一个节点
IntSLLNode(int el, IntSLLNode *ptr = 0){//节点类的构造函数,实现的是传递两个参数,一个是本节点
//的数值,另一个是下一个节点置空
info = el;
next = ptr;
}
};

class IntSLList {//链表类本身的定义
public:
IntSLList() {//定义链表的无参构造函数,功能是置head,tail节点初始化为0;
head = 0;
tail = 0;
}
//~IntSLList();//定义析构函数
int isEmpty() {//判断链表是否为空,在类内定义好了,内联函数
return head == 0;//判断head是否为0,若是则返回为真,否则为假
}
void addToHead(int);//申明在链表头部插入一个元素
void addToTail(int);//申明在链表尾部后面插入一个元素
int deleteFromHead();//删除第一个元素
int deleteFromTail();//删除最后一个元素
void deleteNode(int);//删除某个特定的节点
bool isInList(int) const;//to determine whether the node is in the list
void outputList();//按顺序输出当前链表的所有元素
void formalMerge(IntSLList list1, IntSLList list2, IntSLList list3);//参数为两个有序的链表
private:
IntSLLNode *head,*tail;
};

void IntSLList::addToTail(int el) {//往尾部添加一个元素el
if(tail != 0) {//如果原链表不为空的话
tail->next = new IntSLLNode(el);//生成一个新节点作为原先tail节点的后继元素,后继节点默认置空
tail = tail->next;//把尾指针移到最后一个元素上面
}
else
head = tail = new IntSLLNode(el);//如果原来的链表为空的话,则
}

void IntSLList::outputList() {
for(IntSLLNode *tmp = head; tmp != 0; tmp = tmp->next)
cout<<tmp->info<<",";
cout<<endl;
}

void IntSLList::formalMerge(IntSLList list1, IntSLList list2, IntSLList list3) {
IntSLLNode *p = list1.head;
IntSLLNode *q = list2.head;
while((p != 0) && (q != 0)) {
if(p->info == q->info) {
list3.addToTail(p->info);
list3.addToTail(q->info);
p = p->next;
q = q->next;
}
else if(p->info < q->info) {
list3.addToTail(p->info);
p = p->next;
}
else if(p->info > q->info) {
list3.addToTail(q->info);
q = q->next;
}
if(p != 0) {
list3.addToTail(p->info);
p = p->next;
}
else if(q != 0) {
list3.addToTail(q->info);
q = q->next;
}
}

}

void main()
{
IntSLList list1, list2, list3, list4;
list1.addToTail(1);
list1.addToTail(3);
list1.addToTail(5);
list1.addToTail(7);
list2.addToTail(2);
list2.addToTail(4);
list2.addToTail(6);
list2.addToTail(8);
list1.outputList();
list4.formalMerge(list1, list2, list3);
list3.outputList();

}
展开
 我来答
luyi_happy
2008-07-29 · 超过31用户采纳过TA的回答
知道答主
回答量:110
采纳率:0%
帮助的人:71.7万
展开全部
帮你改了, 自己调试下, 应该没问题!
void IntSLList::formalMerge(IntSLList list1, IntSLList list2 ) {
IntSLLNode *p = list1.head;
IntSLLNode *q = list2.head;
IntSLList list3;

while((p != 0) && (q != 0)) {
if(p->info == q->info) {
list3.addToTail(p->info);
list3.addToTail(q->info);
p = p->next;
q = q->next;
}
else if(p->info < q->info) {
list3.addToTail(p->info);
p = p->next;
}
else if(p->info > q->info) {
list3.addToTail(q->info);
q = q->next;
}
//当一个链表已经到尾部了,处理另一个链表剩下的数据
while(p == 0 && q!=0 ) {
list3.addToTail(q->info);
q = q->next;
}
while(q == 0 && p!=0 ) {
list3.addToTail(p->info);
p = p->next;
}
}
head = list3.head; //将头指针指向新链表
tail = list3.tail; //该句写不写无所谓的,只是为了突出尾巴:)
}

int main()
{
IntSLList list1, list2, list3, list4;
list1.addToTail(1);
list1.addToTail(3);
list1.addToTail(5);
list1.addToTail(7);
list2.addToTail(2);
list2.addToTail(4);
list2.addToTail(6);
list2.addToTail(8);
list1.outputList();
list3.formalMerge(list1, list2);
list3.outputList();
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式