Probleme mit struct und doppelt verknüpften Listen



  • Hi

    Ich sitz hier grad an einem für mich als C-Neuling verdammt kniffligem Problem, ich post einfach mal den Code, die komplette Aufgabenstellung ist darin enthalten:

    #include <stdio.h>
    
    #include <stdlib.h>
    
    /*Implementierung einer Prozessverwaltung:
    
    Implementieren Sie die durch das Framework vorgegebene Prozessverwaltung,
    
    die eine Menge von Prozessen aus der Datei prcs.dat auslesen,und diese
    
    in eine doppelt verkettete Liste einfuegen soll.
    
    Nun soll Prozess um Prozess der Reihenfolge ihrer ids entsprechend 
    
    aus der Liste entfernt werden,wobei die uebrig gebliebenen Prozesse in jeder
    
    Iteration ausgegeben werden.
    
    Die Prozesse sind in der Datei prcs.dat Zeile fuer Zeile in der Form:
    
        ProzessId,Ankunftszeit,Ausfuehrungszeit
    
    gespeichert.    
    
    */
    
    struct pData //Daten der doppelt verketteten Liste
    
    {
    
     int pId;//ProzessID
    
     int aTime;//Ankunftszeit
    
     int sTime;//Ausfuehrungszeit
    
      /*TODO:Struktur vervollstaendigen */
    
     struct pData *prev;
    
     struct pData *next;
    
    };
    
    //Um Tipparbeit zu sparen
    
    typedef struct pData PROCESS;
    
    typedef PROCESS *LINK;
    
    LINK findNextProcess(LINK head);
    
    void addProcess(LINK head,LINK neu);
    
    void deleteProcess(LINK current);
    
    void printPr(LINK current);//Methode zur Ausgabe eines Prozesses
    
    void printList(LINK head);//Alle Prozesse der Liste ausgeben
    
    void readProcesses(LINK head);//Einlesen der Prozesse
    
    int main(void)
    
    {
    
     LINK next;
    
     LINK head;
    
    /*TODO:head initialisieren*/
    
     PROCESS headData = {-1,-1,-1,NULL,NULL};
    
     head = &headData;
    
     head->next = head;
    
     head->prev = head;
    
    /*TODO:head initialisieren*/
    
     readProcesses(head);
    
     while(head->next!=head)
    
     {
    
       printList(head);                     
    
       next=findNextProcess(head);
    
       deleteProcess(next);                   
    
     } 
    
    return 0;
    
    }
    
    /*==========================================================================
    
    Implementierung der Methoden*/
    
    //Liest die Prozesse ein und erstellt die Liste
    
    void readProcesses(LINK head)
    
    {
    
     /*TODO:implementieren*/
    
     FILE *prcstable;
    
     char *buffer = malloc(sizeof(*buffer)*100);
    
     int pId, aTime, sTime;
    
     LINK neu;
    
     PROCESS neuData = {-1,-1,0,NULL,NULL};
    
     neu = &neuData;
    
     prcstable = fopen("./prcs.dat","r");
    
     if (prcstable == NULL) perror("Keine Prozesstabelle gefunden"); 
    
     while(!feof(prcstable))
    
     {
    
      fgets(buffer,100,prcstable);
    
      sscanf(buffer,"%d%d%d",&pId,&aTime,&sTime);
    
      neu->pId = pId;
    
      neu->aTime = aTime;
    
      neu->sTime = sTime;                     
    
      addProcess(head,neu);
    
     }
    
     fclose(prcstable); 
    
    }
    
    //Einen Prozess an das Ende der Liste (also vor head) einfuegen
    
    void addProcess(LINK head,LINK neu)
    
    {
    
     /*TODO:implementieren*/
    
     neu->prev = head;
     neu->next = head->next;
     head->next = neu;
    
     if(head->prev == head) head->prev = neu;
    }
    
    //Loeschen des angegebenen Knotens
    
    void deleteProcess(LINK current)
    
    {
    
     /*TODO:implementieren*/
    
    }
    
    /*gibt den Prozess mit der kleinsten Id aus der Liste zurueck*/
    
    LINK findNextProcess(LINK head)
    
    {
    
     /*TODO:implementieren*/
    
    }
    
    /*Ausgabemethoden fuer die Prozesse und die gesamte Liste*/
    
    void printPr(LINK current)
    
    {
    
     printf("\n pId:%d arrival time:%d service time:%d\n ",current->pId,current->aTime,current->sTime);
    
    }
    
    void printList(LINK head)
    
    {
    
         printf("\n\n Current QUEUE of PROCESSES ---------------------------------------\n\n");
    
         LINK curr=head->next;
    
         while(curr!=head)
    
         {           
    
          printPr(curr);  
    
          curr=curr->next; 
    
          printPr(curr);                     
    
         }     
    
    }
    

    Anhand von den TODOs könnt ihr sehen was von mir ist und was vorgegeben war. Es ist natürlich noch nicht alles implementiert aber das Problem ist, soweit ich das beurteilen kann, dass das Programm in dieser Schleife festhängt:

    while(curr!=head)
    
         {           
    
          printPr(curr);  
    
          curr=curr->next; 
    
          printPr(curr);                     
    
         }
    

    die einzige Ausgabe ist nämlich:
    pId:0 arrival Time:0 serviceTime:4196740
    und das immer wieder in einer Endlosschleife, irgendein Problem mit falschen Pointern wirds wohl sein, weiter weiss ich aber auch nicht..

    Wenn ich das richtig verstanden habe soll die Prozessliste wohl ringförmig aufgebaut sein, wie gesagt der Kommentar oben ist die komplettte Aufgabenstellung.

    Ich wäre für jede Hilfe dankbar, fragt wenn was fehlt
    mfg Johnny

    P.S.: achja prcs.dat liegt im gleichen Ordner wie das Programm und sieht folgendermassen aus:

    1,2,3
    
    4,5,6
    
    2,4,3
    
    3,4,2
    

    (keine newlines oder whitespaces)



  • Wir haben doch das Blackboard, da kannste auch Fragen stellen 😉
    Es gibt auch Entwicklungsumgebungen für den GCC. Da kannst du Schritt für Schritt die ANweisungen verfolgen und die Werte der Variablen überprüfen.
    Ich glaube Code::Blocks unter Windows ist sone Umgebeung auf Basis des GCC.

    Gruß (womöglich dein Tutor) Markus



  • Ich dachte immer, man kennzeichnet keinen Vorgänger/Nachfolger in verketteten Listen mit NULL, was du aber nicht machst.


Anmelden zum Antworten