在链接列表中搜索最接近设置值的值

时间:2018-09-04 12:41:09

标签: c function

因此,我有一个搜索链接列表的功能,并在链接列表中查找最接近数字的值。在此过程中,它应该打印发现的所有新值。

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的进程。

2 个答案:

答案 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在他的答案中指出的那样,在超前了头之后,它可能会变为空,并且应该将计算移到循环的顶部。 (我添加了它,以使此答案正确。)