Связанный список символов в C - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать связанный список , содержащий данные типа char.

По какой-то причине код не работает.Предупреждение компилятора GCC для функции "add_bottom_ListEl":

"предупреждение: передача аргумента 2 в add_bottom_listEl делает целое число из указателя без приведения"

и

"примечание:ожидаемый 'char', но аргумент имеет тип 'char * "

Я подозреваю, что что-то не так с тем, как я использую указатели, но я пробовал много-много комбинаций, передавая указатели на функцию и т.д ..Но, похоже, ничего не работает.

Вот основная функция и все остальные используемые.MAX_CHAR определен во всех файлах (#define MAX_CHAR 30)

int main()
{
    char name[MAX_CHAR];
    scanf("%s", name);
    ListEl *head = malloc(sizeof(ListEl));
    strcpy(head->name, name);
    head->next = NULL;
    printf("%s", head->name);
    add_bottom_listEl(head, name);
    print_listEl(head);
    return 0;
}
void add_bottom_listEl (ListEl *head, char name)
{
    ListEl *newEl;
    while(head->next!=NULL)
    {
        head=head->next;
    }
    newEl = (ListEl*) malloc(sizeof(ListEl));
    strcpy(newEl->name, name);
    newEl->next = NULL;
}
void print_listEl(ListEl* head)
{
    puts("print");
    ListEl* current = head;
    while (current!=NULL)
    {
        int i=1;
        printf("%d.%s\n", i, current->name);
        ++i;
        current = current -> next;
    }
}

Структура ListEl - это просто обычный элемент связанного списка

struct ListEl
{
    char name[MAX_CHAR];
    struct ListEl* next;
};

Очевидно, я использовал

typedef struct ListEl ListEl;

В каждом учебном пособии по связанным спискам в Интернете или на этом сайте показано только, как обрабатывать списки с целыми числами или числами в целом, но не с массивами (символами).Может ли кто-нибудь помочь мне здесь?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Ваша функция "add_bottom_listEl" принимает один символ с именем "name", а не массив символов (или указатель на символ).Я думаю, вы хотите, чтобы это было:

add_bottom_listEl(ListEl *head, char *name)
0 голосов
/ 11 декабря 2018

Если ваше намерение в add_bottom_listEl состоит в том, чтобы изменить и передать обратно заголовок, то заголовок должен быть передан как указатель на указатель:

    void add_bottom_listEl(ListEl** head, char* name) {
        if ( head == NULL ) {         
    //head is invalid, do nothing
            return;
        }
    //Use calloc instead of malloc to initialise the memory area
        ListEl* newEl = (ListEl*)calloc(1, sizeof(ListEl));
    //Ensure only name of the permissible length is copied
        strncpy(newEl->name, name, MAX_CHAR-1);
    //No need to do this now...calloc will initialise it to NULL
        //newEl->next = NULL;

        if ( *head == NULL ) {
    //No nodes in list yet, this is the first
            *head = newEl;
        } else if ( *head != NULL ) {         
    //Find the end of the list
            while((*head)->next!=NULL) {
                *head = (*head)->next;
            }
        }
    //Add the new node to the list
        *head = newel;
   }

Когда вы вызываете эту модифицированную версию функции, передайте адресуказателя:

    add_bottom_listEl(&head, name);

Вы можете сделать ваш typedef более читабельным, сделав это:

    typedef struct _listEl {
        char name[MAX_CHAR];
        struct _listEl* next;
    } ListEl;
0 голосов
/ 11 декабря 2018

Строка

void add_bottom_listEl (ListEl *head, char name)

должна быть

void add_bottom_listEl (ListEl *head, char* name)

...