C語言數據結構中隊列的相關操作

 #include<stdio.h>
#define MaxSize 4                                      //聲明隊列元素,可以任意定製

typedef int BOOL;
int menu_select( );                                      //聲明選擇函數
typedef struct queue                                   //聲明結構體類型                
       {
          int  Front,Rear,MaxQueue;
          int Elements[MaxSize];
       }Queue;
void Create_Queue(Queue *q,int maxsize)
          {
           q->Front=q->Rear=0;                                    
           q->MaxQueue=maxsize;
           }
BOOL Is_Empty(Queue *q)
          {
              if(q->Front==q->Rear)                                                             

//頭結點等於尾結點,有兩中情況:1、在剛開始爲空的情                                                                                   

況 下;2、當循環隊列中只有一個元素的情況下
                  {
                   if(q->Elements[q->Front]==q->Elements[q->Rear])                      
                         return 0;                       
                   else    
                         return  1;                      
                  }
              else
                 {
                  if(q->Elements[q->Front]==0)                                    //這一步是因爲我在serve裏面都是將front的後一個賦給front的,所以如果刪除所有的元素的情況下要考慮到front的值
                     return 1;
                  else
                    return 0;
                 }
             
          }
BOOL  Is_Full(Queue *q )
          {
           return (q->Rear+1)%q->MaxQueue==q->Front;
          }
void Append(Queue *q,int x)
          {
  if(Is_Full(q))
           
            {                    
              q->Front=(q->Front+1)%q->MaxQueue;                                         //如果隊列已滿,再 插入元素的話就覆蓋首元素
              q->Elements[q->Rear=(q->Rear+1)%q->MaxQueue]=x;
             
            }
           else
                  {
                    q->Elements[q->Rear=(q->Rear+1)%q->MaxQueue]=x;
              
                  }
           }          
void Serve(Queue *q)
        {      
  if(Is_Empty(q))
                printf("Underflow");
                else
                  {
                                    
                   printf("%d",q->Elements[(q->Front)%q->MaxQueue]);
                   q->Elements[q->Front]=0;                                                       //目的是在刪除一個元素並沒有釋放掉 的情況下,將刪除的元素內存空間的值賦爲0,這樣在後面的列印中,才能顯示真確的結果!             
                   q->Front=(q->Front+1)%q->MaxQueue;
                  }
          }

       
void  PrintQueue1(Queue *q)
             {
               if(Is_Empty(q))
                 printf("/n/nIs Empty!/n/n");
               else                
    {
      printf("Front=%d/n",q->Elements[q->Front=(q->Front)%q->MaxQueue]);   //顯示出首元素
      printf("Rear=%d",q->Elements[q->Rear=(q->Rear)%q->MaxQueue]);           //顯示出尾部元素
     }            
            }

 

void  main()
        {
            Queue q;
            int i,n;
            int a[MaxSize];
     Create_Queue(&q,MaxSize);                       /*Construction of a capacity for MaxSize air for Queue*/
       for(;;)
          {  
           switch(menu_select() )
                {
                  case 1:
                         printf("please put into number element:/n");                                    //輸入您想要輸入的隊列元素個數,最大值爲4
                         scanf("%d",&n);
                         for(i=0;i<n;i=i++)
                            {
                              scanf("%ld",a+i);
                            }
                        printf("/n");
                        for(i=0;i<n;i++)
                               {
                                 Append(&q,a[i]);
                                 printf("%d  ",a[i]);
                                }
                 printf("/n/n");
                
                 break;
           case 2:
                  Serve(&q);
                  break;
          case 3:
                printf("The Front element:/n");
                PrintQueue1(&q);
                break;                  
           case 0:
                         printf("/Thank you for your using!/n");
                         return;
            }
   
          }
       }
int menu_select()                                                                                         //選擇哪一部操作的函數
          {
           int sn;
           printf(" /n");
           printf(" Queue operate /n");
           printf(" ======================/n");
           printf(" 1.Queue Append/n");
           printf(" 2.Queue Serve/n");
           printf(" 3.print the front element:/n");          
           printf(" 0.exit Queue operate/n");
           printf(" ======================/n");
           printf( " please select 0-3 /n");
           printf("**************************/n");
           for(;;)
             {
              scanf("%d",&sn);            
              if(sn<0||sn>3)
                printf("/tInsert Error/n");
              else
                break;
              }
           return sn;
         }

 

   因爲我的水平不高,所以在描述中可能有些不準確,但此代碼我編譯運行過,結果正確(是我想要的結果),不知道是不是各位想要的結果。希望對看的人有所幫助。

   各位也可將你們認爲好的程序代碼、功能更多的程序代碼留下來,我們大家一起探討探討!
           

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章