In C versuche ich Warteschlangen-Datenstruktur zu lernen und Zeiger auf struct, aber innerhalb der Struktur gibt es Zeiger auf Array. Hier queue
struct ist, ist q
Zeiger auf die Struktur, und im Inneren struct es rear
, front
, num
und int *que
(Zeiger auf Array-Daten zu speichern)Warteschlange mit struct, die auf Array zeigen
typedef struct {
int max;
int rear;
int front;
int num;
int *que;
} queue;
Und malloc()
Verwendung
queue->que=malloc(sizeof(int)12) ; to make arrray And to access it,
q->que[q->rear++] //not to familiar,
Erste Ich deklariere Array nicht, aber kann ich auf Daten zugreifen, die von que
unter Verwendung []
gezeigt werden? Ist das mittlere Zugriff que[q->rear++]
innerhalb q
Zeiger? Ist das das gleiche wie (q).que[q->rear++]
? Ich habe einen Segmentierungsfehler.
Teil des Codes; aber es gibt einige Fehler
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int max;
int num;
int front;
int rear;
int *que;
} queue;
int initialization(queue*q, int max) {
q->num = 0;
q->front = 0;
q->rear = 0;
if (q->que =(int*)malloc(max * sizeof(int)) == NULL) { // got pointer NULL i dont know why
q->max = 0;
return-1;
}
q->max=max;
return 0;
}
int main() {
queue que;
if (initialization(&que, 12) == -1)
printf("fail");
else {
int m,x;
while (m != 0) {
printf("1.enque 2.deque. 3.peek 4.display 0. slese");
scanf("%d", &m);
switch (m) {
case 0: break;
case 1: printf("data");
scanf("%d", &x);
enqueue(&que, x);
break;
case 2: dequeue(&que, &x);
printf("%d is dequeue", x);
break;
case 3:x=peek(&que,&x);
printf("max now is %d", x);
break;
case 4:display(&que);
}
}
}
int enqueue(queue*q, int x) {
if (q->num >= q->max)
return -1;
else{
q->num++;
q->que[q->rear++]= x; //got segmentation fault
if (q->rear == q->max)
q->rear = 0;
}
}
Setzen Sie '#include' –
BLUEPIXY
Zuerst bitte formatieren Sie Ihren Code mit regulären Einzug; ohne es ist Ihr Code * sehr * schwer zu lesen. Zweitens: 'if (q-> que = (int *) malloc (max * sizeof (int)) == NULL)' macht nicht, was Sie wegen der Vorrangstellung des Operators tun sollen; das ist effektiv 'q = (malloc() == NULL) ', so dass' q' als 0 oder 1 endet. Sie wollen stattdessen 'if ((q = malloc()) == NULL) '. Oh, und bitte ignoriere Compilerwarnungen nicht - 'm' wird zum Beispiel vor der Verwendung nicht initialisiert.Fix all diese Dinge dann sehen, wie das Programm funktioniert. –
@Ken Y-N danke es funktioniert! anstelle von 'int * que' und malloc, um ein Array zu erstellen, kann ich einfach Array wie' int que [12] 'deklarieren und auf Daten mit' q-> que [] 'zugreifen? und auch, wenn ich schreibe "* (int) malloc (sizeof (int * 12)' brauche ich auch Cast? und für den Operator Vorrang -> und [] ist das gleiche und es wird von links nach rechts Reihenfolge. 'q- > que
fiksx