队列的定义
队列是一种先进先出的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是(1,2,……,n),那么 1 就是队头元素,而 n 就是队尾元素。删除时,是从 1 开始的,插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后面。
队列的链式存储
队列的链式存储结构,其实就类似线性表中单链表的尾插法,我们把它简称为链队列。为操作方便,我们将队头指针指向链队列的头结点,尾队列指针指向终端结点。
链队的创建
typedef struct Node //定义一个链式队列结点结构体
{
int date; //结点数据
struct Node *next; //结点指针
}*node; //结点名
typedef struct Queue //定义队列结构体
{
node front; //头指针
node rear; //尾指针
}que; //队列名
链队的初始化
void InitQueue(que &S) //初始化队列
{
S.front = S.rear = (node)malloc(sizeof(struct Node));
}
入队
void enQueue(que *S)
{
int i,m,n;
printf("请输入你想要入队数据的个数");
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&n);
node s = (node)malloc(sizeof(struct Node)); //新建一个结点
s -> date = n; //将数据赋值给date
s -> next = NULL; //让结点指向空
S->rear->next = s; //连接新建结点
S->rear = s; //让r指向下新建结点
}
S->rear->next = NULL; //入队完成后让其最后一个结点指向空
}
入队时,其实就是在链表尾部插入结点,如图所示:
出队
void DeQueue(que *S)
{
node s; //新建一个结点指针
s = S->front->next; //让s指向头结点的下一个节点
if(s->date == NULL)
{
printf("空队列\n");
exit(0);
}
while(s)
{
printf("%d ",s->date);
s = s->next;
}
}
出队时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩下一个元素时,则需将rear指向头结点,如图所示:
主函数
int main()
{
que S; //定义结构体变量
InitQueue(S); //初始化队列
enQueue(&S); //入队
DeQueue(&S); //出队
printf("\n");
system("pause");
return 0;
}
输出结果