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



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

    /*
    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");
    }

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

该函数可以如下所示

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;
    }
}

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

在你的函数中,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 ''
      /* ^^^    */

相关内容

  • 没有找到相关文章

最新更新