C语言队列的基本操作

队列的定义和特点

和栈相反,队列(queue)是一种先进先出(First In First Out,FIFO)的线性表,它只允许在表的一段进行插入数据,而在另一端删除数据,这和生活中的排队时一致的,最早进入队列的元素最先离开,而在队列中,允许插入的一段叫队尾允许删除的一端叫队头

队列的基本操作

类型命名

typedef int elem;

首先我们先进行类型的命名,方便数据的替换。

结点

typedef struct node//使用单链表实现刚刚好,不需要尾删
{
	struct node* next;
	elem val;
}nn;

在这里我们使用单链表的形式去实现刚刚好,因为在队列中不需要尾删操作

队列形式

typedef struct que
{
	nn* ph;//头节点
	nn* pt;//尾节点
	int size;
}que;

为了方便我们之后的删除和查找等操作,我们创建队列的结构体中含有队列队头和队尾的指针信息,方便我们删除和查找,最后我们在定义一个size用来统计队列的数据个数。

初始化

void ini(que* ps)//初始化
{
	assert(ps);
	ps->ph = ps->pt = NULL;
	ps->size = 0;
}

这里我们进行队列的初始化,我们对队列的队头和队尾指针进行置空,再让size=0就完成操作。

 销毁

void del(que* ps)//删除
{
	assert(ps);
	nn* new = ps->ph;
	while (new)
	{

		nn* del = new->next;
		free(new);
		new = del;
		
	}
	ps->ph = ps->pt = NULL;
	ps->size = 0;
}

在销毁时我们首先要判断ps是否为空,然后创建一个结点指针类型的new来接收ps->ph,然后进行while循环,我们创建一个del来保存new下一个位置的地址,然后将new的空间释放掉,再将del的位置给予new,最后将队列的队头和队尾指针进行置空,再将数据个数置为0就完成了。

队尾插入

void push(que* ps, elem x)//队尾插入
{
	assert(ps);
	nn* new = (nn*)malloc(sizeof(nn));
	if (new == NULL)
	{
		perror("push new");
		return;
	}
	new->next = NULL;
	new->val = x;
	if (ps->pt == NULL)//如果队列没有结点
	{
		ps->ph = ps->pt = new;
	}
	else//尾插
	{
		ps->pt->next = new;
		ps->pt = new;
	}
	ps->size++;
	
}

首先我们先断言ps,然后创建一个结点变量new,然后为他申请一个大小为(nn)的一个空间,随后判断new是否为空,然后将new->next置空,再把x赋值给new->val,然后判断队列中是否含有元素,如果队列中不存在元素,那就将队头和队尾的指针都指向new,如果队列中含有元素,那就把ps->pt->next指向new,再将ps->pt=new,最后将size的个数+1就完成了

 队头删除

void pop(que* ps)//队头删除
{
	assert(ps);
	
	if (ps->ph->next == NULL)//只有一个结点
	{
		free(ps->ph);
		ps->ph = ps->pt = NULL;
	}
	else//多个结点
	{
		nn* new = ps->ph->next;
		free(ps->ph);
		ps->ph = new;
	}
	ps->size--;
}

我们先判断队列是否存在元素,如果只存在一个元素,那就先释放掉队头的结点,然后再将队头和队尾的指针置为空如果链表存在多个结点,那就先创建一个结点变量new因为在队头插入的时候我们使用的是尾插,所以使用头插即可将链表的第二个结点的地址传给new,然后释放掉队尾的空间,最后将new的地址传给队头,再进行size-1就完成了。

 取头结点

elem front(que* ps)//取头结点
{
	assert(ps);
	assert(ps->ph);
	return ps->ph->val;
}

返回队列的队头的val值即可。

取尾节点

elem back(que* ps)//取尾结点
{
	assert(ps);
	assert(ps->pt);
	return ps->pt->val;
}

返回队列的队尾的val值即可。

求数据个数

int size(que* ps)//求数据个数
{
	assert(ps);
	return ps->size;
}

返回队列的size即可。

判空

bool emp(que* ps)//判空
{
	assert(ps);
	return ps->size == 0;
}

在判空时,我们使用bool类型,如果size=0那就返回true,如果size!=0,那就返回false.

请注意,以上代码仅供学习和参考之用。对顺序表相关操作的理解和实现细节,有助于深入掌握数据结构的基本概念。如有任何疑问或建议,欢迎交流。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值