关于#链表#的问题,如何解决?

为什么我的链表在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);
}


img

修改如下,供参考:

#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是不要动的啊