队列的储存还可以用一个单链表来实现。链表最后一个元素不可当作front,因为单链表无法找到前一个元素,因此无法方便进行删除(出队)操作。
由以上分析,front指向链表的第一个元素,rear指向链表最后一个元素。
注:在以下函数中quene q;//为全局变量
基本结构
struct Node//队列中每一个元素的基本结构
{
ElementType Data;
struct Node *next;
};
struct Qnode{//链队列结构
struct Node *rear;//指向队尾结点
struct Node *front;//指向队首结点
int size;
};
typedef struct Qnode *quene;
1.出队
ElementType deleteQ(quene q)
{
int data;
if(q->front==NULL)//size=0
{
printf("队列空\n");
return ERROR;
}
else
{
struct Node *temp;
temp=q->front;
if(q->front==q->rear)//队列只有一个元素
{
q->front=NULL;
q->rear=NULL;
}
else
{
q->front=q->front->next;
}
data=temp->Data;
free(temp);
q->size--;
return data;//返回出队的元素值
}
}
2.入队
void addQ(quene q,int X)
{
struct Node *idx;
idx=(struct Node*)malloc(sizeof(struct Node));
idx->Data=X;
if(q->front==NULL)//队列此时为空
{
q->front=idx;
q->rear=idx;
}
else
{
q->rear->next=idx;
q->rear=idx;
}
idx->next=NULL;
q->size++;
}