1、初始化链队列
#include<stdio.h>
#include<malloc.h>
//定义链队列的结点。一个数据域,一个指针域。
typedef struct LinkNode
{
int data;
LinkNode* next;
} *LinkNodePtr;
//定义链队列,队首和队尾。
typedef struct LinkQueue
{
LinkNodePtr front;
LinkNodePtr rear;
} *LinkQueuePtr;
//初始化链队列
LinkQueuePtr initQueue()
{
//为resultPtr申请一个大小为LinkQueue的空间。
LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue));
//为headerPtr申请一个大小为LinkNodePtr的空间。
LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
headerPtr->next = NULL;
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}
2、打印队列
//打印队列;
void outputLinkQueue(LinkQueuePtr paraQueuePtr)
{
LinkNodePtr tempPtr = paraQueuePtr->front->next;
while(tempPtr != NULL)
{
printf("%d",tempPtr->data);
tempPtr = tempPtr->next;
}
printf("\r\n");
}
3、设计入队函数
//设计入队函数。
void enqueue(LinkQueuePtr paraQueuePtr,int paraElement)
{
//第一步,创建一个新的空间。
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
//第二步,连接起来。
paraQueuePtr->rear->next = tempNodePtr;
//第三步,连接完成。
paraQueuePtr->rear = tempNodePtr;
}
4、设计出队函数
//设计入队函数。
void enqueue(LinkQueuePtr paraQueuePtr,int paraElement)
{
//第一步,创建一个新的空间。
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
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("这个队列是空的!\r\n");
return -1;//返回-1表示报错。
}
//改变队列。
tempNodePtr = paraQueuePtr->front->next;
resultvalue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if(paraQueuePtr->rear==tempNodePtr)
{
paraQueuePtr->rear = paraQueuePtr->front;
}
//释放空间。
free(tempNodePtr);
tempNodePtr = NULL;
//返回出来。
return resultvalue;
}
5、测试函数
//测试函数
void testLinkQueue()
{
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
enqueue(tempQueuePtr,10);
enqueue(tempQueuePtr,30);
enqueue(tempQueuePtr,50);
outputLinkQueue(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));
enqueue(tempQueuePtr,8);
outputLinkQueue(tempQueuePtr);
}
int main()
{
testLinkQueue();
return 1;
}
6、运行结果如下:
7、循环队列的实现
#include<stdio.h>
#include<malloc.h>
#define TOTAL_SPACE 5
//定义循环队列的队首和队尾。
typedef struct CircleIntQueue
{
int data[TOTAL_SPACE];
int head;
int tail;
} *CircleIntQueuePtr;
//输出链表队列
void outputLinkQueue(CircleIntQueuePtr paraPtr)
{
int i;
if(paraPtr->head==paraPtr->tail)
{
printf("空代码!");
return ;
}
printf("Element in the queue:");
for(i = paraPtr->head;i<paraPtr->tail;i++)
{
printf("%d,",paraPtr->data[i % TOTAL_SPACE]);
}
printf("\r\n");
}
//初始化一个队列
CircleIntQueuePtr initQueue()
{
//申请空间。
CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
resultPtr->head = 0;
resultPtr->tail = 0;//初始化都为0.
return resultPtr;
}
//入队函数的设计。
void enqueue(CircleIntQueuePtr paraPtr, int paravalue)
{
//首先进行一次判断队列是否以及占满。
if((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head)
{
printf("队列已经满了!");
return ;
}
paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paravalue;
paraPtr->tail++;
}
//出队函数的设计
int dequeue(CircleIntQueuePtr paraPtr)
{
int resultvalue;
if(paraPtr->head == paraPtr->tail)
{
printf("已经没有元素在里面了!\r\n");
return -1;
}
resultvalue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
paraPtr->head++;
return resultvalue;
}
//测试函数
void test()
{
int i = 10;
CircleIntQueuePtr tempPtr = initQueue();
for(;i<16;i++)
{
enqueue(tempPtr,i);
}
outputLinkQueue(tempPtr);
for(i = 0;i<6;i++)
{
printf("dequeue gets %d\r\n",dequeue(tempPtr));
}
enqueue(tempPtr,8);
outputLinkQueue(tempPtr);
}
int main()
{
test();
return 1;
}
8、运行结果如下: