《数据结构与算法分析——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)输出受限的双端队列,有一端允许插入和删除,而另一端只允许插入。

猜你喜欢

转载自blog.csdn.net/qq_40344308/article/details/88724869
今日推荐