在c中使用链表实现队列

时间:2013-06-26 12:32:08

标签: c linked-list queue

我正在尝试使用链表实现队列。我使用以下代码,但我的显示功能无法正常工作:

我的代码出了什么问题?

我的代码:

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int info;
    struct node *link;
}*front=NULL,*rear=NULL;

void insert(int item);
int del();
int peek();
int isEmpty();
void display();

main()
{
    int choice,item;
    while(1)
    {       
        printf("1.Insert\n");
        printf("2.Delete\n");
        printf("3.Display the element at the front\n");
        printf("4.Display all elements of the queue\n");
        printf("5.Quit\n");
        printf("Enter your choice : ");
        scanf("%d", &choice);

        switch(choice)
        {
        case 1:
            printf("Input the element for adding in queue : ");
            scanf("%d",&item);
            insert(item);
            break;
        case 2:
            printf("Deleted element is  %d\n",del());
            break;
        case 3:
            printf("Element at the front of the queue is %d\n", peek() );
            break;
        case 4:
            display();
            break;
        case 5:
            exit(1);
        default :
            printf("Wrong choice\n");
        }
    }
}

void insert(int item)
{
    struct node *tmp;
    tmp=(struct node *)malloc(sizeof(struct node));
    if(tmp==NULL)
    {
        printf("Memory not available\n");
        return;
    }
    tmp->info = item;
    tmp->link=NULL;
    if(front==NULL)      /*If Queue is empty*/
        front=tmp;
    rear=tmp;
}

int del()
{
    struct node *tmp;
    int item;
    if( isEmpty( ) )
    {
        printf("Queue Underflow\n");
        exit(1);
    }
    tmp=front;
    item=tmp->info;
    front=front->link;
    free(tmp);
    return item;
}

int peek()
{
    if( isEmpty( ) )
    {
        printf("Queue Underflow\n");
        exit(1);
    }
    return front->info;
}

int isEmpty()
{
    if(front==NULL)
        return 1;
    else
        return 0;

}

void display()
{
    struct node *ptr;
    ptr=front;
    if(isEmpty())
    {
        printf("Queue is empty\n");
        return;
    }
    printf("Queue elements :\n\n");
    while(ptr!=NULL)
    {
        printf("%d ",ptr->info);
        ptr=ptr->link;
    }
    printf("\n\n");
}

3 个答案:

答案 0 :(得分:4)

您的insert函数未正确地将新节点链接到列表中。您只需将尾部设置为指向新节点,但不要将前一个尾节点链接指向新尾部。

答案 1 :(得分:3)

将插入功能修改为:

if(front==NULL)      /*If Queue is empty*/
        front=tmp;
else
    rear->link = tmp;
/*The above statement would link the the previous node to the newly created node*/
    rear=tmp;

答案 2 :(得分:1)

  Enqueue Algorithm :
   1. Create a newNode with data and address.
   2. if queue i.e front is empty   
    i.  front = newnode;   
    ii. rear  = newnode;
   3. Else 
   i.rear->next = newnode;    
   ii.rear = newnode;

 Dequeue Algorithm :
   1. if queue is i.e front is NULL      printf("\nQueue is Empty \n");
   2. Else next element turn into front        
   i.  struct node *temp = front ;  
   ii. front = front->next;   
   iii.free(temp);  

C编程实现:

   #include<stdio.h>
   #include<stdlib.h>

    struct node
    {
      int data;
      node *next;
    };

    node *front = NULL;
    node *rear =NULL;


    node *creation(int data)
    {
      tmp=(struct node *)malloc(sizeof(struct node));
      tmp->data = data;
      tmp->next=NULL;
      return tmp;
    }




     void Insert(int item)
     {
         struct node *newnode = creation(item);

       if(front==NULL)
       {
          front = rear = newnode;
       }

       else
       {
          rear->next = newnode;
          rear = newnode;
       }
  }





    void Delete()
    {
      struct node *temp;

      if (front == NULL)
      {
        printf("\nQueue is Empty \n");
        return;
      }

      else
      {
         temp = front;
         front = front->next;
         if(front == NULL)  rear = NULL;
         free(temp);
      }
   }


     void display()
     {

       struct node *temp=front;

      if(front == NULL) 
      {
        printf("Queue is Overflow\n");
      }

     else
     {
         printf("Queue is :\n");
         while(temp != NULL)
         {
             printf("%d ", temp->data);
             temp = temp->next;
         }
     }
     printf("\n");
   }