0

Bu programı hiçbir uyarı olmadan nasıl yapabilirim ... Uyarı için kuyruk başlatılmamış olarak kalıyor. Fonksiyonumu her seferinde farklı bir parametreyle aramak zorunda kalmadan tüm verilerimi çıkaran bir döngü oluşturmaya çalışıyorum. Kuyruk = COP3330'a ayarlıyorum, o zaman COP3330 bilgisini basmıyor çünkü o zaman = NULL. Teşekkür ederim!Veri Yapılarının Verilmesi ve Bir Veri Yapısına Bilgi Aktarılması

#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

Sen 'noktasına tail' pointer ve hiçbir başlangıç ​​değeri için herhangi bir bellek ayrılamadı değil de değilim. Kodunuzdan gerçekten "kuyruğa" ihtiyacınız yok, "COP3330-> sonraki" yi "NULL" olarak ayarlayabilirsiniz. – SSC

+0

İlk olarak, SSC, Seminole Eyalet Koleji'ni temsil ediyor mu? İkincisi, bunu yaparsam COP3330 için son veriyi yazdırmaz, çünkü while döngüsüm NULL'e ulaştığında durur. Başka önerileriniz var mı? –

+0

Zaman döngüsünüzü “while (head! = NULL)” olarak değiştirmelisiniz. Kodunda 'kuyruk' olması bir böcek saklıyordu. – vestlen

cevap

0

Sizin while döngü bir sonraki düğümü kontrol ediyor, onu yazdırmayı denemeden önce null geçerli düğümü kontrol etmiyor. Buradaki düzeni düşündüğünüzde, "Bir sonraki düğüm mevcut, yani mevcut olanı yaz." Bu, listenin sonuna geldiğinde, bir düğümün daha erken yapıldığını, çünkü bundan sonra düğüm olmadığını gösterir. Bunun yerine, "Geçerli düğüm kullanılabilir, bu yüzden yazdırın ve sonra ileri adım atmalıdır."

SSC'nin işaret ettiği gibi, tail değişkeniniz gerekli değildir ve aslında bu hatayı, NULL'nin yanı sıra, NULL'nin işaret etmesi gereken bir öğeye sahip olmanız nedeniyle, bu hatayı gizliyordu. Bu, son düğüm için doğru durumdayken kusurlu hale getirdi. head->next'un bir NULL işaretçisini kaldırması nedeniyle kodunuz boş bir listeyle kilitlenirdi.

tail çıkarın ve bu şekilde while deyimi değiştirin:

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

Harika! Açıklama için teşekkürler! –

+0

@MikeKoofer Elbette. Bu arada, yeni bir kullanıcı görüyorum. Eğer bu veya herhangi bir cevap sorunuza cevap verdiyse, lütfen [kabul etmek] (http://meta.stackexchange.com/q/5234/179419) onay işaretini tıklayarak düşünün. Bu, bir çözüm bulduğunuz ve hem yanıtlayıcıya hem de kendinize bir takım saygınlık kazandıran daha geniş bir topluluğa işaret eder. Bunu yapmak için bir zorunluluk yoktur. – vestlen

+0

Onay işareti hakkında hiçbir fikrim yoktu. Bilgi için teşekkürler! –