C语言 链表、数组实现队列


C语言 分别用链表、数组两种方式实现队列存储结构

用链表实现队列

// 队列是先进先出的一种数据存储结构,本例中实现了入队出队便利及清空。

#include 
#include 
#define NULL 0
typedef struct node
{
int data;
struct node *next;
}NODE;
typedef struct queue
{
NODE *front;
NODE *		rear;
}QUEUE;
void push(QUEUE *,int);
void print(QUEUE *q);
void pop(QUEUE *);
void clear(QUEUE *q);
int main(void)
{
QUEUE *q = (QUEUE *)malloc(sizeof(QUEUE));
int i = 0;
q->front = q->rear = (NODE *)malloc(sizeof(NODE));
for(i=0;i<=10;i++)
push(q,i);
print(q);
pop(q);
print(q);
pop(q);
print(q);
clear(q);
free(q);
return 0;
}
void push(QUEUE *q,int data)
{
NODE *pNode = (NODE *)malloc(sizeof(NODE));
pNode->data = data;
pNode->next = NULL;
q->rear->next = pNode;
q->rear = pNode;
}
void print(QUEUE *q)
{
NODE *p = q->front;
if(q->front->next == NULL)
return ;
p = p->next;
while(p->next!=NULL)
{
p = p->next;
printf("%d\n",p->data);
}
}
void pop(QUEUE *q)
{
if(q->front!=q->rear)
{
NODE *p = q->front;
q->front = p->next;
free(p);
}
}
void clear(QUEUE *q)
{
NODE *p;
while(q->front!=q->rear)
{
p = q->front;
q->front = p->next;
free(p);
}
}

用数组实现循环队列

/*
由于在定义数组时要定义数组的长度,因此数组实现的队列的长度是固定的,
如果入队时rear加1,出队时front加1,那么front前面的元素就不能再次使用了,
所以rear和front加到队尾时,在加1的时候就应该把rear和front移到队头,也就是循环队列,所以数组实现的队列必须是循环队列。
本例中实现了循环队列的入队便利和出队。
*/

#include 
#define SIZE 10
typedef struct queue
{
int array[SIZE];
int front;
int rear;
}QUEUE;
void push(QUEUE *,int);
void pop(QUEUE *);
void print(QUEUE *);
int main(void)
{
QUEUE q;
int i = 0;
q.front = q.rear = 0;
for(i=0;i<=SIZE-2;i++)
push(&q,i);
print(&q);
pop(&q);
print(&q);
pop(&q);
print(&q);
return 0;
}
void push(QUEUE *p,int data)
{
if(!((p->rear+1)%SIZE == p->front))
{
p->array [p->rear] = data;
p->rear = (p->rear+1)%SIZE;
}
}
void print(QUEUE *p)
{
QUEUE q = *p;
while(q.front%SIZE != q.rear)
{
printf("%d\n",q.array [q.front]);
q.front = (q.front+1)%SIZE;
}
}
void pop(QUEUE *p)
{
if(!(p->front == p->rear))
p->front = (p->front+1)%SIZE;
}