一、队列的定义
队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。队列的结构图如下所示:
二、链队列结构
链队列,是队列的一种,只不过运用链表的知识对队列进行再设计。结构图:
三、基本操作
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(struct linkQueue));
linkNodeptr headerptr=(linkNodeptr)malloc(sizeof(struct linkNode));
headerptr->data=-1;
headerptr->next=NULL;
resultptr->front=headerptr;
resultptr->rear=headerptr;
return resultptr;
}
3.进队
void enqueue(linkQueueptr pQueueptr,int pelement)
{
linkNodeptr tempNodeptr=(linkNodeptr)malloc(sizeof(struct linkNode));
tempNodeptr->data=pelement;
tempNodeptr->next=NULL;
pQueueptr->rear->next=tempNodeptr;
pQueueptr->rear=tempNodeptr;
}
4.出队
int dequeue(linkQueueptr pQueueptr)
{
int resultValue;
linkNodeptr tempNodeptr;
if(pQueueptr->front==pQueueptr->rear)
{
printf("队列为空! 无法删除!\r\n");
return -1;
}
tempNodeptr=pQueueptr->front->next;
resultValue=tempNodeptr->data;
pQueueptr->front->next=pQueueptr->front->next->next;
if(pQueueptr->rear==tempNodeptr)
{
pQueueptr->rear=pQueueptr->front;
}
free(tempNodeptr);
return resultValue;
}
5.遍历
void printQueue(linkQueueptr pQueueptr)
{
linkNodeptr tempptr=pQueueptr->front->next;
while(tempptr)
{
printf("%d ",tempptr->data);
tempptr=tempptr->next;
}
printf("\r\n");
}
四、完整代码
#include<stdio.h>
#include<malloc.h>
typedef struct linkNode
{
int data;
struct linkNode* next;
}*linkNodeptr;
typedef struct linkQueue
{
linkNodeptr front;
linkNodeptr rear;
}*linkQueueptr;
linkQueueptr initQueue()
{
linkQueueptr resultptr=(linkQueueptr)malloc(sizeof(struct linkQueue));
linkNodeptr headerptr=(linkNodeptr)malloc(sizeof(struct linkNode));
headerptr->data=-1;
headerptr->next=NULL;
resultptr->front=headerptr;
resultptr->rear=headerptr;
return resultptr;
}
void printQueue(linkQueueptr pQueueptr)
{
linkNodeptr tempptr=pQueueptr->front->next;
while(tempptr)
{
printf("%d ",tempptr->data);
tempptr=tempptr->next;
}
printf("\r\n");
}
void enqueue(linkQueueptr pQueueptr,int pelement)
{
linkNodeptr tempNodeptr=(linkNodeptr)malloc(sizeof(struct linkNode));
tempNodeptr->data=pelement;
tempNodeptr->next=NULL;
pQueueptr->rear->next=tempNodeptr;
pQueueptr->rear=tempNodeptr;
}
int dequeue(linkQueueptr pQueueptr)
{
int resultValue;
linkNodeptr tempNodeptr;
if(pQueueptr->front==pQueueptr->rear)
{
printf("队列为空! 无法删除!\r\n");
return -1;
}
tempNodeptr=pQueueptr->front->next;
resultValue=tempNodeptr->data;
pQueueptr->front->next=pQueueptr->front->next->next;
if(pQueueptr->rear==tempNodeptr)
{
pQueueptr->rear=pQueueptr->front;
}
free(tempNodeptr);
return resultValue;
}
void test()
{
linkQueueptr tempQueueptr;
tempQueueptr=initQueue();
enqueue(tempQueueptr,10);
enqueue(tempQueueptr,100);
enqueue(tempQueueptr,1000);
enqueue(tempQueueptr,10000);
printQueue(tempQueueptr);
printf("dequeue gets %d!\r\n",dequeue(tempQueueptr));
printf("dequeue gets %d!\r\n",dequeue(tempQueueptr));
printf("dequeue gets %d!\r\n",dequeue(tempQueueptr));
printf("dequeue gets %d!\r\n",dequeue(tempQueueptr));
printf("dequeue gets %d!\r\n",dequeue(tempQueueptr));
}
int main()
{
test();
return 0;
}
运行结果:
10 100 1000 10000
dequeue gets 10!
dequeue gets 100!
dequeue gets 1000!
dequeue gets 10000!
队列为空! 无法删除!
dequeue gets -1!