C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿
前言:
何時(shí)隊(duì)列為空?何時(shí)為滿?
由于入隊(duì)時(shí)尾指針向前追趕頭指針,出隊(duì)時(shí)頭指針向前追趕尾指針,故隊(duì)空和隊(duì)滿時(shí)頭尾指針均相等。因此,我們無(wú)法通過(guò)front=rear來(lái)判斷隊(duì)列“空”還是“滿”。
注:先進(jìn)入的為‘頭',后進(jìn)入的為‘尾'。
解決此問(wèn)題的方法至少有三種:
其一是另設(shè)一個(gè)布爾變量以匹別隊(duì)列的空和滿;
其二是少用一個(gè)元素的空間,約定入隊(duì)前,測(cè)試尾指針在循環(huán)意義下加1后是否等于頭指針,若相等則認(rèn)為隊(duì)滿(注意:rear所指的單元始終為空);
其三是使用一個(gè)計(jì)數(shù)器記錄隊(duì)列中元素的總數(shù)(實(shí)際上是隊(duì)列長(zhǎng)度)。
第一種方法沒(méi)有實(shí)現(xiàn),下面實(shí)現(xiàn)第二種和第三種:
一、少用一個(gè)元素空間,約定以“隊(duì)列頭指針front在隊(duì)尾指針rear的下一個(gè)位置上”作為隊(duì)列“滿”狀態(tài)的標(biāo)志。即:
隊(duì)空時(shí): front=rear
隊(duì)滿時(shí): (rear+1)%maxsize=front
front指向隊(duì)首元素,rear指向隊(duì)尾元素的下一個(gè)元素。
/////////////////////////////////////////
//
// 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;
}
二、 實(shí)例代碼:
#include <stdio.h>
#include <assert.h>
#define QueueSize 100
typedef char datatype;
//隊(duì)列的數(shù)據(jù)元素
typedef struct
{
int front;
int rear;
int count; //計(jì)數(shù)器,用來(lái)記錄元素個(gè)數(shù)
datatype data[QueueSize]; //數(shù)據(jù)內(nèi)容
}cirqueue;
//置空隊(duì)
void InitQueue(cirqueue *q)
{
q->front = q->rear = 0;
q->count = 0;
}
//判斷隊(duì)滿
int QueueFull(cirqueue *q)
{
return (q->count == QueueSize);
}
//判斷隊(duì)空
int QueueEmpty(cirqueue *q)
{
return (q->count == 0);
}
//入隊(duì)
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)隊(duì)列設(shè)計(jì),防止內(nèi)存浪費(fèi)
}
//出隊(duì)
datatype DeQueue(cirqueue *q)
{
datatype temp;
assert(QueueEmpty(q) == 0);//q空,則終止程序,打印錯(cuò)誤信息
temp = q->data[q->front];
q->count--;
q->front = (q->front + 1)%QueueSize;
return temp;
}
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- C語(yǔ)言如何建立動(dòng)態(tài)鏈表問(wèn)題
- C語(yǔ)言利用鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
- C語(yǔ)言中單鏈表(不帶頭結(jié)點(diǎn))基本操作的實(shí)現(xiàn)詳解
- C語(yǔ)言實(shí)現(xiàn)手寫(xiě)Map(數(shù)組+鏈表+紅黑樹(shù))的示例代碼
- C語(yǔ)言中如何實(shí)現(xiàn)單鏈表刪除指定結(jié)點(diǎn)
- C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)
- C語(yǔ)言刷題判斷鏈表中是否有環(huán)題解
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(16.最近三數(shù)之和)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(16.最近三數(shù)之和),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++ 中malloc()和free()函數(shù)的理解
這篇文章主要介紹了C++ 中malloc()和free()函數(shù)的理解的相關(guān)資料,這里提供用法示例幫助大家理解這部分知識(shí),需要的朋友可以參考下2017-08-08
C語(yǔ)言實(shí)現(xiàn)單鏈表的快速排序算法
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)單鏈表的快速排序算法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
VS2022新建項(xiàng)目時(shí)沒(méi)有ASP.NET Web應(yīng)用程序(.NET Framework)
本文主要介紹了VS2022新建項(xiàng)目時(shí)沒(méi)有ASP.NET Web應(yīng)用程序的解決,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
C++ throw關(guān)鍵字實(shí)現(xiàn)拋出異常和異常規(guī)范
本文主要介紹了C++ throw關(guān)鍵字實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
基于matlab對(duì)比度和結(jié)構(gòu)提取的多模態(tài)解剖圖像融合實(shí)現(xiàn)
這篇文章主要介紹了多模態(tài)醫(yī)學(xué)圖像配準(zhǔn)與融合的概念、方法及意義,最后簡(jiǎn)單介紹了小波變換分析方法。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-11-11
C++ push方法與push_back方法常見(jiàn)方法介紹
push與push_back是STL中常見(jiàn)的方法,都是向數(shù)據(jù)結(jié)構(gòu)中添加元素,本文還將簡(jiǎn)述push對(duì)應(yīng)的stack與queue系列,常見(jiàn)方法的介紹,以及與push_back相對(duì)應(yīng)的vector系列常見(jiàn)方法介紹,感興趣的朋友跟隨小編一起看看吧2022-11-11

