教大家怎樣寫佇列?
阿新 • • 發佈:2018-12-09
學習日誌3 姓名:繆志超 日期:2018.9.12
今日學習任務 1、佇列的順序 2、鏈式儲存 3、空對:隊頭隊尾重合 4、隊尾指標:指向最後一個元素的後一個 5、自定義函式來實現初始化,清空,輸入,輸出,刪除,銷燬等一系列操作
今日任務完成情況 1、按照課上老師的要求已經全部完成了所有的任務,並且實現了除錯。 2、今天的程式碼開發量已經達到400多行。
今日開發中出現的問題 今天開發中出現的問題自己都能獨立解決。
今日開發收穫 1、學會了如何初始化,清空,輸入,輸出,刪除,銷燬等一系列操作 2、學會了如何佇列的順序儲存
自我感覺 感覺不錯,每天都能學到一些在學校學不到的知識,有成為程式設計師的潛力。
程式程式碼 下面我將我今天寫的程式與大家共勉,如有錯誤還請大家指出,謝謝! 1、首先建一個檔名:queue.c
#include "queue.h"
#include <stdlib.h>
int InitQueue(Q *q)
{
if(NULL == q) //入參判斷
{
return FAILURE;
}
//申請一塊記憶體空間 ,並且讓 data 指標指向 這塊空間
q->data = (int *)malloc(sizeof(int)*MAXSIZE);
if(NULL == q->data) //返回值判斷(如果申請失敗 )
{
return FAILURE;
}
q->rear = q->front = 0; //隊頭隊尾 指標指向同一個
return SUCCESS;
}
int EnterQueue(Q *q,int e)
{
if(NULL == q)
{
return FAILURE;
}
if((q->rear + 1) % MAXSIZE == q->front) // 隊滿
{
return FAILURE;
}
q->data[q->rear] = e;
q->rear = (q->rear + 1 ) % MAXSIZE;
return SUCCESS;
}
int DelQueue(Q *q)
{
if(NULL == q)
{
return FAILURE;
}
if(q->rear == q->front) //空隊
{
return FAILURE;
}
int e = q->data[q->front];
q->front = (q->front + 1) % MAXSIZE;
return e;
}
int LengthQueue(Q q)
{
return (q.rear - q.front + MAXSIZE) % MAXSIZE;
}
int ClearQueue(Q *q)
{
if(NULL == q)
{
return FAILURE;
}
q->rear = q->front;
return SUCCESS;
}
int DestroyQueue(Q *q)
{
if(NULL == q)
{
return FAILURE;
}
free(q->data); //釋放空間
q->data = NULL;
return SUCCESS;
}
再建一個檔名:main.c
#include <stdio.h>
#include "queue.h"
int main()
{
int i, ret;
Q queue; //定義佇列
ret = InitQueue(&queue);
if(SUCCESS == ret)
{
printf("Init Success!\n");
}
else
{
printf("Init Failure!\n");
}
for(i=0;i<10;i++)
{
ret = EnterQueue(&queue,i+1);
if(ret == FAILURE)
{
printf("Enter Failure!\n");
}
else
{
printf("Enter %d Success!\n",i+1);
}
}
for(i=0;i<5;i++)
{
ret = DelQueue(&queue);
if(ret == FAILURE)
{
printf("Delete Failure!\n");
}
else
{
printf("Delete %d Success!\n",ret);
}
}
ret = LengthQueue(queue);
printf("length is %d\n",ret);
ret = ClearQueue(&queue);
if(ret == SUCCESS)
{
printf("Clear Success!\n");
}
else
{
printf("Clear Failure!\n");
}
ret = DestroyQueue(&queue);
if(ret == SUCCESS)
{
printf("Destroy Success!\n");
}
else
{
printf("Destroy Failure!\n");
}
return 0;
}
最後建一個檔名:queue.h
#ifndef QUEUE_H
#define QUEUE_H
#define MAXSIZE 10 //RONGLIANG
#define SUCCESS 1000
#define FAILURE 1001
struct queue
{
int *data; //指向佇列的儲存空間
int front; //隊頭指標
int rear; //隊尾指標
};
typedef struct queue Q;
int InitQueue(Q *q);
int EnterQueue(Q *q,int e);
int DelQueue(Q *q);
int LengthQueue(Q q);
int ClearQueue(Q *q);
int DestroyQueue(Q *q);
#endif
輸入命令:./a.out 除錯結果 :
2、鏈式儲存
首先建一個檔名:queue.h
#ifndef QUEUE_H
#define QUEUE_H
#define SUCCESS 1000
#define FAILURE 1001
struct node //結點的資訊
{
int data; //資料域
struct node *next; //指標域
};
typedef struct node Node;
struct queue //佇列的資訊
{
Node *front; //隊頭指標
Node *rear; //隊尾指標
};
typedef struct queue Q;
int InitQueue(Q **q);
int EnterQueue(Q *q,int e);
int DeletQueue(Q *q);
int LengthQueue(Q *q);
int ClearQueue(Q *q);
int EmptyQueue(Q *q);
int DestroyQueue(Q **q);
#endif
再建一個檔名:main.c
#include "queue.h"
#include <stdio.h>
int main()
{
int i, ret;
Q *queue;
ret = InitQueue(&queue);
if(ret == SUCCESS)
{
printf("Init Success!\n");
}
else
{
printf("Init Failure!\n");
}
for (i=0;i<10;i++)
{
ret = EnterQueue(queue,i+1);
if(ret == SUCCESS)
{
printf("Enter %d Success!\n",i+1);
}
else
{
printf("Enter Failure!\n");
}
}
for (i=0;i<6;i++)
{
ret = DeleteQueue(queue);
if(ret == FAILURE)
{
printf("Delete Failure!\n");
}
else
{
printf("Delete %d Success!\n",ret);
}
}
ret = LengthQueue(queue);
printf("length is %d\n",ret);
ret = ClearQueue(queue);
if(ret == SUCCESS)
{
printf("Clear Success!\n");
}
else
{
printf("Clear Failure!\n");
}
ret = LengthQueue(queue);
printf("length is %d\n",ret);
ret = EmptyQueue(queue);
if(SUCCESS == ret)
{
printf("queue is empty!\n");
}
else
{
printf("queue is not empty!\n");
}
ret = DestroyQueue(&queue);
if(ret == SUCCESS)
{
printf("Destroy Success!\n");
}
else
{
printf("Destroy Failure!\n");
}
return 0;
}
最後建一個檔名:queue.c
#include "queue.h"
#include <stdlib.h>
int InitQueue(Q **q)
{
if (NULL == q) //入參判斷
{
return FAILURE;
}
(*q) = (Q *)malloc(sizeof(Q)); //gei dui lie xinxi shenqing kongjian
if(NULL == (*q))
{
return FAILURE;
}
Node *p = (Node *)malloc(sizeof(Node));//頭結點申請空間
if (NULL == p)
{
return FAILURE;
}
(*q)->front = (*q)->rear = p;//隊頭指標 隊尾指標都指向頭結點
return SUCCESS;
}
int EnterQueue(Q *q,int e)
{
if(NULL == q)
{
return FAILURE;
}
Node *p = (Node *)malloc(sizeof(Node));
if(NULL == p)
{
return FAILURE;
}
p->next = NULL; //指標域
p->data = e; //資料域
q->rear->next = p;
q->rear = p;
return SUCCESS;
}
int DeleteQueue(Q *q)
{
if(NULL == q)
{
return FAILURE;
}
if(q->rear == q->front) //空隊
{
return FAILURE;
}
Node *p = q->front->next;
int e = p->data;
q->front->next = p->next;
free(p);
if(q->rear == p) //只剩一個結點的情況
{
q->rear = q->front;
}
return e;
}
int LengthQueue(Q *q)
{
if(NULL == q)
{
return FAILURE;
}
int length = 0;
Node *p = q->front->next;
while(p) //while(p!=NULL)
{
length++;
p = p->next;
}
return length;
}
int ClearQueue(Q *q)
{
if(NULL == q) //入參判斷
{
return FAILURE;
}
Node *p = q->front->next;
while(p)
{
q->front->next = p->next;
free(p); //釋放結點
p = q->front->next; //指向新的結點
}
q->rear = q->front; //刪完所有的結點,隊尾指標指向開頭
return SUCCESS;
}
int EmptyQueue(Q *q)
{
if(NULL == q)
{
return FAILURE;
}
return (q->front == q->rear) ? SUCCESS : FAILURE;
}
int DestroyQueue(Q **q)
{
if(NULL == q)
{
return FAILURE;
}
free((*q)->front); //釋放頭結點
free(*q); //釋放佇列資訊
*q = NULL;
return SUCCESS;
}
除錯命令:./a.out 除錯結果: