我正在尝试实现一个在链表开头插入名称的函数。问题是最后一个节点中的数据会覆盖先前节点中的数据。这是我从代码中得到的输出:
/*
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");
}
答案 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;
}
}
当列表即将停止存在时,您应该为每个节点中的字符串释放已分配的内存。