Queue mit Strukten
-
Hallo zusammen,
ich würde gerne in Code::Blocks ein Programm für eine Queue schreiben welche mit Strukuren als Elemente arbeitet.
Soweit so gut, scheint mein Code auch ganz fehlerfrei zusein, wenn ich jedoch meinen Code mit meiner funktion für printf überprüfe stürzt mir mein Programm ab bzw spuckt viele wirre zahlen aus . Anschließend wird die die Fehlermeldung :Process terminated with status -1073741510 angezeigt
ich vermute dass es irgendwie an der zeigern liegt, allerdings bin ich mir da auch nicht so sicher.
hier mal mein Code und dankeschön schonmal an denjenigen der sich Zeit für meine Anfängerproblemchen nimmt:-)
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"int main(void)
{
QueueVector q_testvector;
q_testvector.head = q_testvector.tail = NULL; //WICHTIG!!! da sonst kein push bzw. pop möglich istPoint p1;
p1.value =0;
p1.location= 0;
p1.max_min = 0;pushVector(p1, &q_testvector);
showQueueVector(&q_testvector, 3);return 0;
}// Header
#include <stdint.h>
#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDEDtypedef int bool;
enum { false=0, true };///Strukt für 3x1 Vektor mit verschiedenen Datentypen
typedef struct Point
{ uint16_t value;
uint16_t location;
unsigned int max_min: 1;
} Point;/// Queue für 'vektor'/struct Point
typedef struct NodeVector // Struktur
{//Aufbau eines Elements in der Queue
struct NodeVector* next;
struct NodeVector* prev;
struct Point vector_p;
}NodeVector;typedef struct
{//Anfang und Ende der Queue
struct NodeVector* head;
struct NodeVector* tail;
} QueueVector; //void pushVector( Point v, QueueVector* q);
void popVector( QueueVector* q);
void showQueueVector(const QueueVector* q, int row);
bool isEmptyVector(const QueueVector* q);// Das eigentliche Programm:
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "queue.h"void pushVector( Point v, QueueVector* q)
{ NodeVector* newNode;
newNode = (NodeVector*) malloc(sizeof(NodeVector));
newNode->vector_p = v;if(q->head == NULL) //falls Queue leer, newNode => Head
q->head = newNode;else
q->tail->next = newNode; // Ansosten füge newNode and Ende+1 der Schlange einnewNode->prev = q->tail; // Zuvoriger Wert von Ende+1 auf Ende
q->tail = newNode; // neues Ende = Ende+1
}void popVector(QueueVector* q)
{//Entferne Kopf, ohne Rückgabe
NodeVector* help;
help = q->head; //Hilfezeiger auf Kopf
q->head = q->head->next; //neuer Kopf auf Kopf +1if(q->head == NULL)
q->tail = NULL; // ?? ohne Kopf kein Schwanz?^^
else
q->head->prev = NULL; //if(help != NULL) // queue hat noch Elemente enthalten => gibt Speicher frei
{ help->next = NULL;
free(help);
}
}void showQueueVector(const QueueVector* q, int row)
{
//gebe Elemente der Queue auf Konsole aus:
//r = 0 =>Spannungswert
//r = 1 =>Index in Queue
//r = 2 =>potentielles Maximum oder MinimumNodeVector* help = q->head;
while(help != NULL)
{
if(row == 1)
printf("%d ", help->vector_p.value);if(row == 2)
printf("%d ", help->vector_p.location);if(row == 3)
printf("%d ", help->vector_p.max_min);help = help->next;
}printf("\n");
}bool isEmptyVector(const QueueVector* q)
{//Diese Methode checkt ob sich Elemente in der Queue befindet
bool ret = false;if(q->head == NULL && q->tail == NULL)
ret = true;return ret;
}
-
Muss grad weg, deshalb erstmal dein Code in Tags:
main.c:
#include <stdio.h> #include <stdlib.h> #include "queue.h" int main(void) { QueueVector q_testvector; q_testvector.head = q_testvector.tail = NULL; //WICHTIG!!! da sonst kein push bzw. pop möglich ist Point p1; p1.value =0; p1.location= 0; p1.max_min = 0; pushVector(p1, &q_testvector); showQueueVector(&q_testvector, 3); return 0; }
queue.h:
// Header #include <stdint.h> #ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED typedef int bool; enum { false=0, true }; ///Strukt für 3x1 Vektor mit verschiedenen Datentypen typedef struct Point { uint16_t value; uint16_t location; unsigned int max_min: 1; } Point; /// Queue für 'vektor'/struct Point typedef struct NodeVector // Struktur {//Aufbau eines Elements in der Queue struct NodeVector* next; struct NodeVector* prev; struct Point vector_p; }NodeVector; typedef struct {//Anfang und Ende der Queue struct NodeVector* head; struct NodeVector* tail; } QueueVector; // void pushVector( Point v, QueueVector* q); void popVector( QueueVector* q); void showQueueVector(const QueueVector* q, int row); bool isEmptyVector(const QueueVector* q);
queue.c:
// Das eigentliche Programm: #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include "queue.h" void pushVector( Point v, QueueVector* q) { NodeVector* newNode; newNode = (NodeVector*) malloc(sizeof(NodeVector)); newNode->vector_p = v; if(q->head == NULL) //falls Queue leer, newNode => Head q->head = newNode; else q->tail->next = newNode; // Ansosten füge newNode and Ende+1 der Schlange ein newNode->prev = q->tail; // Zuvoriger Wert von Ende+1 auf Ende q->tail = newNode; // neues Ende = Ende+1 } void popVector(QueueVector* q) {//Entferne Kopf, ohne Rückgabe NodeVector* help; help = q->head; //Hilfezeiger auf Kopf q->head = q->head->next; //neuer Kopf auf Kopf +1 if(q->head == NULL) q->tail = NULL; // ?? ohne Kopf kein Schwanz?^^ else q->head->prev = NULL; // if(help != NULL) // queue hat noch Elemente enthalten => gibt Speicher frei { help->next = NULL; free(help); } } void showQueueVector(const QueueVector* q, int row) { //gebe Elemente der Queue auf Konsole aus: //r = 0 =>Spannungswert //r = 1 =>Index in Queue //r = 2 =>potentielles Maximum oder Minimum NodeVector* help = q->head; while(help != NULL) { if(row == 1) printf("%d ", help->vector_p.value); if(row == 2) printf("%d ", help->vector_p.location); if(row == 3) printf("%d ", help->vector_p.max_min); help = help->next; } printf("\n"); } bool isEmptyVector(const QueueVector* q) {//Diese Methode checkt ob sich Elemente in der Queue befindet bool ret = false; if(q->head == NULL && q->tail == NULL) ret = true; return ret; }
-
- du setzt in pushVector next nicht
- head/tail ist Schrott-Design
- verk. Listen sind dumm
- in stdbool.h ist bool bereits definiert, werfe deine Eigenimplementierung sofort wegich vermute dass es irgendwie an der zeigern liegt, allerdings bin ich mir da auch nicht so sicher.
Zeiger sind nichts für Anfänger.
C ist nicht für Anfänger.
Verk. Listen sind für Anfänger.
-
Erstmal dankeschön für deine Antwort!
Leider versteh immer noch nicht so ganz wo das Problem liegt.
Next des neuen Elementes kann schließlich noch nicht zugewiesen und next von dem alten Ende wird auch auf das neue Element gesetzt.Wo genau liegt der Fehler?
-
Welchen Wert hat das next des neuen Knotens denn nach Verlassen der Funktion?
-
Was soll denn
typedef struct Point { uint16_t value; uint16_t location; unsigned int max_min: 1; // <<== das } Point;
werden?
-
Verk. Listen sind für Anfänger.
Würden einen Binäre-Bäume etwas über "Anfägner-Niveau" bringen?
-
unsure110 schrieb:
Verk. Listen sind für Anfänger.
Würden einen Binäre-Bäume etwas über "Anfägner-Niveau" bringen?
Es geht nicht um die Herausforderung. "Verkettete Listen sind praxisirrelevant" wäre eine bessere Formulierung gewesen. Als Programmierübung und zur theoretischen Analyse sind verkettete Listen schon in Ordnung. Aber bei der theoretischen Analyse sollte lieber auch raus kommen, dass die Vorteile der verketteten Liste nur in konstruierten Fällen relevant sind, wohingegen die Nachteile fast immer eine Rolle spielen. Und dass die Teile, die scheinbar gleich zu anderen gängigen Datenstrukturen sind (gleiche Komplexitätsklasse) bei der Liste in der Praxis viel größere Konstanten haben.
-
Naja, ich sehe hald ein bisschen ein Problem darin, das wenn man das ganze nicht beruflich nutzt, sodner nnur als Hobby bzw. Interessehalber, kommt man nicht so leicht auf diese Schlüße.
Aber irgendwie will man ja doch weiter kommen. Sprich, die meisten Bücher enden nach "Verkettete Listen", das ist so das Gesellenstück.
Wie sollte man denn dann weitermachen ? Denke binäre Bäume wären schon die richtige Richtung?
-
also fehlt quasi in der letzten zeile tail.next = NULL;?
bekomme dabei leider immernoch nichts vernünftiges raus :-\
-
ich meine natürlich tail-> next= NULL;
-
klappt jetzt. Dankeschön!