我想找出已经排序的两个链表之间的交叉点,但是我进入了一个无限循环,我知道我设置了错误的条件,但我不知道如何解决。 请帮助我。
#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;
}
当你找到交集时,你不会改变L1Pos
和L2Pos
的值,所以循环会永远选择最后的 else 语句。
如果要结束循环,请使用 break 或将提到的变量之一设置为 NULL。
否则,您可以将两个节点都设置为下一个节点,并让循环继续,直到列表末尾:
L1Pos = L1Pos->next;
L2Pos = L2Pos->next;
此外,您的Result
分配也是有问题的,因为节点是在知道循环是否找到任何结果之前分配的,因此返回节点可能包含未初始化的值,并且列表Result
中的最后一个节点将始终包含未初始化的值。不要提前分配,而是在找到节点时分配,并将新节点的下一个指针设置为 NULL,以便终止列表。在未找到任何内容的情况下,该函数将返回 Result
,这将是 NULL(因为它将在循环之前初始化为 NULL)。
如果L1Pos->data == L2Pos->data
你的循环不会终止。您将L1
与L1Pos
混合,L2
与L2Pos
混合.除此之外,仅在需要时分配结果节点,否则您将始终拥有一个具有未初始化数据的节点:
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;
}