C語言數據結構循環隊列(創建、入隊、出隊、取對頭元素、遍歷)

/*
*循環隊列的創建
*循環隊列的初始化
*創建一個一維數組
*操作 出隊 入隊 判對列空 對列滿
*創建數據域結構體
*創建循環隊列的結構體
*求循環隊列的長度
*/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 1024  //循環隊列的最大長度
#define NAMESIZE 255//字符串的最大長度
int count=0;//外部變量 記錄隊列的元素的個數
typedef int IdType;//數據域的編號的數據類型
typedef char*NameTyp;//數據域的名稱指針
typedef int Statu;//函數的返回值數據類型
typedef struct elementtype
{
    IdType id;//數據域的編號
    NameTyp name;//數據域的名稱

}ElementType;//數據域的結構體
typedef struct seqqueue
{
    ElementType *data;//循環對列的順序存儲
    int rear;//尾指針
    int front;//頭指針

}Seq_Queue;//循環隊列的結構體
int   length_seqqueue(Seq_Queue*q);//循環隊列的長度
Statu empty_seqqueue(Seq_Queue*q);//判空
Statu full_seqqueue(Seq_Queue*q);//判滿
Statu create_seqqueue(Seq_Queue*q);//創建循環隊列
void Init_seqqueue(Seq_Queue*q);//循環隊列的初始化
Statu pop_seqqueue(Seq_Queue*q,ElementType *data);//出隊
Statu push_seqqueue(Seq_Queue*q,ElementType *data);//入隊
Statu getdata_seqqueue(Seq_Queue*q,ElementType *data);//取隊頭元素
void Display_seqqueue(Seq_Queue*q);//遍歷隊列的元素
void main()
{
    Seq_Queue *q;
    ElementType data;//出隊元素
    ElementType data1;//入隊元素
    ElementType key;//取棧頂元素
    q=(Seq_Queue*)malloc(sizeof(Seq_Queue));
    //對隊列進行初始化
       Init_seqqueue(q);
       //對循環隊列進行創建
       int  result=create_seqqueue(q);
       if(result==ERROR)
        printf("循環隊列創建失敗\n");
       else
       {
           printf("循環隊列創建成功\n");
           printf("循環隊列元素的個數爲%d\n",count);
       }
       if(full_seqqueue(q))
        printf("隊列爲滿\n");
         else
            printf("隊列未滿\n");
       if(empty_seqqueue(q))
        printf("循環隊列爲空\n");
       else
       {
            printf("循環隊列不爲空\n");
            printf("循環對列的長度爲%d\n",length_seqqueue(q));
       }
       data.name=(NameTyp)malloc(sizeof(char)*NAMESIZE);
       int result1=pop_seqqueue(q,&data);
       if(result1==ERROR)
          printf("出隊失敗\n");
         else
         {
             printf("出隊成功\n");
             printf("出隊的元素爲[%d,%s]\n",data.id,data.name);
         }
           key.name=(NameTyp)malloc(sizeof(char)*MAXSIZE);
               int result3=getdata_seqqueue(q,&key);
               if(result3==ERROR)
                printf("取棧頂元素失敗\n");
                 else
                 {
                     printf("取棧頂元素成立\n");
                      printf("棧頂元素爲[%d,%s]\n",key.id,key.name);
                 }
              data1.name=(NameTyp)malloc(sizeof(char)*NAMESIZE);
            data1.id=rand()%30;
           printf("請輸入要入隊元素的名稱\n");
         scanf("%s",data1.name);
        int result2=push_seqqueue(q,&data1);
           if(result2==ERROR)
            printf("入隊失敗\n");
             else
               printf("入隊成功\n");
              printf("隊列元素的遍歷的結果爲\n");
              Display_seqqueue(q);

}
void Init_seqqueue(Seq_Queue*q)//循環隊列的初始化
{
    if(q==NULL)
        printf("循環隊列初始化失敗\n");
      else
      {
          q->data=(ElementType*)malloc(sizeof(ElementType)*MAXSIZE);//創建順序儲存結構
          q->front=0;
           q->rear=0;
      }
}
Statu create_seqqueue(Seq_Queue*q)//創建循環隊列
{
    char name[NAMESIZE];
    if(q==NULL)
    {
        return ERROR;
    }

      printf("請輸入數據的名稱\n");
       while(scanf("%s",name)!=EOF)
       {
           if(strcmp(name,"^")==0)
              break;
              else
              {
                   q->data[q->rear].name=(NameTyp)malloc(sizeof(char)*NAMESIZE);
                   strcpy(q->data[q->rear].name,name);
                   q->data[q->rear].id=rand()%50;//隨機函數
                    q->rear=(q->rear+1)%MAXSIZE;
                        count++;
            }
        }
        return OK;
}
Statu empty_seqqueue(Seq_Queue *q)//判空
{
    if(q->rear==q->front)
        return OK;
    else
        return ERROR;
}
Statu full_seqqueue(Seq_Queue*q)//判滿
{
    if((q->rear+1)%MAXSIZE==q->front)//避免rear指針位於隊列最一個下標的位置
         return OK;
    else
        return ERROR;
}
int   length_seqqueue(Seq_Queue*q)//循環隊列的長度
{
    //判斷隊列是否爲空
    if(empty_seqqueue(q))
        return ERROR;
    else
    {
        return ((q->rear-q->front+MAXSIZE)%MAXSIZE);
    }
}
Statu pop_seqqueue(Seq_Queue*q,ElementType *data)//出隊
{
    if(empty_seqqueue(q))
        return ERROR;
    else
    {
        strcpy(data->name,q->data[q->front].name);
        data->id=q->data[q->front].id;
          q->front=(q->front+1)%MAXSIZE;//將front指針前移動一個位置
        return OK;

    }

}
Statu push_seqqueue(Seq_Queue*q,ElementType*data)//入隊
{
    //判斷隊列是否爲滿
    if(full_seqqueue(q))
        return ERROR;
    else
    {
             q->data[q->rear].name=(NameTyp)malloc(sizeof(char)*MAXSIZE);
            strcpy(q->data[q->rear].name,data->name);
            q->data[q->rear].id=data->id;
             q->rear=(q->rear+1)%MAXSIZE;
             return OK;
    }

}
Statu getdata_seqqueue(Seq_Queue*q,ElementType *data)//取隊頭元素
{
    if(empty_seqqueue(q))
         return ERROR;
    else
    {
        data->id=q->data[q->front].id;
        strcpy(data->name,q->data[q->front].name);
        return OK;
   }
}
void Display_seqqueue(Seq_Queue*q)//遍歷隊列的元素
{
    //對其進行判空
    if(empty_seqqueue(q))
        return ERROR;
      else
      {
          while(empty_seqqueue(q)!=1)
          {
              ElementType data;
              data.name=(NameTyp)malloc(sizeof(char)*MAXSIZE);
              pop_seqqueue(q,&data);
               printf("[%d,%s]\t",data.id,data.name);

          }
      }
}










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