如何在C中的链表中添加字符串?

时间:2019-06-15 00:44:45

标签: c string data-structures linked-list

我已经知道了如何在C语言的链表中添加一个整数,但是我需要添加一个字符串,但这根本行不通。

main函数从用户那里获取数据并在将其添加到链接列表后在show函数中进行打印。

列表和主要

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的无效转换。在inserir(data)行中;

2 个答案:

答案 0 :(得分:1)

我们有char dado[10];,但是novoelemento->dado = data;如您所见,它无法编译。

您似乎想要strncpy(novoelemento->dado, data, 10)[9] = 0;来复制数据中的字符串,并确保其正确以null终止。

如果您有strlcpy,则可以像strlcpy(novoelemento->dado, data, 10);一样做得更好

答案 1 :(得分:1)

对不起,但是我发现您的代码中有很多错误。我为您的问题写了一个非常简单的解决方案。请参考并纠正您的错误。

值不过是字符串,即数据(在代码中)作为参数传递给主函数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");
}    

希望这会对您有所帮助。