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