Как добавить строку в связанный список в c? - PullRequest
0 голосов
/ 15 июня 2019

Я уже понимаю, как добавить int в связанный список в C, но мне нужно добавить строку, и она просто не работает.

Основная функция получает данные от пользователя и печатает их в функции показа после добавления их в связанный список.

список и основной

struct nlista{
    char dado[10];
    struct nlista *prox;
}*Head;

int main(){
    int op;
    char data[10];
    Head = NULL;

    printf("type a value: ");
    scanf("%s",&data);
    inserir(data);
    printf("the element is : ");
    show();
}

inserir (): добавить элемент в конец списка

    void inserir(char data){

    nlista *novoelemento;
    novoelemento = (struct nlista *)malloc(sizeof(struct nlista));
    nlista *check;
    check = (struct nlista *)malloc(sizeof(struct nlista));

    novoelemento->dado = data;

    if(Head == NULL){
        Head = novoelemento;
        Head->prox = NULL;
    }
    else{
        check = Head;
        while(check->prox != NULL)
            check = check->prox;

        check->prox = novoelemento;
        novoelemento->prox = NULL;  
    }

show (): отобразить связанный список

    void show()
{
    nlista *check;
    check = (struct nlista *)malloc(sizeof(struct nlista));

    check = Head;
    if (check == NULL){
        return;
    }

    while(check != NULL) {
        printf("%s", check->dado);
        check=check->prox;
    }
    printf("\n");
}

Чего мне не хватает? Сообщение компилятора: неверное преобразование из char * в char. в строке инсайр (данные);

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Извините, но я нашел много ошибок в вашем коде. Я написал очень простое решение для вашего вопроса. Пожалуйста, обратитесь и исправьте свои ошибки.

Значение - это не что иное, как строка, то есть данные (в коде), переданные в качестве аргумента в функции inserir в основной функции. Помните, что каждый узел связанного списка состоит из строкового элемента и указателя на следующий узел. Строка может быть различной длины. шаг 1 и шаг 2 позаботятся об этом (см. код). Надеюсь, что вы сейчас ясны.

#include <stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct nlista{
    char *data;
    struct nlista *prox;
}Node;

Node * inserir(Node *, char *);
'''inserir function should return your head node'''
void show(Node *);
'''show function takes head node'''

int main()
{
    char data[10];
    Node * Head = NULL;

    printf("Type a value: ");
    scanf("%s",data);
    Head = inserir(Head,data);
    printf("the element is : ");
    show(Head);
}

Node* inserir(Node *Head, char *value)
{

    Node *novoelemento;
    novoelemento = (Node *)malloc(sizeof(Node));

    //step 1. allocate memory to hold word
     novoelemento->data = malloc(strlen(value)+1);

    //step 2. copy the current word
    strcpy(novoelemento->data,value);

    Node *check;
    check = (Node *)malloc(sizeof(Node));

    if(Head == NULL){
        Head = novoelemento;
        Head->prox = NULL;
    }
    else{   
        check = Head;
        while(check->prox != NULL)
            check = check->prox;

        check->prox = novoelemento;
        novoelemento->prox = NULL;  
    }
  return Head;    
}    
void show(Node *Head)
{
    //check is of Node type using which you traverse the list and print the values
    Node *check;
    check = (Node *)malloc(sizeof(Node));
    check = Head;
    if (check == NULL){
        return;
    }

    while(check != NULL) {
        printf("%s", check->data);
        check=check->prox;
    }
    printf("\n");
}    

Надеюсь, это поможет вам.

1 голос
/ 15 июня 2019

У нас есть char dado[10];, но novoelemento->dado = data; Как вы обнаружили, это не компилируется.

Вы, похоже, хотите strncpy(novoelemento->dado, data, 10)[9] = 0; Это копирует строку в данных и гарантирует, что она правильно завершается нулем.

Если у вас есть strlcpy, вы можете сделать это лучше как strlcpy(novoelemento->dado, data, 10);

...