数据结构(C实现)------- 链队列

链队列,即队列的链式存储结构,它是仅在表头删除和表尾插入的单链表,因此一个链队列需要设置两个分别指示队头元素和队尾元素的指针,为了操作方便,给链队列添加一个头结点,并令队头指针指向头结点,由此,空的链队列的判断条件就是队头指针和队尾指针均指向头结点。

链队列的类型描述:

//链队列类型描述
typedef int QElemType;
typedef struct node{
	QElemType data;
	struct node *next;
}QNode,*QueuePtr;
typedef struct{
	QueuePtr front; //队头指针
	QueuePtr rear;  //队尾指针
}LinkQueue;

基本操作:

  1. 链队列的初始化(带头结点)Init_LinkQueue(LinkQueue *Q)

//链队列的初始化(带头结点)
void Init_LinkQueue(LinkQueue *Q){
    QueuePtr head = (QueuePtr)malloc(sizeof(QNode));
    if(!head)
		exit(OVERFLOW);
    head->next = NULL;
	Q->front = Q->rear = head;
}

  2. 销毁链队列Destroy_LinkQueue(LinkQueue *Q)

//销毁链队列
void Destroy_LinkQueue(LinkQueue *Q){
	//从头结点开始释放链队列中所有的结点
	while(Q->front){
		Q->rear = Q->front->next;
		free(Q->front);
		Q->front = Q->rear;
	}
}

  3. 清空链队列Clear_LinkQueue(LinkQueue *Q)

//清空链队列
void Clear_LinkQueue(LinkQueue *Q){
	Destroy_LinkQueue(Q);
	Init_LinkQueue(Q);
}

4. 判断链队列是否为空IsEmpty_LinkQueue(LinkQueue *Q)

//判断链队列是否为空
int IsEmpty_LinkQueue(LinkQueue *Q){
	return Q->front == Q->rear;

}

5. 求链队列的长度GetLength_LinkQueue(LinkQueue *Q)

//求链队列的长度
int GetLength_LinkQueue(LinkQueue *Q){
	int count = 0;
	//指向存放数据的第一个结点
	QueuePtr p = Q->front->next;
	while(p){
		count++;
		p = p->next;
	}
	return count;
}

6. 取得链队列的头部元素GetHead_LinkQueue(LinkQueue *Q,QElemType *x)

//取得链队列的头部元素
void GetHead_LinkQueue(LinkQueue *Q,QElemType *x){
	if(IsEmpty_LinkQueue(Q)){
		printf("链队列为空!\n");
		exit(0);
	}
	else{
		*x = Q->front->next->data;
	}
}

7. 取得链队尾的头部元素GetRear_LinkQueue(LinkQueue *Q,QElemType *x)

//取得链队尾的头部元素
void GetRear_LinkQueue(LinkQueue *Q,QElemType *x){
	if(IsEmpty_LinkQueue(Q)){
		printf("链队列为空!\n");
		exit(0);
	}
	else{
		*x = Q->rear->data;
	}
}

8.  入链队列En_LinkQueue(LinkQueue *Q,QElemType x)

//入链队列
void En_LinkQueue(LinkQueue *Q,QElemType x){
	QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
	if(!q)
		exit(OVERFLOW);
	q->data = x;
	q->next = NULL;
	Q->rear->next = q;
	Q->rear = q;
}

9.  出链队列De_LinkQueue(LinkQueue *Q,QElemType *x)

//出链队列
void De_LinkQueue(LinkQueue *Q,QElemType *x){
	QueuePtr q;
	if(IsEmpty_LinkQueue(Q)){
		printf("链队列为空!\n");
		exit(0);
	}
	else{
		*x = Q->front->next->data;
		q = Q->front->next;
		*x = q->data;
		Q->front->next = q->next;
		//删除元素后队列为空
		if(q->next == NULL)
			Q->rear = Q->front;
		free(q);
	}
}

10.  输出链队列Print_LinkQueue(LinkQueue *Q)

//输出链队列
void Print_LinkQueue(LinkQueue *Q){
	//p指向头结点的下一个结点,即存放数据的第一个结点
	QueuePtr p = Q->front->next;
	if(IsEmpty_LinkQueue(Q)){
		printf("链队列为空!\n");
		exit(0);
	}
	else{
		while(p){
			printf("%d\t",p->data);
			p = p->next;
		}
	printf("\n");
	}
}
时间: 2025-01-02 14:29:38

数据结构(C实现)------- 链队列的相关文章

数据结构与算法——链队列

总结链队列 什么是链队? 队列的链式存储结构称为链队列.链队也有两个指针,队头指针和队尾指针,这样队头删除和队尾插入操作就会很方便,链式队列一般像单链表一样,有一个头结点. 图示: 具体实现: <span style="font-family:Courier New;font-size:14px;">#include <iostream> using namespace std; template <class T> struct Node { T

第三章 队列【数据结构】【链队列】

最近越来越感觉到c语言指针的强大~~ #include<stdio.h> #include<stdlib.h> #define QElemType int #define OK 1 #define ERROR 0 #define OVERFLOW 0 typedef int Status; //------------单链表------------队列的链式存储结构 typedef struct QNode { QElemType data; struct QNode *next;

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

数据结构5_链队列

本文用指针形式实现了先进先出的队列,与栈队列类似,需要设计一个队列节点类,一个队列类, 同时队列类为节点类的友元函数:不过与链栈不同的是,链栈仅用单一指针来实现入栈和出栈 而链队列需要有front和rear两个指针(皆为队列节点类指针),front指针负责处理出列,rear处理入列 #include<iostream>using namespace std;class LinkQueue;class QNode   //每个节点的类{    char *data;    //每个节点的数据类型

数据结构——链队列实现二叉树的层次遍历

在二叉树的遍历这篇博客中https://www.cnblogs.com/wkfvawl/p/9901462.html 对于二叉树的层次遍历我只是给出了基于C++ STL的代码,这里我使用数据结构的链表,构建一个链队列来实现.这也算是我第一次使用链队列来完成某个任务,链队列代码还是来自课本,因为之前使用C++ STL时,queue中的某些函数是有返回值的列如Q.front(),而有些却没有返回值像Q.push(p),Q.pop(),就连有没有参数也是不同的,在这里我没有改动课本上的代码来适应自己的

数据结构 - 链队列的实行(C语言)

数据结构-链队列的实现 1 链队列的定义 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已, 我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点,如下图所示. 空队列时,front和rear都指向头结点,如下图所示. 链队列的结构为: typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */ typedef struct QNode /* 结点结构 */ { QElemTy

数据结构——链队列(linked queue)

/* linkedQueue.c */ /* 链队列 */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> /* 链队列数据结构 */ typedef struct node { int data; /* 节点存储数据 */ struct node *next; /* 指向下一个节点的指针 */ } Node; /* front指向队列头,rear指向队列尾 */ /* front->next

数据结构(二):链表、链队列

上一篇博文中主要总结线性表的顺序存储结构实现.比方顺序表.顺序队列和顺序栈.详细能够參考上篇博文 http://blog.csdn.net/lg1259156776/article/details/46993591 以下要进行学习和总结的是线性表的链式存储结构实现,比方链表和链队列. 顺序存储结构的优缺点 长处是逻辑相邻,物理相邻,可随机存取任一元素,存储空间使用紧凑:缺点是插入.删除操作须要移动大量的元素.平均移动n/2,预先分配空间需依照最大空间分配.利用不充分(C++ STL模板库中实现的

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和