单队列实现
队列的定义就不赘述了,直接上代码把。为了方便使用了无头的链表。插入方式为尾插法。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct node
{
int data;
struct node* next;
}List;
typedef struct
{
int rear;
int front;
List* list;
}Queue;
void Queue_init(Queue* Q)
{
Q->front = 0;
Q->rear = 0;
Q->list = NULL;
}
//很简单的尾插法,使用了无头的链表
void __Queue_enQ(Queue* Q, int num)
{
if (Q->list == NULL)
{
Q->front++;
Q->list = (List*)malloc(sizeof(List));
Q->list->next = NULL;
Q->list->data = num;
}
else
{
Queue* temp = Q;
List* p = temp->list;
temp->front++;
List* new_node = (List*)malloc(sizeof(List));
while (p->next != NULL)
{
p = p->next;
}
new_node->data = num;
new_node->next = NULL;
p->next = new_node;
}
}
int __Queue_DeQ(Queue* Q)
{
if (Q == NULL)
{
printf("Q is empty\n");
assert(0);
}
else if(Q->rear == Q->front)
{
printf("Q is empty\n");
assert(0);
}
else
{
Q->rear++;
int data = Q->list->data;
Q->list = Q->list->next;//将第一个节点指向下一个
return data;
}
}
void __Print_Q(Queue* Q)
{
if (Q == NULL)
{
printf("Q is empty\n");
assert(0);
}
else if (Q->rear == Q->front)
{
printf("Q is empty\n");
assert(0);
}
else
{
List* temp = Q->list;
while (temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
}
int main()
{
Queue* new_Q = (Queue*)malloc(sizeof(Queue));
Queue_init(new_Q);
for (int i = 0; i < 10; i++)
{
//new_Q->list = __Queue_enQ(new_Q, i);
__Queue_enQ(new_Q, i);
}
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("\n");
__Print_Q(new_Q);
}
循环队列
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct node
{
int data;
struct node* next;
}List;
typedef struct
{
int rear;
int front;
List* list;
}Queue;
void Queue_init(Queue* Q)
{
Q->front = 0;
Q->rear = 0;
Q->list = NULL;
}
//很简单的尾插法,使用了无头的链表
void __Queue_enQ(Queue* Q, int num)
{
if (Q->list == NULL)
{
Q->front++;
Q->list = (List*)malloc(sizeof(List));
Q->list->next = Q->list;
Q->list->data = num;
}
else
{
Queue* temp = Q;
List* p = temp->list;
temp->front++;
List* new_node = (List*)malloc(sizeof(List));
while (p->next != temp->list)
{
p = p->next;
}
new_node->data = num;
new_node->next = p->next;
p->next = new_node;
}
}
int __Queue_DeQ(Queue* Q)
{
if (Q == NULL)
{
printf("Q is empty\n");
assert(0);
}
else if (Q->rear == Q->front)
{
printf("Q is empty\n");
assert(0);
}
else
{
List* temp = Q->list;
while (temp->next != Q->list)
{
temp = temp->next;
}
Q->rear++;
int data = Q->list->data;
Q->list = Q->list->next;//将第一个节点指向下一个
temp->next = Q->list;
return data;
}
}
void __Print_Q(Queue* Q)
{
if (Q == NULL)
{
printf("Q is empty\n");
assert(0);
}
else if (Q->rear == Q->front)
{
printf("Q is empty\n");
assert(0);
}
else
{
List* temp = Q->list;
while(1)
{
printf("%d ", temp->data);
temp = temp->next;
if (temp == Q->list)
break;
}
printf("\n");
}
}
int main()
{
Queue* new_Q = (Queue*)malloc(sizeof(Queue));
Queue_init(new_Q);
for (int i = 0; i < 10; i++)
{
__Queue_enQ(new_Q, i);
}
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("%d ", __Queue_DeQ(new_Q));
printf("\n");
__Print_Q(new_Q);
}