Итак, мое назначение - создать программу «жонглер», которая выталкивает / извлекает значения из функции стека и ставит в очередь / удаляет значения из функции очереди, а также передает эти значения между функциями. Например ... если я извлекаю значение из стека, оно вводится в "outQueue" и т. Д.
Когда я тестировал функциональность моей функции stackADT, она работала нормально. Как только я добавил функцию «Очередь», я начал получать ошибку ошибки сегментации. Я исследовал это в течение нескольких дней и до сих пор не могу понять это. Отказ от ответственности: программа еще не находится на этапе передачи значений между стеками и очередями, я просто пытаюсь заставить обе функции работать правильно.
Может кто-нибудь взглянуть на мой код и выяснить, почему я получаю эту ошибку ??
queueADT.c:
#include <stdio.h>
#include <stdlib.h>
#include "queueADT.h"
struct qnode{
int data;
struct qnode *next;
};
struct q_type{
struct qnode *front;
struct qnode *rear;
};
static void terminate(const char *message)
{
printf("%s\n", message);
exit(EXIT_FAILURE);
}
Queue createq(void)
{
Queue q = malloc(sizeof(*q));
if(q == NULL)
{
terminate("Error in create: queue could not be created.");
}
q->front = NULL;
q->rear = NULL;
return q;
}
void destroyq(Queue q)
{
make_emptyq(q);
free(q);
}
void make_emptyq(Queue q)
{
while(!is_emptyq(q))
dequeue(q);
}
bool is_emptyq(Queue q)
{
return q->front== NULL && q->rear == NULL;
}
bool is_full(Queue q)
{
return false;
}
void enqueue(Queue q,int x)
{
struct qnode *temp = malloc(sizeof(struct qnode));
if(front == NULL && rear == NULL)
{
front = rear = temp;
return;
}
temp->data = x;
temp->next = q->rear;
rear = temp;
}
int dequeue(Queue q)
{
struct qnode *temp = malloc(sizeof(struct qnode));
temp = q->front;
int i = temp->data;
if(is_emptyq(q))
{
terminate("Error in pop: queue is empty.");
}
if(front == rear)
{
front = rear = NULL;
}else
{
front = front->next;
}
free(temp);
return i;
}
queueADT.h (заголовок):
#include <stdio.h>
#include <stdlib.h>
#ifndef QUEUE_H
#define QUEUE_H
#include <stdbool.h>
typedef struct q_type *Queue;
struct qnode *front;
struct qnode *rear;
Queue createq(void);
void destroyq(Queue q);
void make_emptyq(Queue q);
bool is_emptyq(Queue q);
bool is_fullq(Queue q);
void enqueue(Queue q, int x);
int dequeue(Queue q);
#endif
А вот бегун, он должен запускать как функции стека, так и функции очереди:
#include <stdio.h>
#include "sqjuggler.h"
#include "stackADT.h"
#include "queueADT.h"
int main(void)
{
Stack s1, s2;
Queue q1, q2;
int n;
int l;
s1 = creates();
s2 = creates();
q1 = createq();
q2 = createq();
enqueue(q1, 1);
enqueue(q2, 2);
enqueue(q1, 3);
enqueue(q2, 4);
l = dequeue(q1);
printf("%d q1\n", l);
l = dequeue(q2);
printf("%d q1\n", l);
push(s1,1);
push(s1,2);
n = pop(s1);
printf("popped %d s1\n", n);
push(s2, n);
n = pop(s1);
printf("popped %d s1\n", n);
push(s2, n);
destroys(s1);
while(!is_emptys(s2))
printf("popped %d s2\n", pop(s2));
push(s2,3);
make_emptys(s2);
if(is_emptys(s2))
printf("s2 is empty");
else printf("s2 is not empty");
destroys(s2);
return 0;
}
Спасибо !!