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 JohnnyP.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.