2016-09-06 14 views
2

コンソールは私のリストノードのデータを表示しません。テキストファイルから取った文字でコンソールに記入します。Cリスト - >データが端末に表示されない

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

私が考えている主な問題は、挿入方法です。

+1

あなたは 'リスト - > data'を読み込むことはありませんので、あなたは正確に何を期待していますか? @EugeneSh。 –

+0

人口は? – Emanuel

+1

あなたが選んだ同義語を割り当て、設定、初期化するか、それとも.. –

答えて

0

あなたはリストと呼ばれるノードにメモリを割り当てているが、まだあなたはデータのための任意の値を初期化していない、それはゴミやコンソールに表示されない、任意の文字を表します。

新しい値を挿入すると、そこに意味のあるデータがある2番目のノードを指しているにもかかわらず、新しいノードが作成され、最初の "ヘッド"がまだ初期化されません。

これはあなたのリストです:

// 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

"リストの最初の要素を追跡できなくなるため、あなたのリストが貧弱な実装であることも確信しています" - なぜですか?ヘッドへのポインタが維持されます。 –

+0

@EugeneSh。あなたが正しいです、私は間違ってコードを読んで、答えを更新します。 –

+0

@MikaelMelloありがとう:D – Emanuel

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; 
    } 
} 
+0

私は知っていますが、私はあまりにも怠け者でしたので、ただ1つのノードを出力したかったです。 – Emanuel

+0

心配はいりません。これは、あなたがデータ構造クラス、CS1、またはそれらの行に沿ったもので得られる質問のタイプです。それを保つ。 – Elidefoe

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; 
} 
関連する問題