2014-10-08 3 views
1

Во время компиляции этот код не дает ошибок, но код резко останавливается. По мне проблема связана с функцией createq, где объявляется q->front=q->rear=NULL. Он должен быть инициализирован. Что-то не так с этим?Очередь с использованием связанного списка в c

#include<stdio.h> 
#include<malloc.h> 
#include<stdlib.h> 
struct node 
{ 
    struct node *next; 
    int data; 
}; 

struct queue 
{ 
    struct node *front; 
    struct node *rear; 
}; 

struct queue *q; 

void createq(struct queue *); 
struct queue *insert(struct queue *); 
struct queue *delete_q(struct queue *); 
struct queue *display(struct queue *); 

int main() 
{ 
    int option; 
    printf("\tMAIN MENU\n"); 
    printf("\n1. Create\n2. Display\n3. Insert\n4. Delete\n5. Exit\n"); 
    while(option!=5) 
    { 
     printf("\nEnter a choice:"); 
     scanf("%d",&option); 
     switch(option) 
     { 
     case 1: 
      createq(q); 
      break; 

     case 2: 
      q=display(q); 
      break; 

     case 3: 
      q=insert(q); 
      break; 

     case 4: 
      q=delete_q(q); 
      break; 
     } 
    } 
    return 0; 
} 

void createq(struct queue *q) 
{ 
    q->rear=NULL; 
    q->front=NULL; 
    printf("q intialized"); 
} 

struct queue *insert(struct queue *q) 
{ 
    struct node *newnode; 
    int val; 
    newnode=(struct node *)malloc(sizeof(struct node)); 
    printf("Enter the value to be inserted:"); 
    scanf("%d",&val); 
    newnode->data=val; 
    if(q->front==NULL) 
    { 
     q->front=newnode; 
     q->rear=newnode; 
     q->front->next=q->rear->next=NULL; 
    } 
    else 
    { 
     q->rear->next=newnode; 
     q->rear=newnode; 
     q->rear->next=NULL; 
    } 
    return q; 
} 

struct queue *delete_q(struct queue *q) 
{ 
    struct node *ptr; 
    if(q->front==NULL) 
    { 
     printf("Queue Empty\n"); 
    } 
    else 
    { 
     ptr=q->front; 
     q->front=q->front->next; 
     printf("Element being deleted is %d\n",ptr->data); 
     free(ptr); 
    } 
    return q; 
} 

struct queue *display(struct queue *q) 
{ 
    struct node *ptr; 
    ptr=q->front; 
    if(q->front==NULL) 
    printf("Queue Empty!!\n"); 
    else 
    { 
     while(ptr!=q->rear) 
     { 
      printf("%d\t",ptr->data); 
      ptr=ptr->next; 
     } 
     printf("%d\t",ptr->data); 
      printf("\n"); 
    } 
    return q; 
} 
+2

Где код "stopping"? Есть ли ошибка сегментации? Это просто не работает? Происходит ли ошибка? – pstrjds

+0

Да, это ошибка сегментации. – gmeh94

ответ

1

Вы передаете функцию q типа struct queue *. Но вы не выделили память для этого указателя.

Так что вам нужно выделить память указателю q, а затем передать свои функции. Вам нужно выделить память, как этот

q = (struct queue *)malloc(sizeof(struct queue)); 

затем передать q своим функциям.

5

Вы объявляете указатель на структуру очереди следующим образом:

struct queue *q; 

Обратите внимание, что вы не выделять память для структуры здесь. Далее, в вашей main() функции вы звоните:

createq(q); 

Тогда доступ rear и front через q в функции createq():

q->rear=NULL; 
q->front=NULL; 

Таким образом, вы получите доступ к памяти, что вы не выделяли. Вы должны поставить что-то вроде следующего в начале вашей main() функции:

q = (struct queue *)malloc(sizeof(struct queue)); 

И не забудьте поставить free(q) в конце вашей main() функции, чтобы предотвратить утечку памяти.

+0

Код работал нормально после добавления этого. Спасибо. – gmeh94

+0

Добро пожаловать! Я рад, что мое предложение работает. – honk

Смежные вопросы