C语言 我在链表中陷入了一个无限循环



我想找出已经排序的两个链表之间的交叉点,但是我进入了一个无限循环,我知道我设置了错误的条件,但我不知道如何解决。 请帮助我。

#include<stdio.h>
#include<stdlib.h>
typedef struct node {
    int data;
    struct node *next;
}list;
list *intersect(list *L1, list *L2) {
    list *Result;
    list *L1Pos, *L2Pos, *ResultPos;
    L1Pos = L1;
    L2Pos = L2;
    Result = (list *)malloc(sizeof(list));
    ResultPos = Result;
    while(L1Pos != NULL && L2Pos != NULL) {         //endless loop
        if(L1Pos->data < L2Pos->data) {
            L1Pos = L1Pos->next;
        } else if(L1Pos->data > L2Pos->data) {
            L2Pos = L2Pos->next;
        } else {
            ResultPos->data = L1Pos->data;
            L1 = L1Pos->next;
            L2 = L2Pos->next;
            ResultPos->next = (list *)malloc(sizeof(list));
            ResultPos = ResultPos->next;
        }
    }
    return Result;
}

当你找到交集时,你不会改变L1PosL2Pos的值,所以循环会永远选择最后的 else 语句。

如果要结束循环,请使用 break 或将提到的变量之一设置为 NULL。

否则,您可以将两个节点都设置为下一个节点,并让循环继续,直到列表末尾:

L1Pos = L1Pos->next;
L2Pos = L2Pos->next;

此外,您的Result分配也是有问题的,因为节点是在知道循环是否找到任何结果之前分配的,因此返回节点可能包含未初始化的值,并且列表Result中的最后一个节点将始终包含未初始化的值。不要提前分配,而是在找到节点时分配,并将新节点的下一个指针设置为 NULL,以便终止列表。在未找到任何内容的情况下,该函数将返回 Result ,这将是 NULL(因为它将在循环之前初始化为 NULL)。

如果L1Pos->data == L2Pos->data你的循环不会终止。您将L1L1Pos混合,L2L2Pos混合.除此之外,仅在需要时分配结果节点,否则您将始终拥有一个具有未初始化数据的节点:

list *intersect(list *L1, list *L2) {
    list *L1Pos = L1;
    list *L2Pos = L2;
    list *Result = NULL;
    list **ResultPos = &Result; // ResultPos refers to 'Result'
    while(L1Pos != NULL && L2Pos != NULL) {
        if(L1Pos->data < L2Pos->data) {
            L1Pos = L1Pos->next;
        } else if(L1Pos->data > L2Pos->data) {
            L2Pos = L2Pos->next;
        } else {
            *ResultPos = (list *)malloc(sizeof(list));
            (*ResultPos)->data = L1Pos->data;
            (*ResultPos)->next = NULL;         // successor of last result is NULL
            ResultPos = &((*ResultPos)->next); // ResultPos now refers to 'next' 
            L1Pos = L1Pos->next;
         // ^^^^^
            L2Pos = L2Pos->next;
         // ^^^^^
        }
    }
    return Result;
}

相关内容

  • 没有找到相关文章

最新更新