Линейный поиск с использованием функций и динамическое выделение памяти в C

#c #pointers #malloc #linear-search

#c #указатели #malloc #линейный поиск

Вопрос:

 #include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define LIMIT 30000

void CreateArray(int *p, int N) {
    int i;
    p = (int *)malloc(N * sizeof(int));
    srand((long)210);
    for (i = 0; i < N; i  )
        *(p   i) = rand() % LIMIT;

    for (i = 0; i < N; i  )
        printf("%d ", p[i]);
}

void Search(int *p, int N, int key) {
    int comparisons = 0, success_search = 0;
    int i;

    clock_t start, end;
    double elapsed;
    start = clock();

    for (i = 0; i < N; i  ) {
        if (key == p[i]) {
            comparisons  ;
            success_search  ;
            printf("nFound!");
            break;
        } else {
            comparisons  ;
            printf("nNot found!");
        }
    }

    end = clock();
    elapsed = ((double)(end - start)) / CLOCKS_PER_SEC;

    printf("nTotal comparisons: %d n", comparisons);
    printf("Time elapsed: %f n", elapsed);
    printf("Successful comparisons: %d nn", success_search);
}

int main() {
    int N, i, p, key;

    key = 1;
    CreateArray(amp;p, N = 7);
    Search(amp;p, N, key);
}
  

Я пытаюсь создать псевдослучайный массив, а затем попытаться выполнить поиск по определенному числу в нем и отслеживать общее количество проведенных сравнений и общее время, необходимое для завершения поиска. Я вручную вставил число, которого нет в массиве, и он продолжает говорить, что число было найдено после 3 сравнений. Также прошедшее время всегда кажется равным нулю. Я не могу понять, что не так.

Комментарии:

1. int *p; => CreateArray(amp;p, N = 7); => void CreateArray (int **p, int N) => *p = (int*) malloc (N*sizeof(int));

2. «прошедшее время всегда кажется равным нулю», возможно, из-за детализации таймера. Например, Windows MSVC имеет #define CLOCKS_PER_SEC ((clock_t)1000)

3. @BLUEPIXY Если я внесу изменения, которые вы рекомендуете, программа даже не запустится. Я получаю сообщение об ошибке «программа перестала работать».

4. ДЕМОНСТРАЦИЯ

5. @BLUEPIXY прав, но аргументом для createArray() должен быть указатель на указатель, а не указатель на переменную стека.

Ответ №1:

Внесите следующие изменения.

1) Вам нужно выделить массив и передать его различным функциям. Итак, «n» должно быть указателем.

 int *n = NULL;
  

2) Вы хотите, чтобы createArray() выделил память и передал указатель.

 void CreateArray (int **p, int N)
  

3) Вы должны передать указатель в Search(). Таким образом, вызов из main() становится

 Search(p, N, key);
  

Я думаю, что теперь все должно работать нормально, как и ожидалось.

Что касается прошедшего времени, вы ссылаетесь на комментарий флюгера в вашем вопросе.

Ответ №2:

В вашем коде множество проблем:

  • CreateArray должен возвращать указатель на выделенное пространство. Передача ему указателя на локальный int in main() не имеет смысла.

  • вы должны протестировать malloc потенциальный сбой.

  • Search должен быть получен указатель на выделенный массив, а не адрес локального int .

  • Search следует напечатать Not found сообщение только один раз в конце фазы сканирования.

  • Если вы хотите подсчитать количество успешных сравнений, вам не следует прерывать цикл при нахождении первого, но тогда общее количество сравнений будет N .

  • для лучшей точности синхронизации вам следует избегать использования printf внутри временного фрагмента.

  • вы должны free освободить память перед выходом из программы.

Вот исправленная версия:

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LIMIT 30000

void CreateArray(int N) {
    int i;
    int *p = (int *)malloc(N * sizeof(int));
    if (p != NULL) {
        srand((long)210);
        for (i = 0; i < N; i  )
            *(p   i) = rand() % LIMIT;

        for (i = 0; i < N; i  )
            printf("%d ", p[i]);
    }
    return p;
}

void Search(int *p, int N, int key) {
    int comparisons = 0, success_search = 0;
    int i;

    clock_t start, end;
    double elapsed;
    start = clock();

    for (i = 0; i < N; i  ) {
        comparisons  ;
        if (key == p[i])
            success_search  ;
    }
    end = clock();
    elapsed = ((double)(end - start)) / CLOCKS_PER_SEC;

    if (success_search)
        printf("Found!n");
    else
        printf("Not found!n");

    printf("Total comparisons: %dn", comparisons);
    printf("Successful comparisons: %dnn", success_search);
    printf("Time elapsed: %fn", elapsed);
}

int main() {
    int N, i, key;
    int *p;

    key = 1;
    N = 7;
    p = CreateArray(N);
    if (p == NULL) {
        fprintf(stderr, "cannot allocate memory for %d elementsn", N);
        return 1;
    }
    Search(p, N, key);
    free(p);
    return 0;
}