Struktur Zeiger auf Zeiger zuweisungsfrage



  • Tag Leute, min grade dabei ein Mergesort Programm(einfach verkettete Liste) zu schreiben hab aber Verständnisprobleme mit dem Zeiger auf Zeiger.

    In Zeile 34 erzeuge ich einen Zeiger auf Zeiger.
    Er ist dafür gedacht sich bis zum Ende der Liste durchzuhangeln damit ich das nächste Element am Ende der neuen Liste einsetzen kann bzw. den Zeiger aus einer der Listen umleite.
    Leider komme ich mit dem Handling nicht ganz klar. 😞
    Grob gesagt Zeile 47 bis 63.
    Mir ist durchaus klar, dass ich einfach einen Zeiger erstellen kann der immer auf das Ende der Liste zeigt. Will es aber mit dem Zeiger auf Zeiger lösen.

    typedef struct liste{
    	int groesse;
    	struct element *erstes;
    }list;
    
    typedef struct element {
    	double zahl;
    	struct element *next;
    }ele;
    
    list mergesort(list liste){
    	if(liste.groesse <= 1){
    		return liste;
    	}
    	else{
    		//neien Element Zeiger erzeugen
    		ele *ZeigerAufEle;
    		//Den neuen Zeiger auf das Erste Element verweisen
    		ZeigerAufEle=liste.erstes;
    		//Den neuen Zeiger an die suche Ele übergeben
    		ZeigerAufEle=sucheEle(ZeigerAufEle, liste.groesse/2+liste.groesse%2);
    		//Listenkopf Recht erzeugen
    		list ListeRechst;
    		ListeRechst=listinit();
    		//An die rechte Liste die Hälfte der liste zuweisen
    		ListeRechst.erstes=ZeigerAufEle->next;
    		//Größenangabe der rechten liste anpassen
    		ListeRechst.groesse=liste.groesse/2;
    		//Größenangabe der Linken Liste anpassen, bei ungeraden zahlen ist diese um ein Element größer
    		liste.groesse=liste.groesse/2+liste.groesse%2;
    		//Die liste in der Mitte auf Null Setzen. Jetzt hat man zwei listen
    		ZeigerAufEle->next=NULL;
    
    		ListeRechst=mergesort(ListeRechst);
    		liste=mergesort(liste);
    		return merge(liste, ListeRechst);
    	}
    }
    
    list merge(list linke, list rechte){
    	list neueListe;
    	neueListe=listinit();
    	neueListe.groesse=linke.groesse+rechte.groesse;
    	ele **ppEle;
    	//Speicherreservierung für den Zeiger auf Zeiger
    	ppEle=(ele**)malloc(sizeof(ele));
    	//solange (linkeListe und rechteListe nicht leer)
    	while(linke.erstes!=NULL && rechte.erstes!=NULL){
    		//falls (erstes Element der linkeListe <= erstes Element der rechteListe)
    		if(linke.erstes->zahl<=rechte.erstes->zahl){
    			//dann füge erstes Element linkeListe in die neueListe hinten ein und entferne es aus linkeListe
    			//sucht das ende der neuenListe
    			if(neueListe.erstes==NULL){
    				neueListe.erstes=linke.erstes;
    				linke.erstes=linke.erstes->next;
    				neueListe.erstes->next=NULL;
    				ppEle=&neueListe.erstes;
    			}
    			else{
    				//Ende der neuenListe finden bzw bis zum ende durchhangeln
    				while(ppEle!=NULL){
    					(*ppEle)=(*ppEle)->next;
    				}
    				(*ppEle)->next=linke.erstes;
    				linke.erstes=linke.erstes->next;
    				(*ppEle)->next=NULL;
    			}
    		}
    		else{
    			//sonst füge erstes Element rechteListe in die neueListe hinten ein und entferne es aus rechteListe
    			while(ppEle!=NULL){
    				ppEle=&(*ppEle)->next;
    			}
    		}
    	}
    	return neueListe;
    }
    
    ele *sucheEle(ele *pEle, int anzahl){
    	//ele *pGesucht;
    	//pGesucht=(ele*)malloc(sizeof(ele));
    	//pGesucht=pEle;
    	int i;
    	for (i=2; i<=anzahl; i++){
    		if(pEle->next !=NULL)
    			pEle=pEle->next;
    	}
    	return pEle;
    }
    

    Dakne für die Hilfe.



  • Servus,

    a bisserl confus ist des schon, was Du da machst. Mir ist aufgefallen:

    ppEle=(ele**)malloc(sizeof(ele));
    

    Wozu das? Den speicher nutzt du nie wieder, denn:

    ppEle=&neueListe.erstes;
    

    Ausserdem willst Du ja 'nen Zeiger auf 'nen Zeiger also so:

    ppEle=(ele**)malloc(sizeof(ele *));
    

    Was soll dieser Unfug?

    while(ppEle!=NULL){
                    ppEle=&(*ppEle)->next;
                }
    

    Schneller geht's so:

    ppEle = NULL;
    

    Und das da:

    while(ppEle!=NULL){
                        (*ppEle)=(*ppEle)->next;
                    }
    

    Solltest Du auch überdenken. Das erzeugt eine Endlosschleife und Du schrottest Dir neueListe.erstes, da ja ppEle immer noch darauf zeigt.

    Mach dir mal lieber 'nen neuen Code. Der da ist Müll.

    mfg Martin



  • Ok, dass der Code schlecht ist sehe ich ein.
    unabhängig davon hab ich folgendes gesucht.

    while(*ppEle!=NULL){
    			(ppEle)=&((*ppEle)->next);
    }
    


  • Alex4nder schrieb:

    Ok, dass der Code schlecht ist sehe ich ein.
    unabhängig davon hab ich folgendes gesucht.

    while(*ppEle!=NULL){
    			(ppEle)=&((*ppEle)->next);
    }
    

    Nicht gefunden?

    Zeile 61-63.

    Kenne ich etwa Deinen Code besser wie Du selbst?

    mfg Martin


Anmelden zum Antworten