Передача указателя на массив в качестве параметра функции - PullRequest
0 голосов
/ 16 апреля 2020

Я попытался построить кучу и, наконец, напечатать элементы в виде массива.

Вот код (я знаю, что это не имеет смысла, но я просто хотел проверить свои знания куча и динамические c массивы):

#include <stdio.h>
#include <stdlib.h>
void heapiify(int *arr,int n, int i)
{
    int largest=i;
    int l=2*i+1;    // left node
    int r= 2*i+2;   // right node
    if(l<=n && *arr[l]>=*arr[i])
        largest=l;
    if (r <=n && *arr[r]<=*arr[i])
        largest= r;
    if(largest !=i)
    {
        int temp=*arr[i];
        *arr[i]=*arr[largest];
        *arr[largest]=temp;
    }
    heapify(*arr,n,largest);
}

void buildh(int *arr,int n,int r,int c)
{
    int i;
    for(i=n/2-1;i>=0;i--)
        heapify(*arr,n,i);
   output(*arr,r,c);
}

void output(int *arr,int r,int c)
{
    int i,j;
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            printf("%d",*arr[i*c+j]);
        }
        printf("\n");
    }
}

int main()
{
    int i,j,r,c;

    printf("enter the number of rows");
    scanf("%d",&r);
    printf("enter the number of columns");
    scanf("%d",&c);

    int n=r*c;
    int *arr=malloc(n*sizeof(int));
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
            scanf("%d",&arr[i*c+j]);
    }

    buildh(*arr,n,r,c);
}

Я получаю 9 ошибок, которые все одинаковы

invalid argument type of unary '*'( have int)

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Ваша переменная arr имеет указатель типа на int:

int *arr=malloc(n*sizeof(int));

Поэтому, когда вы вызываете buildh, который принимает тот же тип, вы должны передать его как есть:

buildh(arr,n,r,c);

То же самое для других случаев.

0 голосов
/ 16 апреля 2020

Проблема заключается в разыменовании arr через ваши функции в нескольких местах и ​​передаче разыменованных *arr в ваших функциях к int * параметрам, вы должны передать arr, попробуйте:

//...
void heapify(int *arr, int n, int i)
{
    int largest = i;
    int l = 2 * i + 1; // left node
    int r = 2 * i + 2; // right node
    if (l <= n && arr[l] >= arr[i])  //here
        largest = l;
    if (r <= n && arr[r] <= arr[i])  //here
        largest = r;
    if (largest != i)
    {
        int temp = arr[i];  //here
        arr[i] = arr[largest]; //here
        arr[largest] = temp; //here
    }
    heapify(arr, n, largest); //here
}
void buildh(int *arr, int n, int r, int c)
{
    int i;
    for (i = n / 2 - 1; i >= 0; i--)
        heapify(arr, n, i);    //here
    output(arr, r, c);         //here
}
void output(int *arr, int r, int c)
{
    int i, j;
    for (i = 0; i < r; i++)
    {
        for (j = 0; j < c; j++)
        {
            printf("%d", arr[i * c + j]); //here
        }
        printf("\n");
    }
}

int main()
{
    //...
    buildh(arr, n, r, c); //here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...