Поиск в связанном списке значения, ближайшего к заданному значению - PullRequest
0 голосов
/ 04 сентября 2018

Итак, у меня есть функция, которая ищет связанный список и находит значение, ближайшее к числу в связанном списке. Во время этого процесса он должен печатать каждое найденное значение, которое является новым ближайшим значением.

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 голосов
/ 04 сентября 2018

Вы пропускаете узлы и вычисляете значения, не проверяя нулевые указатели.

Вот ваш код с комментарием в каждом месте, где 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
  • Если оно меньше вашего предыдущего значения, распечатайте его и сохраните для дальнейшего использования
  • Перейти к следующему узлу

В С:

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;
    }
}
0 голосов
/ 04 сентября 2018

Вы должны убедиться, что файл открыт правильно, и как только алгоритм завершен, файл закрывается. Вы также продвигаете свой список дважды, один раз, если 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 указывает в своем ответе, после продвижения головы это могло бы стать нулевым, и вычисление должно быть перемещено к вершине цикла. (Я добавил это, чтобы сделать этот ответ правильным.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...