数据结构之链式队列(C语言版)

定义一个链式队列:

先定义一个链式队列结点(以链表结点形式实现)

再定义一个linkequeue结构体其中包含队头指针和队尾指针

///链式队列//
typedef struct qnode{//链式队列结点 
	int data;//队列元素
	struct qnode *next;//指向下一个结点的指针 
}qnode,*lqueue; 

typedef struct linkqueue{//链式队列---可选,不写结构体,直接定义对头队尾指针也可 
	lqueue front,rear;//队头队尾指针,队首指针是链表头结点 
}linkqueue;

初始化函数:

传入链式队列q的指针

先动态创建队首指针和队尾指针

再判断是否内存分配成功

如果分配成功后就让队首指针的下一个结点指向NULL(即头结点指向NULL)

//初始化
void initqueue(linkqueue *q)
{   
	q->front=q->rear=(lqueue)malloc(sizeof(qnode));
    if(q->front==NULL)
    {
    	printf("分配失败\n");
	}
	else{
		q->front->next=NULL;
	}
 } 

入队函数:

传入队列q的指针

再创建一个结点s将数据写入结点

再让s指向NULL

之后再让队尾指针指向结点s

之后再将结点的地址赋给队尾指针(即结点s变成了新的队尾)

//入队 
void enqueue(linkqueue* q,int x)
{
	lqueue s=(lqueue )malloc(sizeof(qnode));
	s->data =x;
	s->next =NULL;//新节点插入到链尾
	q->rear->next=s;
	q->rear =s; 
 } 

出队函数:

传入队列q的指针

先创建x用来保存出队元素x

之后判空(即队首指针的头结点所指向的结点是否为空)

如果非空则

创建结点p并且将队首指针的头结点指向结点p

之后把首元结点的数据写入x

再打印x的数值

最后判断原队列是否只有一个结点(即判断队尾指针是否指向待删除的结点)

如果是则要让队尾指针指向队首指针所指向的头结点

最后删除结点p

 //出队,队首指针是链表头结点 ,删除的是队首指针的下一个,即front->next 
void dequeue(linkqueue* q) 
{
	int x;//保存出队元素 
	//先判空,不空才能出 
	if(q->front->next==NULL)
	{
		printf("空\n");//队空,报错 
	 } 
	else{
		lqueue p=q->front->next; 
		x=p->data;
		q->front ->next=p->next ;
		printf("%d\n",x);
		//若原队列只有一个结点了,则删除边空,需要处理尾指针 
		if(q->rear =p)
		q->rear =q->front;
		free(p); 
	}

总代码:

#include<stdio.h>
#include<stdlib.h>

///链式队列//
typedef struct qnode{//链式队列结点 
	int data;//队列元素
	struct qnode *next;//指向下一个结点的指针 
}qnode,*lqueue; 

typedef struct linkqueue{//链式队列---可选,不写结构体,直接定义对头队尾指针也可 
	lqueue front,rear;//队头队尾指针,队首指针是链表头结点 
}linkqueue;

//初始化
void initqueue(linkqueue *q)
{   
	q->front=q->rear=(lqueue)malloc(sizeof(qnode));
    if(q->front==NULL)
    {
    	printf("分配失败\n");
	}
	else{
		q->front->next=NULL;
	}
 } 

//入队 
void enqueue(linkqueue* q,int x)
{
	lqueue s=(lqueue )malloc(sizeof(qnode));
	s->data =x;
	s->next =NULL;//新节点插入到链尾
	q->rear->next=s;
	q->rear =s; 
 } 
 //出队,队首指针是链表头结点 ,删除的是队首指针的下一个,即front->next 
void dequeue(linkqueue* q) 
{
	int x;//保存出队元素 
	//先判空,不空才能出 
	if(q->front->next==NULL)
	{
		printf("空\n");//队空,报错 
	 } 
	else{
		lqueue p=q->front->next; 
		x=p->data;
		q->front ->next=p->next ;
		printf("%d\n",x);
		//若原队列只有一个结点了,则删除边空,需要处理尾指针 
		if(q->rear =p)
		q->rear =q->front;
		free(p); 
	}
}
int main()
{
	linkqueue* q;
	q=(linkqueue*)malloc(sizeof(linkqueue));
	initqueue(q);
	enqueue(q,1);
	enqueue(q,2);
	enqueue(q,3);
	dequeue(q);
	dequeue(q);
	dequeue(q);
	dequeue(q);
	enqueue(q,4);
    dequeue(q);
	dequeue(q);
	return 0;
 } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值