在c中插入后,最后一个节点中的数据替换先前节点中的数据

时间:2016-02-28 12:09:44

标签: c linked-list

我正在尝试实现一个在链表开头插入名称的函数。问题是最后一个节点中的数据会覆盖先前节点中的数据。这是我从代码中得到的输出:

    /*
    Number of names to insert:
    3
    Name to insert: 
    Tony
    List is now Tony 
    Name to insert: 
    George
    List is now George George 
    Name to insert: 
    Charles           
    List is now Charles Charles Charles 
    */

请帮助我了解问题所在以及如何解决问题。这是代码。

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

    typedef struct node
    {
        char* word;
        struct node* next;
    }node;

    void insert(char* s);
    void print();

    node* head = NULL;

    int main(void)
    {
        int n;
        char s[20];
        puts("Number of names to insert:");
        scanf(" %i", &n);

        for (int i = 0; i < n ; i++)
        {
            puts("Name to insert: ");
            scanf(" %s", s);
            insert(s);
            print();
        }
    }

    void insert(char* s)
    {
        node* temp = malloc(sizeof(node));
        temp->word = s;
        temp->next = NULL;
        if (head == NULL)
        {
            temp->next = head;
            head = temp;
        }
        else
        {
            temp->next = head;
            head = temp;
        }

    }

    void print()
    {          
        node* temp = head;
        printf("List is now ");
        while (temp != NULL)
        {
            printf("%s ", temp->word);
            temp = temp->next;
        } 
        printf("\n");
    }

2 个答案:

答案 0 :(得分:0)

在您的函数insert中使用strcpy而不是指向 -

 temp->word=malloc(20*sizeof(*word));           //allocate memory
 if(temp->word==NUll){
      printf("Error allocating memory");
      return;
 }
 /*  Or in structure you can use an array to char  */
 strcpy(temp->word , s);                        //copy data at that memory 

现在的问题是指针指向最新的字符串(丢失引用给定的先前数据),因此在打印时打印出来。

注意 -

1。请记住free已分配的内存。

2。此外,在使用输入时 -

scanf(" %19s", s);               // reserve space for '\0'
      /* ^^^    */

答案 1 :(得分:0)

您需要为列表中插入的每个字符串分配内存。

该功能可以按以下方式查看

void insert( const char *s )
{
    node* temp = malloc( sizeof( node ) );

    if ( temp != NULL )
    {
        temp->word = malloc( strlen( s ) + 1 );
        strcpy( temp->word, s );

        temp->next = head;
        head = temp;
    }
}

当列表即将停止存在时,您应该为每个节点中的字符串释放已分配的内存。