- 一、队列的定义
- 二、链队列结构
- 三、基本操作
- 1、结构体
- 2.初始化
- 3.进队
- 4.出队
- 5.遍历
- 四、完整代码
一、队列的定义
队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。队列的结构图如下所示:
链队列,是队列的一种,只不过运用链表的知识对队列进行再设计。结构图:
第一个结构体是链队列的节点,第二个结构体是存放链队列的首尾指针。
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("队列为空! 无法删除!rn");
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("rn");
}
四、完整代码
#include#include 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("rn"); } 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("队列为空! 无法删除!rn"); 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!rn",dequeue(tempQueueptr)); printf("dequeue gets %d!rn",dequeue(tempQueueptr)); printf("dequeue gets %d!rn",dequeue(tempQueueptr)); printf("dequeue gets %d!rn",dequeue(tempQueueptr)); printf("dequeue gets %d!rn",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!



