C語言數(shù)據(jù)結構之判斷循環(huán)鏈表空與滿
C語言數(shù)據(jù)結構之判斷循環(huán)鏈表空與滿
前言:
何時隊列為空?何時為滿?
由于入隊時尾指針向前追趕頭指針,出隊時頭指針向前追趕尾指針,故隊空和隊滿時頭尾指針均相等。因此,我們無法通過front=rear來判斷隊列“空”還是“滿”。
注:先進入的為‘頭',后進入的為‘尾'。
解決此問題的方法至少有三種:
其一是另設一個布爾變量以匹別隊列的空和滿;
其二是少用一個元素的空間,約定入隊前,測試尾指針在循環(huán)意義下加1后是否等于頭指針,若相等則認為隊滿(注意:rear所指的單元始終為空);
其三是使用一個計數(shù)器記錄隊列中元素的總數(shù)(實際上是隊列長度)。
第一種方法沒有實現(xiàn),下面實現(xiàn)第二種和第三種:
一、少用一個元素空間,約定以“隊列頭指針front在隊尾指針rear的下一個位置上”作為隊列“滿”狀態(tài)的標志。即:
隊空時: front=rear
隊滿時: (rear+1)%maxsize=front
front指向隊首元素,rear指向隊尾元素的下一個元素。
/////////////////////////////////////////
//
// author: kangquan2008@csdn
//
/////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define QUEUE_SIZE 10
#define EN_QUEUE 1
#define DE_QUEUE 2
#define EXIT 3
typedef int Item;
typedef struct QUEUE{
Item * item;
int front;
int tear;
}Queue;
int init_queue(Queue * queue)
{
queue->item = malloc(QUEUE_SIZE * sizeof(Item));
if(!queue->item)
{
printf("%s\n","Alloc failed,not memory enough");
exit(EXIT_FAILURE);
}
queue->front = queue->tear = 0;
return 1;
}
int en_queue(Queue * queue, Item item)
{
if((queue->tear+1) % QUEUE_SIZE == queue->front)
{
printf("%s\n","The queue is full");
return -1;
}
queue->item[queue->tear] = item;
queue->tear = (queue->tear + 1) % QUEUE_SIZE;
return 1;
}
int de_queue(Queue * queue, Item * item)
{
if(queue->front == queue->tear)
{
printf("%s\n","The queue is empty");
return -1;
}
(*item) = queue->item[queue->front];
queue->front = (queue->front + 1) % QUEUE_SIZE;
return 1;
}
int destroy_queue(Queue * queue)
{ free(queue->item);
}
int main()
{
Queue que;
init_queue(&que);
int elem;
bool flag = true;
while(flag)
{
int choice;
printf("1 for en_queue,2 for de_queue,3 for exit\r\nplease input:");
scanf("%d",&choice);
switch((choice))
{
case EN_QUEUE:
printf("input a num:");
scanf("%d",&elem);
en_queue(&que,elem);
break;
case DE_QUEUE:
if(de_queue(&que,&elem) == 1)
printf("front item is:%d\n",elem);
break;
case EXIT:
flag = false;
break;
default:
printf("error input\n");
break;
}
}
destroy_queue(&que);
return 0;
}
二、 實例代碼:
#include <stdio.h>
#include <assert.h>
#define QueueSize 100
typedef char datatype;
//隊列的數(shù)據(jù)元素
typedef struct
{
int front;
int rear;
int count; //計數(shù)器,用來記錄元素個數(shù)
datatype data[QueueSize]; //數(shù)據(jù)內(nèi)容
}cirqueue;
//置空隊
void InitQueue(cirqueue *q)
{
q->front = q->rear = 0;
q->count = 0;
}
//判斷隊滿
int QueueFull(cirqueue *q)
{
return (q->count == QueueSize);
}
//判斷隊空
int QueueEmpty(cirqueue *q)
{
return (q->count == 0);
}
//入隊
void EnQueue(cirqueue *q, datatype x)
{
assert(QueueFull(q) == 0); //q滿,終止程序
q->count++;
q->data[q->rear] = x;
q->rear = (q->rear + 1)%QueueSize; //循環(huán)隊列設計,防止內(nèi)存浪費
}
//出隊
datatype DeQueue(cirqueue *q)
{
datatype temp;
assert(QueueEmpty(q) == 0);//q空,則終止程序,打印錯誤信息
temp = q->data[q->front];
q->count--;
q->front = (q->front + 1)%QueueSize;
return temp;
}
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
C++實現(xiàn)LeetCode(16.最近三數(shù)之和)
這篇文章主要介紹了C++實現(xiàn)LeetCode(16.最近三數(shù)之和),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
C++ 中malloc()和free()函數(shù)的理解
這篇文章主要介紹了C++ 中malloc()和free()函數(shù)的理解的相關資料,這里提供用法示例幫助大家理解這部分知識,需要的朋友可以參考下2017-08-08
VS2022新建項目時沒有ASP.NET Web應用程序(.NET Framework)
本文主要介紹了VS2022新建項目時沒有ASP.NET Web應用程序的解決,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-10-10
C++ throw關鍵字實現(xiàn)拋出異常和異常規(guī)范
本文主要介紹了C++ throw關鍵字實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
基于matlab對比度和結構提取的多模態(tài)解剖圖像融合實現(xiàn)
這篇文章主要介紹了多模態(tài)醫(yī)學圖像配準與融合的概念、方法及意義,最后簡單介紹了小波變換分析方法。感興趣的小伙伴可以跟隨小編一起學習一下2021-11-11

