c语言空链表,C语言数据结构之判断循环链表空与满

C语言数据结构之判断循环链表空与满

前言:

何时队列为空?何时为满?

由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,我们无法通过front=rear来判断队列“空”还是“满”。

注:先进入的为‘头',后进入的为‘尾'。

解决此问题的方法至少有三种:

其一是另设一个布尔变量以匹别队列的空和满;

其二是少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空);

其三是使用一个计数器记录队列中元素的总数(实际上是队列长度)。

第一种方法没有实现,下面实现第二种和第三种:

一、少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志。即:

队空时: front=rear

队满时: (rear+1)%maxsize=front

front指向队首元素,rear指向队尾元素的下一个元素。

/

//

// author: kangquan2008@csdn

//

/

#include

#include

#include

#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

#include

#define QueueSize 100

typedef char datatype;

//队列的数据元素

typedef struct

{

int front;

int rear;

int count; //计数器,用来记录元素个数

datatype data[QueueSize]; //数据内容

}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; //循环队列设计,防止内存浪费

}

//出队

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;

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值