我正在尝试设置链接列表,但只是在每个位置都获得相同的元素 -
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 45
typedef struct node
{
char* word;
struct node* next;
}
node;
int main(void)
{
node* head = NULL; //start of list
// open input file
FILE* inptr = fopen("smalllocal", "r");
if (inptr == NULL)
{
printf("Could not open %s.\n", "smalllocal");
return 2;
}
printf("Opened file\n");
//Get a word from dictionary
char str1[LENGTH +1];
while (fscanf(inptr, "%s", str1) != EOF)
{
node* new_node = malloc(sizeof(node)); //malloc space for a new node
if (new_node == NULL)
{
return 3;
}
new_node->word = str1;
// is it the first insertion at this index?
if (head == NULL)
{
new_node->next = head;
head = new_node;
}
else
// collision so insert at front of list
{
new_node->next = head;
head = new_node;
}
}
fclose(inptr);
printf("Closed file\n");
node* pointer = head;
while (pointer != NULL)
{
printf("%s\n", pointer->word);
pointer = pointer->next;
}
return 0;
}
文件'smalllocal'包含大约15个不同的单词,但最后的打印例程只打印出文件中每个位置的最后一个元素。有人可以帮忙吗?
答案 0 :(得分:1)
这不是在C中复制字符串的正确方法(您无法使用=
分配它们。)
相反,您需要分配足够长的字符数组来保存字符串,并使用strcpy()
。
new_node->word = malloc(strlen(str1) + 1);
strcpy(new_node->word, str1);
以后不要忘记free()
以避免内存泄漏。
程序反复打印相同值的原因是每个节点的word
指针都指向str1
数组,但该数组会被重用于每个单词。所以在任何给定的时间,无论你有多少个节点,你只有一个字符串:在str1
内,当然它的值将是循环中读取的最后一个字符串。
答案 1 :(得分:1)
您正在为strcut分配内存,但您还需要为字符串分配内存。改变你的
new_node->word = str1;
的
new_node->word = malloc(strlen(str1)+1);
strcpy(new_node->word, str1);
以便您分配必要的内存来保存字符串,然后将其复制到此分配的内存中。否则,所有节点word
指针都将指向相同的字符串str1
。
答案 2 :(得分:1)
您的new_node->word
是一个指针,它不包含任何字符。所有节点都指向同一块内存。插入新节点时,您更改了str1
的内容,因此它只打印出最后一个字符串。
请改用new_node->word = strdup(str1);
。您需要添加string.h
标题。
答案 3 :(得分:0)
你不能简单地做
new_node->word = str1;
您需要先分配内存并将字符串复制到内存中...
new_node -> word = (char *) malloc( sizeof(char)*(LENGTH +1) );
strcpy(new_node -> word, str1);
应该这样做。否则,链表中的所有指针都指向相同的内存位置。