Liste



  • Hallo,

    ich habe mir eine Liste programmiert, aber die Ausgabe stimmt nicht so richtig,
    Weiß vielleicht jemand, was da nicht richtig ist,
    das unten ist ein vollständiges Programm.

    Vielen Dank für Eure Hilfe!!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct SPJob
    {
    	int pid;
    	char text[20];
    	SPJob *next;
    }SPJob;
    
    SPJob *first = NULL;
    SPJob *spJob = NULL;
    void push(unsigned int, char *);
    void pop(void);
    void printQueue(void);   
    
    int main(void)
    { 
    	push(1, "push 1");
    	push(2, "push 2");
    	push(3, "push 3");
    	push(4, "push 4");
    	printQueue();
    	pop();
    	pop();
    	pop();
    	printQueue();
    	push(5, "push 5");
    	push(6, "push 6");
    	push(7, "push 7");
    	printQueue();
    	return 0;
    }
    
    void push(unsigned int pid, char *text)
    {
    	if (first == NULL)
    		{
    		first = ((SPJob * )malloc(sizeof(SPJob)));
    		first->pid = pid;
    		strcpy(first->text, text);
    		first->next = NULL;
    		}
    	else	
    		{
    		spJob = first; 
    		while (spJob->next != NULL)
    			spJob = spJob->next;
    		spJob->next = ((SPJob *) malloc(sizeof(SPJob)));
    		spJob->next->pid = pid;
    		strcpy(spJob->next->text, text);
    		spJob->next->next = NULL;
    		}
    
    }
    
    void pop(void)
    {
    	spJob = first;
    	while (spJob->next != NULL)
    		spJob = spJob->next;
    	spJob = NULL;
    	free(spJob);
    }
    
    void printQueue(void)   // hier wird immer die gánze Liste ausgegeben,auch wenn ich
    // mit pop einen eintrag weggenommen habe ????
    {
    	spJob = first;
    	while(spJob != NULL)
    		{
    		printf("%d, %s\n", spJob->pid, spJob->text);
    		spJob = spJob->next;
    		}
    }
    


  • haste mal versucht, in der funktion pop() den aufruf von

    spJob = NULL;
        free(spJob);
    

    umzudrehen in

    free(spJob);
    spJob = NULL
    

    weil meines erachtens wird da zuerst der zeiger von spJob (der vermutlich auf dem richtigen element steht) auf den null-pointer umgebogen und anschließend dieser freigegeben. anders rum hätte es mehr sin, zuerst den aktuellen speicher, auf den der zeiger zeigt freigeben und dann auf NULL setzen.
    weiß jetz nicht, ob ich mich täusche, könnte aber so sein.



  • Hab ich schon versucht, geht aber auch nicht,

    vielleicht wills ja jemand ausprobieren,

    Von der Logic her dürfte das Programm ja OK sein oder???

    lg und vielen Dank



  • Du mußt auch den Vorgänger des letzten Elements anpassen, wenn du es gelöschst hast:

    first -> E1 -> E2 ->...-> En-1 -> En -> 0
                                      ^
                                    spJob
    

    spJob wurd auf NULL umgebogen, der next-Zeiger in En-1 zeigt weiterhin auf das gelöschte Element.



  • Bis auf der Tatsache, dass du globale Variablen benutzt (was in diesem Fall nicht notwendig ist), solltest du dein struct so definieren:

    typedef struct SPJob 
    { 
        int pid; 
        char text[20]; 
        struct SPJob *next; // <-- hier der Unterschied
    }SPJob;
    

    2. malloc wird in C nicht gecastet.

    3. Man muss immer überprüfen, dass malloc nicht NULL zurückgeliefert hat.



  • malloc gibt ja eine void- Pointer zurück und muss gecastet werden, so habs ich halt gelernt,

    Ich brings einfach nicht zum laufen, ich habe bei next struct dazugeschrieben aber in pop haut irgendwas nicht hin,

    kann mir da noch jemand weiterhelfen,

    vielen Dank für Eure Antworten,

    lg



  • PollerCPP schrieb:

    malloc gibt ja eine void- Pointer zurück und muss gecastet werden, so habs ich halt gelernt,

    das ist aber falsch. einen void* kannst du jedem anderen pointer zuweisen, ohne dass gecastet werden muss.
    🙂



  • ok,
    aber was bei meiner Liste falsch ist, ist mir unklar,
    Weiß da jemand eine Rat?

    lg



  • Ja, siehe mein voriger Beitrag - du mußt die richtigen Zeiger umbiegen, wenn du ein Element löschst.



  • Vielen Dank für eure Antworten -> ich habs!!

    lg


Anmelden zum Antworten