Ошибка сегментации (дамп ядра) при создании очереди связанного списка (вместе с функцией стека) - PullRequest
0 голосов
/ 28 апреля 2018

Итак, мое назначение - создать программу «жонглер», которая выталкивает / извлекает значения из функции стека и ставит в очередь / удаляет значения из функции очереди, а также передает эти значения между функциями. Например ... если я извлекаю значение из стека, оно вводится в "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;


}

Спасибо !!

...