【数据结构】C语言队列的实现

队列定义

队列:是一种特殊的线性表只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出

队列的基本操作

入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

队列也可以顺序表(数组)和链表的结构实现,由于队列支持尾插和头删,所以链表更适合实现队列
在这里插入图片描述

队列的实现

C语言带头尾指针的单链表实现队列:

队列的定义

typedef int Data;
typedef struct queuenode{
    
    
	Data data;
	struct queue* _next;
}queuenode;

typedef struct queue{
    
    
	queuenode* _start;
	queuenode* _end;
}queue;

队列的初始化

void init(queue* qe){
    
    
	qe->_end = qe->_start = NULL;
}

队列增容

queuenode* createqe(Data data){
    
    
	queuenode* node = (queuenode*)malloc(sizeof(queuenode));
	node->data = data;
	node->_next = NULL;
}

入队和出队

//入队(尾插)
void push(queue* qe, Data data){
    
    
	queuenode* newqueue=createqe(data);
	if (qe->_end == qe->_start == NULL){
    
    
		qe->_end = qe->_start = newqueue;
	}
	else{
    
    
		qe->_end->_next = newqueue;
		qe->_end = newqueue;
	}
}

//出队(头删)
void pop(queue* qe){
    
    
	if (qe->_end == NULL){
    
    
		return;
	}
	queuenode* next = qe->_start->_next;
	free(qe->_start);
	qe->_start = next;
	//删除之后是否为空表
	if (qe->_end == NULL){
    
    
		qe->_end = NULL;
		//避免end变为野指针
	}
}

获取队头或队尾

//获取队头元素
int top(queue* qe){
    
    
	return qe->_start->data;
}

int last(queue* qe){
    
    
	return qe->_end->data;
}

获取元素数量

/获取数量
int size(queue* qe){
    
    
	if (qe->_end == NULL){
    
    
		return 0;
	}
	int i = 0;
	queuenode* cur = qe->_start;
	while (cur){
    
    
		i++;
		cur = cur->_next;
	}
	return i;
}

销毁队列

void destory(queue* qe)
{
    
    
	assert(qe);
	queuenode* cur = qe->_start;
	while (cur)
	{
    
    
		queuenode* next = cur->_next;
		free(cur);
		cur = next;
	}
	qe->_start = qe->_end = NULL;
}

猜你喜欢

转载自blog.csdn.net/zhaocx111222333/article/details/114581366