在c语言中建立链表



我试图建立一个链表,但只是得到相同的元素在每个位置-

#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);

应该可以了。否则,链表中的所有指针都指向相同的内存位置。

相关内容

  • 没有找到相关文章

最新更新