C list->数据不会显示在终端上

时间:2016-09-06 18:07:27

标签: c list file struct nodes

控制台不显示我的列表节点中的数据。我用文本文件中的字符填充它。

#include<stdio.h>
#include<stdlib.h>

struct list_node{
    char data;
    struct list_node* next;
};

typedef struct list_node* node;

node insert_right(node list,char data)
{
    node new_node = (node) malloc(sizeof(struct list_node));
    new_node->data = data;
    new_node->next = list->next;
    list->next = new_node;
    return new_node;
}

int main()
{
    FILE *fr = fopen("dat1.txt","r");
    node list = (node) malloc(sizeof(struct list_node));
    int i;

    while((i = fgetc(fr)) != EOF){          
            insert_right(list,i);                   
    }
    printf("%c",list->data);
}

我认为主要问题在于插入方法。

3 个答案:

答案 0 :(得分:1)

您正在创建链接列表。您创建的每个节点都需要指向NULL或下一个节点。你没有完全建立链接。你还没有得到你返回的new_node。此外,当打印出列表时,您必须遍历每个节点(如数组)。

#include<stdio.h>
#include<stdlib.h>

struct list_node{
    char data;
    struct list_node* next;
};

typedef struct list_node* node;

node insert_right(node list,char data)
{
    node new_node = (node) malloc(sizeof(struct list_node));
    new_node->data = data;
    list->next = new_node;
    new_node->next = NULL;
    return new_node;
}

int main()
{
    FILE *fr = fopen("dat1.txt","r");
    node list = (node) malloc(sizeof(struct list_node));
    int i;
    node next = list;
    while((i = fgetc(fr)) != EOF){           
    next = insert_right(next,i);                   
    }
    node print = list;
    while(print != NULL){
         printf("%c",print->data);
         print = print->next;
    }   
}

答案 1 :(得分:0)

您正在为名为 list 的节点分配内存,但是您没有为数据初始化任何值,它可能是垃圾或任何未显示的字符在控制台中。

当您插入新值时,会创建一个新节点,第一个节点是&#34; head&#34;可以这么说,即使它指向那里有第二个有意义数据的节点,它仍未被初始化。

这是你的清单:

// Node Y (X) indicates the Y-th node that has a X value.

Node1 (garbage) -> Node2 (value) -> Node3 (value) -> garbage

列表的最后一个节点(也是创建它时的第一个节点)应指向NULL而不是未初始化。

我也非常确定你的列表执行得很差,因为新元素总是被列表指向,所以你会忘记之前创建的那些。

在我看来,这是一个更好的版本:

#include<stdio.h>
#include<stdlib.h>

struct list_node{
    char data;
    struct list_node* next;
};

typedef struct list_node* node;

void insert_right(node list,char data)
{
    node new_node = (node) malloc(sizeof(struct list_node));

    node temp = list;
    // It runs through the list until it reaches the last node
    while(temp->next != NULL) temp = temp->next;

    temp->data = data; 
    temp->next = new_node;
    new_node->next = NULL;
}

int main()
{
    FILE *fr = fopen("dat1.txt","r");

    // List points to only the first element of the list.
    node list = (node) malloc(sizeof(struct list_node));
    list->next = NULL;
    int i;

    while((i = fgetc(fr)) != EOF){          
            insert_right(list,i);                   
    }
    while(list != NULL) {
      printf("%c",list->data);
      list = list->next;
    }
} 

答案 2 :(得分:0)

#include <stdio.h>
#include <stdlib.h>

struct list_node {
        char data;
        struct list_node* next;
};

int main()
{
        FILE *fr = fopen("dat1.txt","r");
        struct list_node *list = malloc(sizeof(*list)), *pos = list;
        int i;

        while ((i = fgetc(fr)) != EOF) {
                pos->data = i;
                pos->next = malloc(sizeof(*list->next));
                pos = pos->next;
        }

        pos->next = NULL;

        while (list->next) {
                printf("%c ", list->data);

                free(list); /* important!!!! */

                list = list->next;
        }

        putchar('\n');

        return 0;
}