#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
inmain()
не имеет смысла. -
вы должны протестировать
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;
}