0

警告なしでこのプログラムを作成するにはどうすればよいですか?警告のためにテールを初期化しないでください。別のパラメータで毎回関数を呼び出すのではなく、すべてのデータを出力するループを作ろうとしています。 tail =をCOP3330に設定すると、COP3330の情報は表示されません。なぜなら、= NULLになるからです。ありがとうございました!データ構造の割り当てとデータ構造への情報の受け渡し

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

typedef struct UCF_Classes 
{ 
    char *ClassIdentifier, *ClassName, *Department; 
    int Credits; 
    struct UCF_Classes *next; 
}Info; 

Info *CreateList(char *ClassNumber, char *NameOfClass, char *DepartmentName, int NumOfCredits) 
{ 
    Info *NewClass; 

    NewClass = (Info *) malloc(sizeof(Info)); 

    NewClass->ClassIdentifier = ClassNumber; 
    NewClass->ClassName = NameOfClass; 
    NewClass->Department = DepartmentName; 
    NewClass->Credits = NumOfCredits; 

    return NewClass; 
} 

void WalkListAndDisplay(Info *walker) 
{ 
    printf("%s\n", walker->ClassIdentifier); 
    printf("%s\n", walker->ClassName); 
    printf("%s\n", walker->Department); 
    printf("%d\n\n", walker->Credits); 
} 

int main() 
{ 
    Info *COP3223, *COP3502C, *COP3503C, *COP3330, *head, *tail; 

    COP3223 = CreateList("COP3223", "Intro to Programming with C", "College of Engineering and Computer Science", 3); 
    COP3502C = CreateList("COP3502C", "Computer Science I", "College of Engineering and Computer Science", 3); 
    COP3503C = CreateList("COP3503C", "Computer Science II", "College of Engineering and Computer Science", 3); 
    COP3330 = CreateList("COP3330", "Object Oriented Programming", "College of Engineering and Computer Science", 3); 

    head = COP3223; 

    COP3223->next = COP3502C; 
    COP3502C->next = COP3503C; 
    COP3503C->next = COP3330; 
    COP3330->next = tail; 
    tail->next = NULL; 

    while(head->next != NULL) 
    { 
     WalkListAndDisplay(head); 
     head = head->next; 
    } 

    return 0; 
} 
+1

あなたはどちらか、 'ポイントにtail'ポインタ、およびなし初期値のための任意のメモリを割り当てていません。あなたのコードから、 'tail 'は本当に必要ではありません。単に' COP3330-> next'を 'NULL'にするだけです。 – SSC

+0

まず、セミノール州立大学のSSCは何ですか?第二に、もし私がそれを行うなら、NULLに達すると私のwhileループが停止するので、COP3330の最後のデータは表示されません。その他の提案はありますか? –

+0

whileループを 'while(head!= NULL)'に変更する必要があるようです。あなたのコードに 'tail 'を付けることはバグを隠していました。 – vestlen

答えて

0

あなたwhileループは、それが次のノードをチェックしています、それを印刷しようとする前に、ヌルのため、現在のノードをチェックされていません。ここで注文を考えると、「次のノードが利用可能なので、現在のものを印刷してください」というようなものです。これは、リストの終わりに来ると、ノードの後に​​ノードがないため、ノードが早く完了したと考えられることを意味します。代わりに、 "現在のノードが利用可能なので、それを印刷してから前に進んでください。"

あなたのtail変数は、SSCが指摘しているように、必要ではなく、リストの最後のノードにNULL以外の何かがあることによって実際にこのバグが隠されていました。これにより、最後のノードで条件が真になりました。 head->nextはNULLポインタを逆参照してしまったため、あなたのコードは空のリストでクラッシュしていました。

tailを削除し、これにあなたのwhile文を変更します。

while(head != NULL) 
{ 
    WalkListAndDisplay(head); 
    head = head->next; 
} 
+0

ワンダフル!ご説明ありがとうございます! –

+0

@MikeKooferよくあること。ところで、私はあなたの新しいユーザーを見る。これまたは任意の回答があなたの質問を解決した場合は、チェックマークをクリックして[受諾](http://meta.stackexchange.com/q/5234/179419)を検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 – vestlen

+0

私はチェックマークについて考えていませんでした。情報ありがとうございました! –

関連する問題