Einfach Verkettete Liste sortieren



  • guten tag leute wir haben folgendes problem und wissen nicht wie wirs angehen sollen. wir müssen aus einer textdatei buchstaben auslesen und als erstes alle in eine linked list geben und anschließend die liste nach vorkommen der buchstaben sortieren sodass zb a mit anz 10 als oberstes steht, danach absteigend die buchstaben nach unten inkl ihrer anzahl.

    die liste haben wir erstellt und eine fktion zum ausgeben der buchstaben.
    nur haben wir nun keine ahnung wie man die liste sortiert.

    bisher haben wir folgenden code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <getopt.h>
    
    // structure ...
    
    struct data
    {
        char value;
        int  count;
        struct data *pNext;
    };
    struct data *pHead, *pNew, *pTemp, *pNext;
    
    // function prototypes ...
    
    void list_output(void);
    void selection(void);
    
    int main (int argc, char *argv[])
    
    {
        char ifilename[20];
        char ofilename[20];
        int opt;
        int helpa = 0;
        int helpb = 0;
        char string[255];
        int newvalue = 0;
        int offlist = 0;
        int xxx = 0;
        int xmax = 0;
        int array[100];
    
        pHead = NULL;
        pNext = NULL;
        FILE *pFile;
        FILE *pFileout;
    
        // read input parameter //
    
        while ((opt = getopt (argc, argv, "i:o:")) != -1)
        {
            switch (opt)
            {
            case 'i':
                strcpy(ifilename, optarg);
                helpa = 1;
                break;
    
            case 'o':
                strcpy(ofilename, optarg);
                helpb = 1;
                break;
    
            case ':':
    
                fprintf(stderr, "the used option %c needs a value\n", optopt);
                exit (EXIT_FAILURE);
                break;
    
            case '?':
                fprintf(stderr, "error - no such option: %c\n", optopt);
                exit (1);
    
            }
    
            if (helpa == 1)
            {
                printf("argument ifilename with value -%s was given\n", ifilename);
            }
            if (helpb == 1)
            {
                printf("argument ofilename with value -%s was given\n", ofilename);
            }
        }
    
        //open file//
    
        pHead = NULL;
        pFile = fopen(ifilename, "r");
        if (pFile == NULL)
        {
            perror("can't open input file ...");
        }
    
        pFileout = fopen(ofilename, "w");
        if (pFileout == NULL)
        {
            perror("can't open output file ...");
        }
    
    while((xxx = fgetc(pFile)) !=EOF)
    {
    
    //linked list ...
    
            if (pHead==NULL)
            {
                pNew=(struct data*)malloc(sizeof(struct data));
    
                if (pNew==NULL)
                    exit (EXIT_FAILURE);
    
                pNew->pNext=NULL;
                pHead=pNew;
                pNew->value=xxx;
                pNew->count=1;
                newvalue = xxx;
                pTemp = pHead;
                xmax = 1;
    
                // check if newvalue is on list
            }
            else
            {
                pTemp = pHead;
                while (1)
                {
                    if (pTemp->value==xxx)
                    {
                        pTemp->count++;
                        break;
                    }
                    else
                    {
                        if (pTemp->pNext==NULL)
                        {
                            offlist=1;
                            break;
                        }
                        else
                        {
                            pTemp=pTemp->pNext;
                        }
                    }
                }
                if (offlist==1)
                {
                    pNew = (struct data*)malloc(sizeof(struct data));
                    if (pNew==NULL)
                        exit (EXIT_FAILURE);
                    pTemp->pNext=pNew;
                    pNew->pNext=NULL;
                    pNew->count=1;
                    pNew->value=xxx;
                    offlist=0;
                    pTemp=pTemp->pNext;
                    xmax++;
    
                }
    
            }
    
    }
    
    list_output();
    
    return 0;
    }
    
    void list_output(void)
    {
    
        struct data *pH = pHead;
    
        while(pH != NULL)
        {
        pH->value;
        pH->count;
        printf("%c:\t%d\n", pH->value, pH->count);
        array = 
        pH=pH->pNext;
        }
    
    }
    
    }
    

    vl kann uns wer das codefragment geben mit dem wir die liste sortieren koennen. anschließend soll sie in einen baum aufgenommen werden davon haben wir ebenfalls noch keine genaue vorstellung.

    ich hoffe irgendwer hat nen tipp für uns, würden uns sehr freuen da wir schon ewig herumprobieren und nicht viel weiterbringen...

    lg und danke



  • Versucht den Quelltext mal mit System und übersichtlich zu formatieren.
    Da solltet ihr eine Ungereimtheit schon erkennen.

    Und nehmt den C/C++ Button statt des Code, wenn ihr C oder C++ Quelltext hier einstellt.

    MfG f.-th.



  • c_beginner schrieb:

    nur haben wir nun keine ahnung wie man die liste sortiert.

    vorzugsweise sortiert man gleich beim aufbau der liste, indem man sortiert einfügt. das ganze nennt sich dann sortieren durch einfügen. aber auch im nachhinein ist das kein problem, wähle ein beliebiges element der liste als erstes element und führe ein "sortieren durch einfügen im nachhinein" aus.

    es gibt mehrere denkbare varianten, das ist zumindest eine davon.

    🙂



  • kannst du uns vl ein programmstück reingeben?

    wir stehen da echt an kommen grade überhaupt nicht weiter.

    aber danke für deine hilfe schonmal



  • Vor allem solltet Ihr euch besser koordinieren und nicht jeder jeden Tag hier dasselbe Problem erneut einstellen ohne hier vorher zumindest mal gesucht zu haben:

    http://www.c-plusplus.net/forum/p2082065#2082065


Anmelden zum Antworten