[C] Problem mit QuickSort und beim Komilieren



  • Moin,
    ich habe ein Problem und war soll ich zu Morgen ein Programm schreiben, welches mir eine verkettete Liste in einen Array umwandelt was ich dann mit quick_sort sortieren soll.

    Schön gut, ich sitze nun seit mehreren Stunden an diesem Programm und ich komme nicht weiter. Ich hoffe jemand von euch kann mir bei meinen Problem weiter helfen.

    Hier ist nun das kleine Progamm, Fehlermeldungen stehen unten. Fehlermeldungen von Borland 6 und Dev-C++

    Datei: main.c

    #include <stdio.h>
    #include "sort.h"
    #include "list.h"
    
    static void print_help()
    {
        int i;
    
        for (i = 0; i < 50; i++)
        printf("\n");
        printf("********************************\n");
        printf("*   0: quit                    *\n");
        printf("*   1: add                     *\n");
        printf("*   2: print sorted            *\n");
        printf("*   3: print unsorted          *\n");
        printf("*   4: new session             *\n");
        printf("*   5: help (this screen)      *\n");
        printf("********************************\n");
    }
    
    int main()
    {
        const int N = 100;
        int n, key;
        int l,r;
        char command;
        int a[N]; 
        struct node *head_s, *tail_s, *head_u, *tail_u;
    
        head_u = list_initialize();
        tail_u = head_u;
        head_s = list_initialize();
        tail_s = head_s;
        print_help();
    
        while(1)
        {
            printf(">");
            fflush(stdin);
            command = getchar();
            switch(command)
            {
                case '0':
                   // exit(0);
                    break;
                case '1':
                    printf("integer key to add: ");
                    scanf("%d", &key);
                    head_u = insert_at_head(head_u, key);
                    break;
                case '2':
                    n = transform_list_to_array(head_u, &a[0]);
                    a[0] = l;
                    a[n] = r;
                    quick_sort(&a[0], l, r);
                    head_s = transform_array_to_list(head_s, a, n);
                    print_list(head_s, tail_s);
                    break;
    
                case '3':
                    print_list(head_u, tail_u);
                    break;
                case '4':
                    head_u = delete_all_but_head(head_u);
                    head_s = delete_all_but_head(head_s);
                    break;
                case '5': print_help();
                    break;
                default: print_help();
            }
        }
        return 0;
    }
    

    Datei: sort.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "sort.h"
    
    void quick_sort(int array[], int left, int right)
    {
    	int p;
    
    	if( right>left ) {				/*induction*/
    		p = partition(array, left, right);
    		quick_sort(array, left, p-1);           /*recursion*/
    		quick_sort(array, p+1, right);
    	}
    	return;					/*base: if right <=left*/
    }
    

    Datei: sort.h

    #ifndef SORT_H
    #define SORT_H
    
    void quick_sort(int array[], int left, int right);
    
    #endif
    

    Fehlermeldungen:

    Dev-C++:
    62 C:\xxx\quick\MAIN.C initializing argument 2 of int transform\_list\_to_array(node*, int*)' 63 C:\\xxx\\quick\\MAIN.C invalid conversion from \int' to `int*'
    19 C:\xxx\quick\sort.h too few arguments to function `void quick_sort(int*, int, int)'

    Broland 6:
    [C++ Fehler] MAIN.C(63): E2193 Zu wenige Parameter im Aufruf von 'quick_sort'
    [C++ Warnung] MAIN.C(81): W8004 'N' wurde ein Wert zugewiesen, der nie verwendet wird



    1. Zu morgen? Wie lange hast du das schon auf das du erst so spät damit angefangen hast?
    2. Steht doch alles in den Fehlermeldungen. quick_sort erwartet 3 Parameter, du übergibst aber nur 2. transform_list_to_array übergibst du ein uninitialisiertes Array. Außerdem frage ich mich, wo das 'N' in "int a[N];" herkommt. Kann nirgends sehen das das irgendwo definiert ist.
      Das zu korrigieren solltest du eigentlich alleine hinkriegen, wenn du mal die Fehlermeldungen lesen würdest. Dann wüsstest du zudem was das Problem ist. Wenn der Compiler meckert, weil du 1 Argument zu wenig übergeben hast, solltest du nachsehen welches Argument da fehlt und das entsprechende Argument übergeben. Weiß echt nicht was daran so schwer ist. 🙄


  • an dieser stelle scheint der wurm drin zu sein:

    case '2': 
      n = transform_list_to_array(head_u, &a[0]); 
      a[0] = l; 
      a[n] = r; 
      quick_sort(&a[0], l, r);
    

    quick_sort() verlangt als zweites und drittes argument den kleinsten bzw größten index des zu sortierenden abschnitts im array. wenn transform_list_to_array() die anzahl der felder im erzeugten array angibt, dann muß der quick_sort()-aufruf

    quick_sort(&a[0], 0, n-1);
    

    lauten, oder

    quick_sort(&a[0], 0, n);
    

    falls quick_sort() den rechten index als das erste feld hinter dem zu sortierenden bereich auffaßt.

    die zuweisungen

    a[0] = l; 
    a[n] = r;
    

    sind völliger murks und müssen weggelassen werden.

    richtig sollte der codeabschnitt so aussehen:

    case '2': 
      n = transform_list_to_array(head_u, &a[0]); 
      quick_sort(&a[0], 0, n-1);
    

    die fehlermeldungen kann ich mir auch nicht erklären. du kannst mal versuchen, die zeile

    const int N = 100;
    

    wegzulassen und stattdessen

    int a[100];
    

    zu schreiben.

    das alles natürlich ohne gewähr.



  • vielen Dank an Konfusius, genau das war das Problem... Noch ein Problem ist aufgetreten bei den Pointern aber das habe ich schnell gelöst...

    topic kann gecloset werden


Anmelden zum Antworten