我编写一个将两个有序单链表归并为一个有序单链表的程序,但是归并后得到的单链表总是莫名其妙地在前面多了两个空的节点
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode* next;
}LNode;
int main()
{
void createlist(LNode*&, int);
void mergelist(LNode*, LNode*, LNode*&);
void printlist(LNode*);
LNode* a, * b, * c;
int n1, n2;
cout << "Please enter the length of the first linked list:";
cin >> n1;
createlist(a, n1);
printlist(a);
cout << "Please enter the length of the second linked list:";
cin >> n2;
createlist(b, n2);
printlist(b);
mergelist(a, b, c);
printlist(c);
return 0;
}
void createlist(LNode*& a, int n)
{
LNode* p;
a = (LNode*)malloc(sizeof(LNode));
p = (LNode*)malloc(sizeof(LNode));
a->next = p;
cout << "Please enter the elements of the linked list one by one in an increasing order:";
for (int i = 0; i < n; i++)
{
cin >> p->data;
if (i < n - 1)
{
p->next = (LNode*)malloc(sizeof(LNode));
p = p->next;
}
}
p->next = NULL;
return;
}
void mergelist(LNode* a, LNode* b, LNode*& c)
{
LNode* p;
c = (LNode*)malloc(sizeof(LNode));
p = (LNode*)malloc(sizeof(LNode));
c->next = p;
while (a != NULL || b != NULL)
{
if (a == NULL)
{
p->data = b->data;
b = b->next;
}
else
{
if (b == NULL)
{
p->data = a->data;
a = a->next;
}
else
{
if (a->data < b->data)
{
p->data = a->data;
a = a->next;
}
else
{
p->data = b->data;
b = b->next;
}
}
}
if (a != NULL || b != NULL)
{
p->next= (LNode*)malloc(sizeof(LNode));
p = p->next;
}
}
p->next = NULL;
return;
}
void printlist(LNode* a)
{
a = a->next;
while (a)
{
cout << a->data;
if (a->next)
{
cout << " -> ";
}
a = a->next;
}
cout << endl;
return;
}
Please enter the length of the first linked list:8
Please enter the elements of the linked list one by one in an increasing order:1 3 5 9 12 15 16 21
1 -> 3 -> 5 -> 9 -> 12 -> 15 -> 16 -> 21
Please enter the length of the second linked list:8
Please enter the elements of the linked list one by one in an increasing order:3 6 8 9 10 15 19 24
3 -> 6 -> 8 -> 9 -> 10 -> 15 -> 19 -> 24
-842150451 -> -842150451 -> 1 -> 3 -> 3 -> 5 -> 6 -> 8 -> 9 -> 9 -> 10 -> 12 -> 15 -> 15 -> 16 -> 19 -> 21 -> 24
能不能指点一下我的程序哪里出了问题?
我知道为什么了,多出来的两个结点是待归并链表的头结点
因为你在创建 a、b 两个链表时它的头结点就是的 data 就没有赋值
createlist 里面(包括 mergelist 也是)
a = (LNode*)malloc(sizeof(LNode));
p = (LNode*)malloc(sizeof(LNode));
a->next = p;
a就是这个链表的头结点,但是没有赋值data
而你的打印链表的函数 printlist 里面直接就是 a = a->next; 跳过头结点,所以单独打印两个链表没有问题,而合并后打印出来就是把那两个没赋值的头结点打印出来了。