【问题标题】:Implementation of queue using linked list in cc中使用链表实现队列
【发布时间】:2013-06-26 12:32:07
【问题描述】:

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

我的代码有什么问题?

我的代码:

#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");
}

【问题讨论】:

  • “无法正常工作”是什么意思?对于某些输入,您期望输出什么,实际输出是什么?
  • tmp=(struct node *)malloc(sizeof(struct node)); 不要使用 cast 它不被认为是安全的。

标签: c linked-list queue


【解决方案1】:

您的insert 函数没有将新节点正确链接到列表中。您只是将尾部设置为指向新节点,但您没有使之前的尾部节点链接指向新的尾部。

【讨论】:

    【解决方案2】:

    修改你的插入函数为:

    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;
    

    【讨论】:

      【解决方案3】:
        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");
         }
      

      【讨论】:

        猜你喜欢
        • 2020-04-17
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        • 2012-05-15
        相关资源
        最近更新 更多