因此,我有一个搜索链接列表的功能,并在链接列表中查找最接近数字的值。在此过程中,它应该打印发现的所有新值。
void search(struct Node* head, double x, FILE* fp) {
double temp = 99999;
double calc = fabs(head->data - x);
while (head != NULL)
{
if (calc <= temp) {
fprintf(fp, "%.6f,", head->data);
temp = calc;
head = head-> next;
}
head = head->next;
calc = fabs(head->data - x);
}
}
链接列表节点结构:
struct Node
{
double data;
struct Node *next;
};
double x
只是我要寻找的值,FILE * fp
是我要写入的CSV文件。
它不会将任何内容打印到CSV文件,不确定该算法有什么问题。我正在终止状态为-1073741819的进程。
答案 0 :(得分:3)
您将跳过节点并计算值,而无需检查空指针。
在这里,您的代码在head
可能为空的每个地方都有注释,这将是一个问题:
void search(struct Node* head, double x, FILE* fp) {
double temp = 99999;
// head could be null here...
double calc = fabs(head->data - x);
while (head != NULL)
{
if (calc <= temp) {
fprintf(fp, "%.6f,", head->data);
temp = calc;
head = head-> next;
}
// head could also be null here, because of the conditional above...
head = head->next;
// and head could also be null here, because of the line above.
calc = fabs(head->data - x);
}
}
相反,请从头开始,只要head
不为空:
head
的值和x
的差在C中:
void search(struct Node* head, double x, FILE* fp) {
double temp = 99999;
while (head != NULL)
{
double calc = fabs(head->data - x);
if (calc <= temp) {
fprintf(fp, "%.6f,", head->data);
temp = calc;
}
head = head->next;
}
}
答案 1 :(得分:1)
您必须确保正确打开文件,并且一旦完成算法,则关闭文件。您还可以将列表前进两次,一次是if
为真,另一次是if块之后。
void example(void)
{
FILE *fp;
if (!(fp=fopen(myfile.csv", "w")) return(0);
search(head, 123.0, fp);
fclose(fp);
}
和:
while (head != NULL)
{
double calc = fabs(head->data - x);
if (calc <= temp) {
fprintf(fp, "%.6f,", head->data);
temp = calc;
//head = head-> next; // remove this line
}
head = head->next;
}
正如molbdnilo在他的答案中指出的那样,在超前了头之后,它可能会变为空,并且应该将计算移到循环的顶部。 (我添加了它,以使此答案正确。)