线性搜索使用C中的函数和动态内存分配

时间:2016-10-21 19:31:23

标签: c pointers search malloc linear

#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 \n\n",success_search);
}

int main()
{

    int N,i,p,key;

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

我尝试创建一个伪随机数组,然后尝试在其中搜索特定数字,并跟踪所做的总比较以及完成搜索所需的总时间。我手动插入了一个不在数组中的数字,并且一直说这个数字是在3次比较后找到的。此外,经过的时间似乎总是为零。我无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:0)

进行以下更改。

1)您需要分配数组并将其传递给不同的函数。所以“n”应该是指针。

int *n = NULL;

2)您希望CreateArray()分配内存并传递指针。

void CreateArray (int **p, int N)

3)你必须将指针传递给Search()。所以来自main()的调用变为

Search(p, N, key);

我认为现在应该可以正常运作了。

在经过的时间内,您可以在问题中参考Weather Vane的评论。

答案 1 :(得分:0)

您的代码中存在多个问题:

  • CreateArray应该返回指向分配空间的指针。向其传递指向int中的本地main()的指针没有任何意义。

  • 您应该测试malloc的潜在故障。

  • Search应该获得指向分配的数组的指针,而不是本地int的地址。

  • Search应该在扫描阶段结束时仅打印一次Not found消息。

  • 如果您要计算成功比较的次数,则在找到第一个比较时不应中断循环,但是比较的总数为{{1} }。

  • 为获得更好的定时精度,应避免在定时片段内使用N

  • 退出程序前,您应该printf保留内存。

这是更正的版本:

free