что не так с кодом, который должен объединить два односвязных списка в другой список? - PullRequest
0 голосов
/ 16 мая 2019

Я хочу объединить два односвязных списка, таких как La и Lb, в новый список, такой как Lc, а головной узел lc указывает на La. Есть код:

//something unnecessary code has been cut

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;


//merge La and Lb into Lc
Status Algo(LinkList La, LinkList *Lb, LinkList *Lc);

int main()
{
    LinkList La,Lb,Lc;

    CreateListHead_L(&La, 5);  //Crate a list with 5 nodes
    CreateListHead_L(&Lb, 5);
    printf("La:"); ListTraverse_L(La);  
    printf("Lb:"); ListTraverse_L(Lb);

    Algo(La, &Lb, &Lc);

    printf("Lc:");
    ListTraverse_L(Lc);

    return 0;
}

Status Algo(LinkList La, LinkList *Lb, LinkList *Lc)
{
    LinkList p;

    *Lc = La;
    p = La->next;
    if(!p) return ERROR;
    while(p)
        p = p->next;

    p->next = (*Lb)->next;
    free(*Lb);

    return OK;
}

Я просто хочу знать, что не так с функцией Algo, которую я считаю правильным. Почему программа зависала при обработке функции?

1 Ответ

2 голосов
/ 16 мая 2019

Конечно, это выйдет за пределы La, и вы в конечном итоге ничего не будете держать, когда то, что вы на самом деле хотите держать, является последним узлом в La, так что вы можете установить его следующим, чтобы быть главой Lb (ваше времяцикл пытается найти последний узел в La, но он заходит слишком далеко и останавливает цикл только после того, как он выходит за пределы конца списка)

Я не делаю c, но я понимаю логику .. действительновы хотите делать что-то вроде

while(p->next) //while there is still a next item

, чтобы при переходе к последнему элементу в La цикл останавливался, и ваш p ​​по-прежнему оставался последним, а не нулевым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...