我在链表中​​进入无限循环

时间:2016-01-16 13:56:57

标签: c data-structures linked-list

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

#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;
}

2 个答案:

答案 0 :(得分:2)

当您找到交叉点时,您不会更改L1PosL2Pos的值,因此循环会一直选择最终的else语句。

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

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

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

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

答案 1 :(得分:1)

如果你的循环L1Pos->data == L2Pos->data终止了。您将L1L1PosL2L2Pos混合在一起。除此之外,如果需要,只分配您的结果节点,否则您将始终拥有一个未初始化数据的节点:

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;
}