《数据结构与算法分析——C语言描述》第三章 链队列实现(C/C++语言)

链队列实现如下:

//队列实现——链队列
#include <stdio.h>
#include <stdlib.h>

#define ElementType int

typedef struct queue{
	ElementType data;
	struct queue* next;
}Queue;

typedef struct LinkQ{
	Queue *rear, *front;
}Q;

void make_empty( Q &p );                   //初始化栈 
int IsEmpty( Q ptrq );                    //判断队列是否为空,若为空,返回1,否则返回0 
void EnQueue ( ElementType x, Q &ptrq );   //入队 
ElementType DeQueue( Q &ptrq );            //出队 
ElementType GetTop( Q ptrq );             //读取队头元素
int length( Q ptrq );                     //求队长 

int main ( void )
{
	Q ptrq;
	make_empty( ptrq );
	int i, len;
	
	for( i = 5; i < 12; i++ ){
		EnQueue ( i, ptrq );
	}
		
	len = length( ptrq );
	printf( "len = %d\n", len );
	for( i = 0; i < 3; i++ )
		DeQueue( ptrq );
	if( IsEmpty( ptrq ) )
		printf( "表空\n" );
	else
		printf( "表不空,有元素Len = %d个\n", len );
	
	ElementType x = GetTop( ptrq );
	printf( "队头元素是:%d\n, 队尾元素是%d\n", x, ptrq.rear -> data ); 
	
	return 0;
}

void make_empty( Q &p )
{
	p.front = p.rear = ( Queue* )malloc( sizeof( Queue ) );
	p.front -> next = NULL;
}

int IsEmpty( Q ptrq )
{
	return ptrq.rear == ptrq.front;
}

void EnQueue ( ElementType x, Q &ptrq )
{
	Queue *s = ( Queue* )malloc( sizeof( Queue ) );
	if( s == NULL ){
		printf( "申请空间出错\n" );
		exit(0);
	}
	s -> data = x;
	s -> next = NULL;
	ptrq.rear -> next = s;
	ptrq.rear = s;
}

ElementType DeQueue( Q &ptrq )
{
	if( ptrq.rear == ptrq.front ){
		printf( "队空\n" );
		exit(0); 
	}
	Queue *p = ptrq.front -> next;
	ElementType x = p -> data;
	ptrq.front -> next = p -> next;
	if( ptrq.rear == p )
		ptrq.rear = ptrq.front;
	free( p );
	return x;
}

ElementType GetTop( Q ptrq )
{
	if( IsEmpty( ptrq ) ){
		printf( "队空\n" );
		exit(0); 
	}
	return ptrq.front -> next -> data;
}

int length( Q ptrq )
{
	int len = 0;
	Queue *p = ptrq.front;
	while( p -> next != NULL ){
		len++;
		p = p -> next;
	}
	return len;
}

用C写的时候指针指来指去写乱掉了,就用了引用来传递,主函数里的例子有点像陈越老师、何钦铭老师MOOC里面队列小测验的那道题目,写一遍之后思路清晰了不少。

双端队列相关知识点(王道):
双端队列指允许在两端都可以进行入队和出队操作的队列。分为:
(1)两端都可以入队和出队的双端队列;
(2)输入受限的双端队列,有一端允许插入和删除,而另一端只允许删除;
(3)输出受限的双端队列,有一端允许插入和删除,而另一端只允许插入。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

房东的小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值