Sortieren einer LIST anhand eines Pointers?`??

MOin,

also i ch hab ne verkettete liste, dort werden strings abgespeichert.

nun habe ich den AnfangsPointer der Liste und muss alle strings der liste, also alle Elemente sortieren.
wie mach ich das...??

Code:
#include <stdio.h>

char *strings[] = { "3bl-2", "4bl-2", "1bl-1", "2bl-3", "5bl-2" };

	

int main (int argc, char *argv[])
{
	
			
		
        int i,n;
        char *tmp;
        for (i=0; i<=4; i++)
                printf("%i %s \n", i, strings[i]);
        /* Bubblesort ... */
		
		printf("\n");
        for (i=; i<=4; i++) {
                if (strcmp((const char*) strings[i-1], (const char*) strings[i]) > 0) {
                        tmp = strings[i-1];
                        strings[i-1] = strings[i];
                        strings[i] = tmp;
                }
        }
        for (i=0; i<=4; i++)
                printf("%i %s \n", i, strings[i]);
        return 0;
}


--> So sortiere ich nur die Strings ohne die Verwendung von Pointern. Ich muss aber dass ganze mit nem pointer machen.. kann mir jemand bitte helfen? weiß echt nicht wie ich etzt die ganzen elemente durch laufe, die strings aus der liste raushole miteinander vergleiche und soo alles ordne.. am schluss sollte ich einfach wenn ich wieder mit dem Anfangspointer durchlaufe ne geordnete liste haben.
 
Naja du musst bedenken, dass es wesentlich schneller ist Pointer umzuhängen als Strings umzukopieren, das ist erstmal der Sinn.

Wenn die Strings immer gleichlang sind, kannst du den Folgepointer errechnen.
Ansonsten beim ersten Anfangen und bis \n scannen und dann +1 ist der nächste.
Oder du baust einen Datentyp der einen String und einenPointer auf den Folgestring enthält.
 
ja klar.. aber wie hänge ich nun zum beispiel die pointer um, wenn eine string vom 4. elemente, an stelle des 2. elements muss?

und es muss doch möglich sein, das ganze direkt über pointer zu vergleichen.... hätte da an sowas gedacht...:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

		struct person {
		char name[20];
		struct person *next;   // Zeiger auf nächstes Element
		};
		
		
/*typedef struct daten PERSON;
typedef daten *LINK;
*/
int main (int argc, char *argv[])
{

	
	struct person *zeiger;
	struct person *anfang;
	struct person *zw;
	anfang = NULL;
	zeiger = NULL;
	zw = NULL;
	
	
	
	anfang = (struct person*)malloc(sizeof(struct person));
	anfang->next = NULL;
	strcpy(anfang->name, "Kerim");
	
	
	
	anfang->next = (struct person*)malloc(sizeof(struct person));
	zeiger = anfang->next;
	strcpy(zeiger->name, "Daniel");
	
	
	zeiger->next = (struct person*)malloc(sizeof(struct person));
	zeiger = zeiger->next;
	strcpy(zeiger->name, "Stadelmann");
	
	zeiger->next = (struct person*)malloc(sizeof(struct person));
		zeiger = zeiger->next;
	strcpy(zeiger->name, "Schüler");
	
	zeiger->next = NULL;
	
	
	
	struct person *buffer;
	buffer = anfang;
	struct person *buf;
	buf = anfang;
	struct person *buf2;
	buf2 = anfang;
	
	int count = 0;
	buf2 = buf2->next;
	struct person *tmp;
	tmp = NULL;
	
	 while (anfang != NULL)
     {
         printf("%s\n", anfang->name);
         anfang = anfang->next;
		 count++;
     }

	
	 	
	   printf("\n");	
	   printf("%i\n", count);	
  	   printf("\n");
   
	 
	        int i;
	 	 for (i=1; i<=count-1; i++) 
		{
			
				//Bubblesort
                if (strcmp((const char*) buf->name, (const char*) buf2->name) > 0) 
		{
                        tmp = buf;
                        buf = buf2;
                        buf2 = tmp;
                 }
				
				buf = buf->next;
				buf2 = buf2->next;
                }
		     
		

	 while (buffer != NULL)
     {
         printf("%s\n", buffer->name);
        buffer = buffer->next;
	
     }
	 
     printf("\n");		
		
		
		return 0;
		
	}


aber irgendwie funzt das ganze nicht ganz.... ich weiß nicht ob die List auch wirklich geordnet wird...
 
Warum so kompliziert...
Wenn das eingangs gepostete Programm schon zur Zufriedenheit funktioniert, tausche doch einfach die Direktzugriffe auf die Strings durch Zugriffs über eine Pointerliste aus.
Dazu mußt Du nur eine einzige Programmzeile ergänzen (für die Pointerliste) und das Tauschen der Strings gegen das Tauschen der Pointer substituieren (und natürlich den "Zugriff auf die Strings über nur den Index" durch den "Zugriff über den Index auf die Pointer auf die Strings"...). Die Programmstruktur kannst Du aber komplett wie im Original lassen und diese schreckliche Verkomplizierung vermeiden.
 
Wenn du bis heute Abend warten kannst, kann ich dir ein Code-Beispiel geben. Hab von der Arbeit aus keinen Zugriff auf den abgeschalteten Laptop zu Hause :)
 
Dein eigener Code (habe ihn aber nicht compiliert) auf Pointer modifiziert (sollte lookshe nicht von einer Anregung abhalten):

Code:
#include <stdio.h>

char *  strings[] = { "3bl-2", "4bl-2", "1bl-1", "2bl-3", "5bl-2" };

int main (int argc, char *argv[])
{
	int i,n;
	char *tmp;

	char * * stringptr[5];

	for (i=0; i<=4; i++) stringptr[i] = &strings[i];

	// alt: for (i=0; i<=4; i++) printf("%i %s \n", i, strings[i]);
	for (i=0; i<=4; i++) printf("%i %s \n", i, *(stringptr[i]));

	/* Bubblesort ... */
	// Dein Bubblesort wird mit einem einzelnen Durchgang allerdings nicht viel sortieren...
	// Versuch Dich ruhig mal daran, die Funktion qsort aus der Laufzeitbibliothek zu verwenden!
	
	printf("\n");
	for (i=; i<=4; i++)
	{
		// alt:
		//if (strcmp((const char*) strings[i-1], (const char*) strings[i]) > 0)
		//{
		//	tmp = strings[i-1];
		//	strings[i-1] = strings[i];
		//	strings[i] = tmp;
		//}

		if (strcmp(*(stringptr[i-1]), *(stringptr[i])) > 0)
		{
			tmp = stringptr[i-1];
			stringptr[i-1] = stringptr[i];
			stringptr[i] = tmp;
		}
	}

	// alt: for (i=0; i<=4; i++) printf("%i %s \n", i, strings[i]);
	for (i=0; i<=4; i++) printf("%i %s \n", i, *(stringptr[i]));

	return 0;
}
 
Hab ich doch glatt vergessen den Code zu posten. Sorry.

Im unteren Teil ist die Sortierung der Liste, die rekursiv eingelesen wird. Das neue Element wird jeweils an die richtige Position verschoben. Ich hoffe es ist verständlich, will den Code jetzt nicht zurechtschneiden.

Die Kommentare wegen testen bitte ignorieren, sind noch drin, ist aber getestet.

Code:
ConsumptionDataList* kons_dat_erfassen() {
    ConsumptionDataList* list;
    int bool = 1;
    int in = 0;
    int temp = 0;
    char* input;
    list = (ConsumptionDataList*) malloc(sizeof(ConsumptionDataList));
    input = read_string("Getraenk");
    if (input == NULL) return NULL; else strcpy((*list).drink.name, input);
    while (bool) {
        input = read_string("Menge (ml)");
        if (input != NULL) {
            in = sscanf(input, "%d", &temp);
            if ( in == 1 ) bool = 0;
        }
    }
    bool = 1;
    (*list).drink.quantity = temp;
    
    while (bool) {
        input = read_string("Vor wievielen Minuten wurde das Getraenk konsumiert");
        if (input != NULL) {
            in = sscanf(input, "%d", &temp);
            if ( in == 1 ) bool = 0;
        }
    }
    bool = 1;
    (*list).drink.time = temp;
    
    (*list).next = kons_dat_erfassen();
    
    /* Sortieren nach Zeit, muss noch geprueft werden!!! */
    
    if ((*list).next != NULL)
    {
        ConsumptionDataList* run = (*list).next;
        ConsumptionDataList* save = list;
        ConsumptionDataList* last = save;
        bool = 1;
        
        while (bool)
        {
            if (run == NULL || (*list).drink.time > (*run).drink.time)
            {
                list = (*list).next;
                (*last).next = save;
                (*save).next = run;
                
                bool = 0;
            }
            if (bool)
            {
                last = run;
                run = (*run).next;
            }
        }
    }
    return list;
}
 
Hmmm, lange keine Reaktion mehr...?

Eventuell nochmal nachgehakt: Im originalen Quelltext war je nun keine "verkettete Liste" zu sehen. War das durch ein Mißverständnis verursacht, oder war der Originaltext nicht der zur Diskussion stehende? In letzterem Fall würde es vielleicht lohnen, den Text MIT der verketteten Liste mal zu posten?
 
Zurück
Oben