我试图建立一个链表,但只是得到相同的元素在每个位置-
#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 filen");
//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 filen");
node* pointer = head;
while (pointer != NULL)
{
printf("%sn", pointer->word);
pointer = pointer->next;
}
return 0;
}
文件'smalllocal'包含大约15个不同的单词,但是最后的print例程只是为每个位置打印出文件中的最后一个元素。有人能帮忙吗?
这不是在C中复制字符串的正确方法(你不能使用=
分配它们)。
相反,您需要分配一个足够长的字符数组来保存字符串,并使用strcpy()
。
new_node->word = malloc(strlen(str1) + 1);
strcpy(new_node->word, str1);
不要忘记稍后free()
它们以避免内存泄漏。
程序一遍又一遍地打印相同值的原因是每个节点的word
指针指向str1
数组,但是该数组对于每个单词都被重用。因此,在任何给定的时间,无论您有多少节点,您实际上只有一个字符串:在str1
中,并且它的值自然将是在循环中读取的最后一个字符串。
您正在为您的strcut分配内存,但您还需要为您的字符串分配内存。修改
new_node->word = str1;
new_node->word = malloc(strlen(str1)+1);
strcpy(new_node->word, str1);
以便分配必要的内存来保存字符串,然后将其复制到分配的内存中。否则,您的所有节点word
指针将指向相同的字符串str1
.
您的new_node->word
是一个指针,它不包含任何字符。所有节点都指向相同的内存块。当您插入一个新节点时,您更改了str1
的内容,因此它只打印出最后一个字符串。
使用new_node->word = strdup(str1);
代替。您需要包含string.h
header
你不能简单地做
new_node->word = str1;
你需要先分配内存并将字符串复制到内存中…
new_node -> word = (char *) malloc( sizeof(char)*(LENGTH +1) );
strcpy(new_node -> word, str1);
应该可以了。否则,链表中的所有指针都指向相同的内存位置。