为什么我的链表在mergelist的循环体中会不断循环?这是什么原因?
#include
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
} LNode;
void createlistR(LNode *&L, LNode *&P)
{
int i;
LNode *s, *t;
P, L = (LNode *)malloc(sizeof(LNode));
L->next, P->next = NULL;
s = L;
for (i = 0; i < 10; i++)
{
t = (LNode *)malloc(sizeof(LNode));
t->data = 2 * i + 1;
s->next = t;
s = t;
}
s->next = NULL;
s = P;
for (i = 0; i < 10; i++)
{
t = (LNode *)malloc(sizeof(LNode));
t->data = 3 * i + 1;
s->next = t;
s = t;
}
s->next = NULL;
}
void createlistF(LNode *&L)
{
int i;
LNode *s, *t;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
s = L;
for (i = 0; i < 10; i++)
{
t = (LNode *)malloc(sizeof(LNode));
t->data = 3 * i + 1;
t->next = s->next;
s->next = t;
}
}
int traveselist(LNode *L)
{
if (L->next == NULL)
{
return false;
}
while (L->next != NULL)
{
cout << L->next->data << " " << endl;
L = L->next;
}
cout << "完成" << endl;
return true;
}
void mergelist(LNode *A, LNode *B, LNode *&C)
{
LNode *S, *L, *P;
C = (LNode *)malloc(sizeof(LNode));
C->next = NULL;
S = C;
L = A;
P = B;
while (L->next != NULL && P->next != NULL)
{
cout << "L->next->data:" << L->next->data << endl;
cout << "p->next->data: " << P->next->data << endl;
if (L->next->data <= P->next->data)
{
cout << "1" << endl;
cout << "L->next->data:" << L->next->data << endl;
cout << "p->next->data: " << P->next->data << endl;
S->next = L->next;
S = S->next;
L = L->next;
cout << "S->data:" << S->data << endl;
cout << "L->next->data:" << L->next->data << endl;
cout << "p->next->data: " << P->next->data << endl;
}
else
{
S->next = P->next;
S = S->next;
P = P->next;
}
}
if (L->next != NULL)
{
S->next = L->next;
}
if (P->next != NULL)
{
S->next = P->next;
}
}
int main()
{
LNode *L, *P, *C;
createlistR(L, P);
traveselist(L);
createlistF(L);
traveselist(L);
traveselist(P);
createlistR(L, P);
traveselist(L);
traveselist(P);
mergelist(L, P, C);
traveselist(C);
}
修改如下,供参考:
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode* next;
} LNode;
void createlistR(LNode*& L, LNode*& P)
{
int i;
LNode* s, * t;
L = (LNode*)malloc(sizeof(LNode));//P, L = (LNode*)malloc(sizeof(LNode));
P = (LNode*)malloc(sizeof(LNode));
L->next = NULL, P->next = NULL; //修改
s = L;
for (i = 0; i < 10; i++)
{
t = (LNode*)malloc(sizeof(LNode));
t->data = 2 * i + 1;
s->next = t;
s = t;
}
s->next = NULL;
s = P;
for (i = 0; i < 10; i++)
{
t = (LNode*)malloc(sizeof(LNode));
t->data = 3 * i + 1;
s->next = t;
s = t;
}
s->next = NULL;
}
void createlistF(LNode*& L)
{
int i;
LNode* s, * t;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
s = L;
for (i = 0; i < 10; i++)
{
t = (LNode*)malloc(sizeof(LNode));
t->data = 3 * i + 1;
t->next = s->next;
s->next = t;
}
}
int traveselist(LNode* L)
{
if (L->next == NULL)
{
return false;
}
while (L->next != NULL)
{
cout << L->next->data << " "; //修改
L = L->next;
}
cout << "完成" << endl;
return true;
}
void mergelist(LNode* A, LNode* B, LNode*& C)
{
LNode* S, * L, * P;
C = (LNode*)malloc(sizeof(LNode));
C->next = NULL;
S = C;
L = A->next; //修改
P = B->next; //修改
while (L != NULL && P != NULL) //修改
{
//cout << "L->data:" << L->data << endl;
//cout << "p->data: " << P->data << endl;
if (L->data < P->data) //if (L->next->data <= P->next->data) //修改
{
cout << "1" << endl;
cout << "L->data:" << L->data << endl;
cout << "p->data: " << P->data << endl;
S->next = L; //修改
S = L; //修改
L = L->next;
cout << "S->data:" << S->data << endl;
}
else
{
S->next = P; //修改
S = P; //修改
P = P->next;
}
}
if (L != NULL)//修改
{
S->next = L;//修改
}
if (P != NULL)//修改
{
S->next = P;//修改
}
}
int main()
{
LNode* L, * P, * C;
createlistR(L, P);
traveselist(L);
traveselist(P);
mergelist(L, P, C);
traveselist(C);
return 0;
}
当 if (L->next->data <= P->next->data)时,你只需要L = L->next就行了,P是不需要移动的啊,你怎么两个都移动呢。同样else的时候只需要P=P->next,L是不要动的啊