在c中设置链接列表

时间:2014-03-21 16:25:59

标签: c linked-list

我正在尝试设置链接列表,但只是在每个位置都获得相同的元素 -

#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个不同的单词,但最后的打印例程只打印出文件中每个位置的最后一个元素。有人可以帮忙吗?

4 个答案:

答案 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);

应该这样做。否则,链表中的所有指针都指向相同的内存位置。