一、链队列
需要创建两个指针分别指向队头和队尾,删除元素只能在队头进行,当然添加元素也只能在队尾进行
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;
}
一些测试结果

949

被折叠的 条评论
为什么被折叠?



