一、队列的基本概念
队列:队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
链队列: 队列的链式存储结构表示为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表,只不过它只能尾进头出而已。
二、代码部分
一、头文件
二、队列结点
三、链队列
四、队列的初始化
五、队列的打印
六、元素的插入
七、元素的删除
八、测试函数
九、主函数
十、所有代码
十一、测试结果
十二、总结
一、头文件
#include <stdio.h>
#include <malloc.h>
二、队列结点
//队列结点
typedef struct QueueNode
{
int data;
struct QueueNode *next;
}*QueueNodePtr;
三、链队列
typedef struct LinkQueue
{
QueueNodePtr front;
QueueNodePtr tail;
}*LinkQueuePtr;
四、队列的初始化
//队列的初始化
LinkQueuePtr initQueue()
{
LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
QueueNodePtr headNode = (QueueNodePtr)malloc(sizeof(struct QueueNode));
headNode->next = NULL;
resultPtr->front = headNode;
resultPtr->tail = headNode;
return resultPtr;
}
五、队列的打印
//队列的打印
void printQueue(LinkQueuePtr Queue)
{
QueueNodePtr p = Queue->front->next;
while(p!=NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\r\n");
}
六、队列元素插入
//队列元素插入
void insertQueue(LinkQueuePtr Queue,int element)
{
QueueNodePtr p = (QueueNodePtr)malloc(sizeof(struct QueueNode));
p->data = element;
p->next = NULL;
Queue->tail->next = p;
Queue->tail = p;
}
七、队列元素的删除
//队列元素删除
int deleteQueue(LinkQueuePtr Queue)
{
int value;
//判断队列是否为空
if(Queue ->front == Queue->tail)
{
printf("The queue is full.\n");
return ;
}
QueueNodePtr p = Queue->front ;
QueueNodePtr q = p->next;
p->next = p->next->next;
value = q->data;
if (Queue->tail == q)
{
Queue->tail = Queue->front;
}
free(q);
return value;
}
八、测试函数
void testLinkQueue(){
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
insertQueue(tempQueuePtr, 10);
insertQueue(tempQueuePtr, 30);
insertQueue(tempQueuePtr, 50);
printQueue(tempQueuePtr);
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
insertQueue(tempQueuePtr, 8);
printQueue(tempQueuePtr);
}
九、主函数
int main()
{
testLinkQueue();
return 1;
}
十、所有代码
#include <stdio.h>
#include <malloc.h>
//队列结点
typedef struct QueueNode
{
int data;
struct QueueNode *next;
}*QueueNodePtr;
typedef struct LinkQueue
{
QueueNodePtr front;
QueueNodePtr tail;
}*LinkQueuePtr;
//队列的初始化
LinkQueuePtr initQueue()
{
LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
QueueNodePtr headNode = (QueueNodePtr)malloc(sizeof(struct QueueNode));
headNode->next = NULL;
resultPtr->front = headNode;
resultPtr->tail = headNode;
return resultPtr;
}
//队列的打印
void printQueue(LinkQueuePtr Queue)
{
QueueNodePtr p = Queue->front->next;
while(p!=NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\r\n");
}
//队列元素插入
void insertQueue(LinkQueuePtr Queue,int element)
{
QueueNodePtr p = (QueueNodePtr)malloc(sizeof(struct QueueNode));
p->data = element;
p->next = NULL;
Queue->tail->next = p;
Queue->tail = p;
}
//队列元素删除
int deleteQueue(LinkQueuePtr Queue)
{
int value;
//判断队列是否为空
if(Queue ->front == Queue->tail)
{
printf("The queue is full.\n");
return ;
}
QueueNodePtr p = Queue->front ;
QueueNodePtr q = p->next;
p->next = p->next->next;
value = q->data;
if (Queue->tail == q)
{
Queue->tail = Queue->front;
}
free(q);
return value;
}
void testLinkQueue(){
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
insertQueue(tempQueuePtr, 10);
insertQueue(tempQueuePtr, 30);
insertQueue(tempQueuePtr, 50);
printQueue(tempQueuePtr);
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
printf("dequeue gets %d\r\n", deleteQueue(tempQueuePtr));
insertQueue(tempQueuePtr, 8);
printQueue(tempQueuePtr);
}
int main()
{
testLinkQueue();
return 1;
}
十一、测试结果
十二、总结
1、在定义链队结点结构体的时候LinkNode* next前面应该加struct
2、初始化的时候LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNodePtr));应该改为LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkQueue));
3、经过测试,发现初始化时resultPtr和headNode在相邻空间
4、局部变量的空间能重复利用
5、指针的值是其他元素的位置,指针的地址是该指针的地址