Queue mit Fließkommazahlen



  • Hallo,
    hab die Aufgabe eine Queue für Fließkommazahlen zu erstellen.
    Das ist mein bisheriger Code:

    /*Programm zum Erstellen und Bearbeiten einer Queue*/
    # include <stdio.h>
    
    struct Queue{
           struct Queueelement *next;
           };
    
    struct Queueelement{
           float Fliesskommazahl;
           struct Queueelement * next;                                              /*zeigt auf naechstes Queueelement*/
           };
    
    struct Queue q;
    
    void enqueue(float f, struct Queue *erst) 
       { 
       struct Queueelement *ptr=NULL; 
    
       ptr = erst->next; 
       if(erst->next==0){
                         erst->next=(struct Queueelement *) malloc(sizeof(struct Queueelement));
                         }
    
        else{
             while(ptr->next!=0){
                            ptr=ptr->next;
                            }
                            ptr->next=(struct Queueelement *) malloc(sizeof(struct Queueelement));
          } 
           } 
    
    float dequeue(int q, struct Queue *erst)
       { 
       struct Queue *ptr=NULL; 
    
          if(q->erst !=0){
                     ptr=q->erst;
                     q->erst=ptr->erst;
                     free(ptr);
                     }
          } 
    
    float front(struct Queue *erst){      /*soll erstes Element der Queue anzeigen*/
                printf("Die erste Zahl in der Queue ist die %f.",ptr->erst);
                }
    
    int main(){
        int e,f;
        struct Queue liste;                                    
        enqueue(6.2,&liste);                                                    
        enqueue(25.23,&liste);
        enqueue(22.242,&liste);
        enqueue(2.4,&liste);
        enqueue(78.1,&liste);
        system("pause");
        return 0;
    }
    

    Leider wird das Programm nich ausgeführt. Der Compiler zeigt wenn ich die dequeue-Funktion ausklammere nichts an, aber es funktioniert nicht.
    Und wenn ich die dequeue-Funktion drinlasse, ist er damit auch nich zufrieden.
    Bitte um konstruktive Vorschläge.

    MfG
    Neuerneuneu



  • Mal abgesehen davon, dass du keine [cpp][/cpp]-Tags benutzt hast und deine Einrückung unübersichtlich ist und deine Variablenbenennung verwirrt, fehlt deiner dequeue-Funktion das return. Du willst bestimmt q->erst->Fliesskommazahl zurückgeben.
    Dass dein Programm nichts anzeigt ist zu erwarten, nirgendwo in deinem Code steht dass es was anzeigen soll.
    Vielleicht willst du in deine enqueue-Funktion ein printf("Packe %f in die Liste\n", f); reinpacken und in deine dequeue-Funktion auch so ähnlich.



  • Sry, wegen der schlechten Einrückung.
    Muss dazu sagen dass ich in C auch nich gerade ein Meister bin. Hab dieses Program auch mit jemanden angefangen zu entwerfen der etwas mehr Ahnung hat und stecke jetzt fest. Wäre euch sehr dankbar, wenn ich möglichst nachvollziebare Eklärungen bekomen würde.

    MfG
    Neuerneuneu



  • Meine Erklärung war nicht nachvollziehbar?



  • Versteh das nicht falsch, aber bin mir sowieso nich ganz sicher ob ich die Funktion von "->" verstanden habe und dann benutzt du es gleich doppelt.
    Das was du mit den Print-Befehlen meintest ist nachvollziehbar muss ich aber wohl nicht unbedingt haben. Es würde mir ertsmal reichen, wenn die Zahlen in die Queue gebracht würden und dann auch gelöscht werden könnten.
    Und wenn ich das jeweils erste Element der Queue anzeigen lassen könnte.

    Mfg
    Neuerneuneu



  • Neuerneuneu schrieb:

    Wäre euch sehr dankbar, wenn ich möglichst nachvollziebare Eklärungen bekomen würde.

    naja, der code ist ziemlicher mist, voller bugs und so. nimm am besten ein array, einen schreib- und einen lesezeiger. einfügen kannste, wenn (schreibzeiger+1) != lesezeiger und auslesen, wenn lesezeiger != schreibzeiger ist. bei jedem zugriff dann schreib- bzw. lesezeiger (+1) mod arraygrösse weiterwandern lassen.
    🙂



  • Das mit dem Array lass lieber sein. Es ist einfach falsch. Wenn du das return in die dequeue-Funktion packst funktioniert es schon.



  • nwp2 schrieb:

    Das mit dem Array lass lieber sein. Es ist einfach falsch.

    garnicht. komplett malloc-los, schnell und zuverlässig.
    🙂



  • Es ist deutlich weniger mächtig weil weniger Elemente möglich sind und verschwendet reichlich Speicher der wegen dem hin und hergeswappe auch die Performance drückt. Aber gut, da hier alle denken dass malloc böse ist hat es keinen Sinn.



  • nwp2 schrieb:

    Aber gut, da hier alle denken dass malloc böse ist hat es keinen Sinn.

    mach doch endlich mal den pro/contra malloc-thread auf (hat doch schon mal einer hier vorgeschlagen), dann können wir und genüsslich darüber auslassen.
    🙂



  • Mach doch selber :p





  • Danke für die bisherigen Einträge. Das return hab ich eingefügt. Jedoch wird mir bei allen "->" Operatoren in der dequeue-Funktion vom Compiler invalid type of argument ausgegeben.
    Zudem zeigt mir der Compiler bei der front-Fuktion an, dass das mit ptr->erst nicht geht. Was heißt denn genau mein erstes Element in der Queue?

    MfG
    Neuerneuneu



  • ich hab wenig lust mir das anzuschauen wenn du willst das ich da mal drüber schau beschäftige dich mal mit deinem Programmierstil einen anfangs link findest

    http://de.wikipedia.org/wiki/Programmierstil
    http://de.wikipedia.org/wiki/Einr%C3%BCckungsstil

    wenn du damit fertig bist und nen sauberen quellcode hast dann poste den doch nochmal. dann geht sicher was vorwärts...

    kleine anmerkungen über du dir gedanken machen solltest
    1. Fliesskommazahl wird nirgends beschrieben
    float Fliesskommazahl;

    2. rückgabe von malloc wird nicht gecastet und nicht überprüft ob es NULL ist
    erst->next=(struct Queueelement 😉 malloc(sizeof(struct Queueelement));



  • achso und ptr->erst gibt es nicht...

    und sowas geht auch nicht
    printf("Die erste Zahl in der Queue ist die %f.",ptr->erst);

    eher
    printf("Die erste Zahl in der Queue ist die %f.",ptr->Fliesskommazahl);



  • aber das machst am besten alles nochmal neu...

    lg lolo



  • ich war mal so nett und hab das für dich übernommen auch wenns nicht das gelbe vom ei ist und ;fricky sicher nicht gefällt 🤡

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _fifoNode{
    	float value;
    	struct _fifoNode *next;
    }fifoNode;
    
    typedef struct _fifo{
    	fifoNode *first;
    	fifoNode *last;
    }fifo;
    
    int push(fifo *stack,float data){
    	fifoNode *n = malloc(sizeof(fifoNode));
    	if(n!=NULL){
    		n->next = NULL;
    		n->value = data;
    		if(stack->last==NULL){
    			stack->last = stack->first = n;
    		}else{
    			stack->last->next = n;
    			stack->last = n;
    		}
    		return 1;
    	}
    	printf("buffer overrun");
    	return 0;
    }
    
    float pop(fifo *stack){
    	fifoNode *n = stack->first;
    	float ret = 0;
    	if(n!=NULL){
    		stack->first = n->next;
    		if(stack->first == NULL)
    			stack->last = NULL;
    		ret = n->value;
    		free(n);
    	}else{
    		printf("buffer underrun");
    	}
    	return ret;
    }
    
    int main(void) {
    	fifo stack;
    	stack.first = NULL;
    	stack.last = NULL;
    	push(&stack,1.0);
    	push(&stack,2.0);
    	push(&stack,3.0);
    	push(&stack,4.0);
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	push(&stack,1.0);
    	push(&stack,2.0);
    	push(&stack,3.0);
    	push(&stack,4.0);
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	printf("%f\n",pop(&stack));
    	return 0;
    }
    


  • noobLolo schrieb:

    ...und ;fricky sicher nicht gefällt

    hihi, was mir nicht gefällt ist: du schreibst 'stack' und 'fifo', dabei ist ein stack doch eigentlich ein 'lifo' *fg* und eigentlich hast du eine queue aus verketteten listen gebaut.
    aber wenigstens castest du 'malloc' nicht und testest sogar auf 0. *daumen_hoch*
    🙂



  • Vielen Dank für deinen Einsatz nooblolo.
    Leider ist nur die Struktur, die ich hatte, mit:

    struct Queue{};
    struct Queueelement{};
    struct Queue q;

    void enqueue(struct Queue *q, float z);
    float dequeue(struct Queue *q);
    float front(struct Queue q);

    schon vorgegeben.
    Ich verzweifle einfach an der Aufgabe.

    MfG
    Neuerneuneu



  • Neuerneuneu schrieb:

    Leider ist nur die Struktur, die ich hatte, mit:
    ...
    schon vorgegeben.

    dann nimm doch noobLolos code und tausch' einfach die bezeichner aus.
    🙂


Anmelden zum Antworten