2014-10-08 85 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

代碼「停止」在哪裏?是否存在分段錯誤?它只是沒有運行?是否顯示錯誤? – pstrjds 2014-10-08 16:08:53

+0

是的,這是一個分段故障。 – gmeh94 2014-10-08 16:35:52

回答

1

您正在向函數傳遞struct queue *類型的指針q。但是你沒有爲該指針分配內存。

所以你需要分配內存到指針q,然後傳遞給你的函數。 你需要這樣的

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

分配內存,然後通過q你的功能。

5

您通過以下方式聲明一個指向隊列結構:

struct queue *q; 

請注意,您在這裏不爲結構分配內存。接下來,在你的main()函數調用:

createq(q); 

然後你在createq()功能通過q訪問rearfront

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

這樣你訪問內存,你沒有分配。你應該把像下面這樣在你main()函數的開頭:

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

而且不要忘了把free(q)main()函數的末尾,以防止內存泄漏。

+0

添加此代碼後,代碼正常工作。謝謝。 – gmeh94 2014-10-08 16:39:10

+0

不客氣!我很高興我的建議有效。 – honk 2014-10-08 16:40:19