考研数据结构之队列(3.2)——链队的操作(C表示)

概述

链队的要素:

(1)两个状态

  • 队空状态:lqu->rear==NULL或者lqu->front==NULL
  • 队满状态:假设内存无限大的情况就不存在队满的情况

(2)两个操作

  • 元素进队操作(假设p指向进队元素):lqu->rear->next=p;lqu->rear=p;
  • 元素出队操作(假设x存储出队元素):p=lqu->front;lqu->front=p->next;x=p->data;free(p);

链表操作示意图:

代码

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

#define maxSize 20

/* 链队结点类型定义 */
typedef struct QNode {
	int data;// 数据域
	struct QNode *next;// 指针域
} QNode;
/* 链队类型定义 */
typedef struct {
	QNode *front;// 队头指针
	QNode *rear;// 队尾指针
} LiQueue;

/* 初始化链队 */
/* *&lqu指的是链队 */
void initQueue(LiQueue *&lqu) {
	lqu=(LiQueue*)malloc(sizeof(LiQueue));// 创建链队
	lqu->front=NULL;// 将头指针初始化为NULL
	lqu->rear=NULL;// 将尾指针初始化为NULL
}

/* 判断队空 */
int isQueueEmpty(LiQueue *lqu) {
	if(lqu->front==NULL||lqu->rear==NULL) { // 只要队头指针和队尾指针任一为NULL就队空
		return 1;// 队空返回1
	} else {
		return 0;// 非空返回0
	}
}

/* 入队 */
void enQueue(LiQueue *lqu,int x) {
	QNode *p;// 要入队的结点
	p=(QNode*)malloc(sizeof(QNode));// 为结点分配空间
	p->data=x;// 赋予数据
	p->next=NULL;
	if(lqu->rear==NULL) { // 若队列为空,则新结点是队首结点,也是队尾结点
		lqu->front=p;
		lqu->rear=p;
	} else { // 若队列非空
		lqu->rear->next=p;// 将新结点链接到队尾
		lqu->rear=p;// 同时将队尾指针指向新结点
	}
}

/* 出队 */
int deQueue(LiQueue *lqu,int &x) {
	QNode *p;// 保存要出队的结点
	if(lqu->rear==NULL) { // 队空不能出队
		return 0;
	} else {
		p=lqu->front;// 即保存要出队的头结点
	}
	if(lqu->front==lqu->rear) { // 队列中只有一个结点,出队操作需要特殊处理
		lqu->front=lqu->rear=NULL;// 只有一个结点,出队后队列为空
	} else {
		lqu->front=lqu->front->next;// 将队首指针指向原队首指针的下一个结点
	}
	x=p->data;// 保存要出队的数据
	free(p);// 释放结点资源
	return 1;// 出队成功返回1
}

/* 打印队列 */
void printQueue(LiQueue *lqu) {
	printf("\n");
	while(lqu->front!=NULL) {
		int x;
		deQueue(lqu,x);
		printf("%d\t",x);
	}
	printf("\n");
}

int main() {
	/* 初始化链队 */
	LiQueue *lqu;
	initQueue(lqu);

	/* 入队 */
	int nums[]= {1,2,3,4,5};
	int n=5;
	for(int i=0; i<n; i++) {
		enQueue(lqu,nums[i]);
	}
//	printQueue(lqu);// 打印入队后的队列

	/* 出队 */
	int x;
	int i=deQueue(lqu,x);
	printf("出队元素:%d",x);// 打印出队元素
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值