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