#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
const int max = 10;
typedef struct Node * ProToNode;/* ProToNode 相当与struct Node * */
struct Node{/* 队列中的结点 */
int num;
ProToNode next;
};
typedef ProToNode Position;/* Position 实际上和 ProToNode是同一种结构指针*/
struct QNode{/*该结构为队列的结构*/
Position front,rear;/*队列的头指针和尾指针,分别拥有它们的数值和指针域*/
int size;/*队列的数字的个数*/
};
typedef struct QNode * Queue;/* Queue 相当与struct QNode * */
/*创建一个队列*/
Queue Create()
{
Queue q = (Queue)malloc(sizeof(struct QNode));
q->front = NULL;
q->rear = NULL;
q->size = 0;
return q;
}
/*判断队列是否为空*/
bool isempty(Queue q)
{
return (q->size == 0);
}
/*判断队列是否为满*/
bool isfull(Queue q)
{
return (q->size == max);
}
/*入队*/
void add(Queue q,int number)
{
ProToNode rearcell = (ProToNode)malloc(sizeof(struct Node));/*获得一个新结点*/
rearcell->num = number;
rearcell->next = NULL;
if(isfull(q))
{
printf("队列满!");
}
else if(isempty(q))/*若队列为空,则新结点既为队首结点又为尾结点*/
{
q->front = q->rear = rearcell;
}
else/*若队列为非空,则改变队尾结点的指针域,并使队尾结点指向新的队尾结点*/
{
q->rear->next = rearcell;/*因为增加了一个结点,rearcell为新的队尾结点*/
q->rear = q->rear->next;/*指向新的队尾结点*/
}
q->size++;/*队列里的个数+1*/
}
/*出队*/
int del(Queue q)
{
ProToNode frontcell;
int cellnumber;
if(isempty(q))
{
printf("队列空!");
return 0;
}
else
{
frontcell = q->front;
if(q->front == q->rear)/*如果队列中只有一个元素,删除后队列置为空*/
{
q->front = q->rear =NULL;
}
else
{
q->front = q->front->next;/*指向下一个要删除的结点*/
}
cellnumber = frontcell->num;/*记录要出队的数*/
free(frontcell);/*释放被删除结点的空间*/
}
return cellnumber;
}
int main(void)
{
Queue q = Create();
int n,number;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
scanf("%d",&number);
add(q,number);
}
for(int i = 0; i < n; i++)
{
printf("%d\n",del(q));
}
return 0;
}
队列的链表实现
最新推荐文章于 2024-06-11 18:17:33 发布