链队列:使用链表实现的队列;具有队头指针和队尾指针,指示队列元素所在的位置。
链队列特性:
只能队尾插入元素、在队头删除元素。
先进先出(First In First Out)的线性表,先进入的元素出队,后进入的元素才能出队。
优点:
相比普通的队列,元素出队时无需移动大量元素,只需移动头指针。
可动态分配空间,不需要预先分配大量存储空间。
适合处理用户排队等待的情况。
缺点:
需要为表中的逻辑关系增加额外的存储空间。
代码实现
1.定义节点和队列
//链队列节点
typedef struct LinkNode
{
int data;
struct LinkNode* next;
}*LinkNodePtr;
//链队列
typedef struct LinkQueue
{
LinkNodePtr front;
LinkNodePtr rear;
} *LinkQueuePtr;
2.初始化,创造空队列
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;
}
3.打印,输出队列函数
void outputLinkQueue(LinkQueuePtr paraQueuePtr){
LinkNodePtr tempPtr = paraQueuePtr->front->next;
while (tempPtr != NULL) {
printf("%d ", tempPtr->data);
tempPtr = tempPtr->next;
}
printf("\r\n");
}
4.入队
void enterQueue(LinkQueuePtr paraQueuePtr,int paraElem)
{
LinkNodePtr tempPtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
tempPtr->data = paraElem;
tempPtr->next = NULL;
paraQueuePtr->rear->next = tempPtr;
paraQueuePtr->rear = tempPtr;
}
入队操作,就是在链表尾部插入节点
5.出队
int deleteQueue(LinkQueuePtr paraQueuePtr)
{
int result;
LinkNodePtr tempPtr;
//判断队列是否为空
if(paraQueuePtr->front == paraQueuePtr->rear)
{
printf("队列为空,不能删除\n");
return -1;
}
tempPtr = paraQueuePtr->front->next;
result = tempPtr->data;
paraQueuePtr->front->next = tempPtr->next;
if(paraQueuePtr->rear == tempPtr)
{
paraQueuePtr->rear = paraQueuePtr->front;
}
free(tempPtr);
return result;
}
出队操作就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素时,则需将rear指向头结点
6.测试代码
void queueText()
{
LinkQueuePtr tempQueue = initQueue();
enterQueue(tempQueue,5);
enterQueue(tempQueue,10);
enterQueue(tempQueue,15);
enterQueue(tempQueue,20);
outputQueue(tempQueue);
printf("删除%d\n",deleteQueue(tempQueue));
printf("删除%d\n",deleteQueue(tempQueue));
outputQueue(tempQueue);
printf("删除%d\n",deleteQueue(tempQueue));
printf("删除%d\n",deleteQueue(tempQueue));
printf("删除%d\n",deleteQueue(tempQueue));
enterQueue(tempQueue,13);
outputQueue(tempQueue);
}
7.输出结果
5 10 15 20
删除5
删除10
15 20
删除15
删除20
队列为空,不能删除
删除-1
13
总结
队列是一种先进先出的线性表