Как исправить передачу аргумента 1 'count' из несовместимого типа указателя - PullRequest
1 голос
/ 16 апреля 2019

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

passing argument 1 of 'count' from incompatible pointer type [-Wincompatible-pointer-types]|

Может кто-нибудь объяснить мне, почему это происходит и как это исправить?

Это узел связанного списка без рекурсии. Работает без ошибок и возвращает возвращаемое мне значение.

int count(list_t *list){
    node_t *curr = list->head;
    int length=0;
    while(curr != NULL){
        length++;
        curr = curr->next;
    }
    return(length);
}

И этот рекурсивен, но я получаю ошибку "'count' from несовместимый указатель".

int count(list_t *list){
    node_t *curr = list->currptr;
    int length=0;
    if(curr == NULL){
        return(0);
    }
    return(1 + count(curr->next));
}

Это структура моего связного списка

typedef struct {
    int yyyy, mm,dd;
} date_t;

typedef struct {
    double balance;
} acc_balance;

typedef struct node node_t;

struct node{
    char *acc_no, *name, *lastname;
    date_t date;
    acc_balance acc_balance;
    node_t *next;
};

typedef struct {
    node_t *head;
    node_t *foot;
    node_t *currptr;
} list_t;

Вывод должен быть 8, но программа завершается с:

Process returned -1073741819 (0xC0000005) execution time : 5.093 s

Я все еще новичок в StackOverflow. Мои извинения, если я сказал что-то не так.

Ответы [ 2 ]

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

Спасибо за публикацию определений.Это очень полезно.Для рекурсии вам нужно иметь дело только с node_t, а не с list_t.Это может выглядеть так:

int count(node_t *curr)
{
    if (curr == NULL)
    {
        return (0);
    }
    return (1 + count(curr->next));
}

Затем вы называете это так:

count(list->head);

Если вы хотите иметь возможность вызывать его с помощью list_t, добавьте помощникафункция как это:

int countList(list_t *list)
{
    return count(list->head);
}
0 голосов
/ 16 апреля 2019

Это другое предложение, если вы хотите иметь одну функцию, которая обрабатывает как list_t, так и node_t:

int count(list_t *list, node_t *curr)
{
    if (list == NULL)
    {
        if (curr == NULL)
        {
            return (0);
        }
        return (1 + count(NULL, curr->next));
    }
    else
    {
        return count(NULL, list->head);
    }        
}

Мне не нравится этот способ, но я пытаюсь дать вам несколько вариантов для рассмотрения. Я думаю, что мой первый ответ, который касается только node_t, а не list_t, является лучшим решением.

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