我试图在链表中的节点之间交换数据字段,但在交换char数组时遇到了问题。这只是该程序的一个示例。
struct node {
int count;
char word[50];
struct node *next;
};
void swap_nodes( struct node *first, struct node *second ) {
int temp_count;
char *temp_word;
temp_count = first->count;
temp_word = first->word;
first->count = second->count;
first->word = second->word;
second->count = temp_count;
second->word = temp_word;
}
让我知道我做错了什么,我对用c写东西很陌生。
当您将字符数组分配给指针时,您不会复制数组:
char *temp_word;
temp_word = first->word;
temp_word
指向数组的初始元素,因此分配给数组也会更改指针指向的数据。
您可以通过声明一个50个字符的数组并使用strcpy
或memcpy
进行复制来修复此问题:
char temp_word[50];
memcpy(temp_word, first->word, sizeof(temp_word));
memcpy(first->word, second->word, sizeof(temp_word));
memcpy(second->word, temp_word, sizeof(temp_word));
好吧,您已经收到了答案,我只想指出,您可以交换列表中的节点位置(而不是节点内容)。由于你有一个单一的链表,你将需要节点的父节点来做这件事
或者,您可以使用动态内存代替静态数组来表示"单词",这样您只需要交换指针,就可以避免数组副本。
word[50]
是struct node
的一部分,它在struct node
的内部,而您所做的只是将指针*temp_word
移动到*first
,然后移动到*second
,word[50]
的内容不会发生深刻变化。您可以使用memcpy
来更改内容。
使用strncpy
和strdup
的适当实现是:
#include <string.h>
void swap_nodes( struct node *first, struct node *second ) {
int temp_count;
char *temp_word;
temp_count = first->count;
temp_word = strdup (first->word);
first->count = second->count;
strncpy (first->word, second->word, 50); /* 50 based on struct definition */
second->count = temp_count; /* could be ( strlen (temp_word) + 1 ) */
strncpy (second->word, temp_word, 50);
if (temp_word) /* free memory allocated with strdup */
free (temp_word);
}