Консоль не показывает данные из моего узла списка, я заполнил его символами, взятыми из текстового файла.

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

Основная проблема, я думаю, будет в методе вставки.

2
Emanuel 6 Сен 2016 в 21:07

3 ответа

Лучший ответ

Вы выделяете память для узла с именем list , но при этом не инициализируете какое-либо значение для данных , это может быть мусор или любой символ, который не отображается в консоли. .

Когда вы вставляете новое значение, создается новый узел, и первый, так сказать «голова», все еще не инициализирован, даже если он указывает на второй узел, который содержит значимые данные.

Это ваш список:

// 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;
    }
} 
0
Mikael 6 Сен 2016 в 18:31

Вы создаете связанный список. Каждый созданный вами узел должен указывать либо на 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
Elidefoe 6 Сен 2016 в 18:33
#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;
}
0
Ray Hamel 6 Сен 2016 в 19:01