ordnen



  • hallo
    ich habe ein array int* array[N] dort könnnen NULL zeiger enthalten sein.
    gibt es eine funktion, die mir alle elemente die nicht NULL sind nach vorn holt?
    das zum schluss der inhalt so aussieht:
    array[0] != NULL
    array[1] != NULL
    array[2] != NULL
    ...


    ...
    array[N-1] == NULL


  • Mod

    qsort? Oder ist die Reihenfolge der nicht-NULL-Werte egal? Falls sie egal ist, geh doch einfach durch und tausch sie nach hinten, das ist ein Zweizeiler.



  • die reihenfolge der nicht NULL element soll bleiben, aber alle NULL elemente sollen nach hinten.
    zweizeiler, hmm ..ok ich gucke mal



  • Das ist im Prinzip das gleiche Problem wie bei http://www.c-plusplus.net/forum/311253 und http://www.c-plusplus.net/forum/311418.

    Du brauchst zwei Zähler/Zeiger für das Array. Einen zum lesen und einen zum schreiben.

    Du gehst durch das Array und kopierst von dem Lesezeiger zum Schreibzeiger.
    Wenn die Quelle aber NULL ist, erhöst du nur den Lesezeiger, sonst beide.

    So werden alle Nullzeiger erstmal überschrieben.
    Wenn du das Ende vom Lesezeiger erreicht hast, musst du nur noch den Rest des Schreibzeigers mit NULL auffüllen.



  • #define M 10
    	int i, j, k=0;
    	int* arr[M]={&i,0,&i,0,&i,0,&i,0,&i,0};
    
    	for(i=0;i<M;i++)
    	{
    		if(arr[i]==NULL)
    		{
    			if(!k)k=i+1;
    			for(j=k;j<M;j++)//finde nächsten zeiger != NULL
    			{
    				if(arr[j]!=NULL)
    					break;
    			}			
    			if(j<M)
    			{
    				arr[i]=arr[j];
    				arr[j]=NULL;
    				k=j+1;
    			}
    			else
    				break;
    		}
    	}
    

    in zwei zeilen hab ich es nicht hinbekommen aber vllt denke ich zu kompliziert.
    dafür hab ich fast 2 stunden dran gesessen, ich glaube programmieren ist nicht gerade meine stärke 😃
    wenn jemand eine bessere idee hat bitte posten.



  • markolr schrieb:

    wenn jemand eine bessere idee hat bitte posten.

    DirkB hat eine bessere Idee gepostet. Wie wäre es, wenn du die umsetzt?



  • int i, j;
    for(i=0,j=0;i<M;i++)
    {
      if(arr[i] != NULL)
        arr[j++] = arr[i];
    }
    for(;j<M;j++)
      arr[j] = NULL;
    

    Ich denke das reicht.



  • völlig geil! vielen dank! 👍
    du hast es ja so in etwa beschrieben aber ich hatte es nicht verstanden, danke noch mal!


Anmelden zum Antworten