队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素
指针和用链表表示的队列简称为链队列,需要头尾指针才能唯一确定
创建一个队列并初始化将队列的头指针和为指针都指向这个生成的头结点,此时为空对列
//创建一个队列
typedef struct LinkNode{
int data;
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 LinkNodePtr));
headerPtr->next = NULL;
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}
入队列操作
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
paraQueuePtr->rear->next = tempNodePtr;
paraQueuePtr->rear = tempNodePtr;
}
队列的删除操作
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
if (paraQueuePtr->front == paraQueuePtr->rear) {
printf("The queue is empty.rn");
return -1;
}
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}
tempNodePtr = NULL;
return resultValue;
}
出队列操作,将队列中的第一个元素移出 ,队头指针不发生改变,改变头结点的next指针即可
完整代码
#include#include //创建一个队列 typedef struct LinkNode{ int data; 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 LinkNodePtr)); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; } //出队列操作,将队列中的第一个元素移出 ,队头指针不发生改变,改变头结点的next指针即可 void outputLinkQueue(LinkQueuePtr paraQueuePtr){ LinkNodePtr tempPtr = paraQueuePtr->front->next; while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; } printf("rn"); } //入队列操作 void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode)); tempNodePtr->data = paraElement; tempNodePtr->next = NULL; paraQueuePtr->rear->next = tempNodePtr; paraQueuePtr->rear = tempNodePtr; } //队列的删除操作 int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; if (paraQueuePtr->front == paraQueuePtr->rear) { printf("The queue is empty.rn"); return -1; } tempNodePtr = paraQueuePtr->front->next; resultValue = tempNodePtr->data; paraQueuePtr->front->next = paraQueuePtr->front->next->next; if (paraQueuePtr->rear == tempNodePtr) { paraQueuePtr->rear = paraQueuePtr->front; } tempNodePtr = NULL; return resultValue; } void testLinkQueue(){ LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); outputLinkQueue(tempQueuePtr); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); enqueue(tempQueuePtr, 8); outputLinkQueue(tempQueuePtr); } int main(){ testLinkQueue(); return 1; }



