重写队列

##序

以前写【初学队列】那篇文章的时候偷了点懒,没有写循环队列,之前那个代码也写的不太好,索性重写了一遍,这里把代码直接贴上来。

##节点定义

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct Qnode
{
int data;
struct Qnode *next;
}node;
typedef struct Queue
{
node *front;
node *rear;
int count;
}queue;

初始化

1
2
3
4
5
void InitQueue(queue *q)
{
q->front = q->rear = NULL;
q->count = 0;
}

入队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int Enqueue(queue *q,int num)
{
node *t;
if(q->count == maxsize)
return 0;
t = (node *)malloc(sizeof(node));
if(!q)
exit(10); //OVERFLOW
t->data = num;
t->next = NULL;
if(q->count == 0)
q->front = t;
else
q->rear->next = t;
q->rear = t;
q->count++;
return 1;
}

##创建队列

1
2
3
4
5
6
7
8
9
10
void create_queue(queue *q,int n)
{
int i,t;
for(i=0;i<n;i++)
{
scanf("%d",&t);
Enqueue(q,t);
}
return;
}

出队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//e用来返回删除元素的值
int Dequeue(queue *q,int *e)
{
node *t;
if(!q->count)
return -1;
*e = q->front->data;
t = q->front;
q->front = q->front->next;
free(t);
q->count--;
if(!q->count)
q->rear = NULL;
return 1;
}

##打印队列

1
2
3
4
5
6
7
8
9
10
11
12
void Print_queue(queue *q)
{
node *p = q->front;
int i;
for(i=0;i<q->count;i++)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return;
}

主函数

1
2
3
4
5
6
7
8
9
10
11
int main(void)
{
queue q;
int n,e;
InitQueue(&q);
scanf("%d",&n);
create_queue(&q,n);
Print_queue(&q);
Dequeue(&q,&e);
Print_queue(&q);
}