数据结构-链队列和循环队列

一、链队列

需要创建两个指针分别指向队头和队尾,删除元素只能在队头进行,当然添加元素也只能在队尾进行

1.链队列的节点

typedef struct LinkNode{
	int data;
	LinkNode*next;
}*LinkNodePtr;

2.链队列

typedef struct LinkQueue{
	LinkNodePtr front;
	LinkNodePtr rear;
}*LinkQueuePtr;

3.创建头节点

头指针和尾指针指向头节点

LinkQueuePtr initQueue(){
	LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue));
	LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
	headerPtr->next = NULL;
	resultPtr->front = headerPtr;
	resultPtr->rear = headerPtr;
	return resultPtr; 
}

4.入队

创建一个新节点,尾指针所指节点的后继指针指向新节点,尾指针也指向新节点

void enqueue(LinkQueuePtr paraQueuePtr,int paraElement){
	LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
	tempNodePtr->data = paraElement;
	tempNodePtr->next = NULL;
	
	paraQueuePtr->rear->next = tempNodePtr;
	paraQueuePtr->rear = tempNodePtr; 
}

5.出队

首先需要判断队列是否为空,只要判断头指针和尾指针是否相等即可。由于删除操作只能在队头进行,所以只需要创建一个新节点,将其指向头节点的后继节点即可,将其中的元素取出,然后将头节点的后继指针指向第二个节点,最后将第一个节点删除即可,再将其中的元素返回

int dequeue(LinkQueuePtr paraQueuePtr){
	int resultValue;
	LinkNodePtr tempNodePtr;
	
	if(paraQueuePtr->front == paraQueuePtr->rear){
		printf("The queue is empty.\r\n");
		return -1;
	} 
	
	tempNodePtr = paraQueuePtr->front->next;
	resultValue = tempNodePtr->data;
	paraQueuePtr->front->next = paraQueuePtr->front->next->next;
	
	if(paraQueuePtr->rear == tempNodePtr){
		paraQueuePtr->rear = paraQueuePtr->front; 
	}
	
	free(tempNodePtr);
	tempNodePtr = NULL;
	return resultValue;
}

一些样例的测试结果

二、循环队列

        循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾,但队列大小是固定的。

        在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize

1.定义结构体

typedef struct CircleIntQueue{
	int data[TOYAL_SPACE];
	int head;
	int tail;
}*CircleIntQueuePtr;

2.队列初始化

CircleIntQueuePtr initQueue(){
	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;
	
	return resultPtr; 
}

3.入队

首先需要判断队列是否已满

void enqueue(CircleIntQueuePtr paraPtr,int paraValue){
	if((paraPtr->tail + 1) % TOYAL_SPACE == paraPtr->head){
		printf("Queue full.\r\n");
		return; 
	} 
	
	paraPtr->data[paraPtr->tail % TOYAL_SPACE] = paraValue;
	paraPtr->tail++;
}

4.出队

首先需要判断队列是否为空

int dequeue(CircleIntQueuePtr paraPtr){
	int resultValue;
	if(paraPtr->head == paraPtr->tail){
		printf("No element in the queue.\r\n");
		return -1;
	} 
	
	resultValue = paraPtr->data[paraPtr->head % TOYAL_SPACE];
	paraPtr->head++;
	
	return resultValue;
}

一些测试结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值