注意事项:
- 链队列需要设立一个结点结构体(指针域和数据域,与链表结点一样)和一个包含指向这个结构体的首和尾指针的结构体(因为需要一次传递两个参数,这个结构可以使得只需要传递一个参数)。但是先进先出=尾插头删
- 与c++程序不同的是,c语言没有形参的&运算符,可以将在函数中改变的数值返回到变量中,所以只能定义指向链队列指针结构的指针。
- bug:注意结点结构体的自定义类型,这里出现了一个一小时的bug,关于子函数定义指针空间,返回主函数指针变成野指针的BUG。-_-!
#include<stdio.h>
#include<stdlib.h>
typedef struct QNode
{
int data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct
{
QueuePtr front, rear;
}LinkQ, *LinkQueue;
LinkQueue Creat(LinkQueue p);
void EnQueue(LinkQueue q, int e);
void DeQueue(LinkQueue q, int *e);
void Traverse(LinkQueue q);
int main()
{
LinkQ p;
LinkQueue q = Creat(&p);
int e;
Traverse(q);
printf("After EnQueuing the queue is :\n");
EnQueue(q, -1);
EnQueue(q, -2);
EnQueue(q, -5);
Traverse(q);
printf("After DeQueuing the first number of queue is :\n");
DeQueue(q, &e);
Traverse(q);
}
LinkQueue Creat(LinkQueue p)
{
p->front = p->rear = (QueuePtr)malloc(sizeof(QNode));
if (!p->front)
exit(1);
p->front->next = NULL;
int i;
for (i = 0; i < 10; i++)
{
EnQueue(p, i);
}
return p;
}
void EnQueue(LinkQueue q, int e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (!p)
exit(1);
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
void DeQueue(LinkQueue q, int *e)
{
QueuePtr p = q->front->next;
(*e) = p->data;
q->front->next = p->next;
if (q->rear == p)
q->rear = q->front;
free(p);
}
void Traverse(LinkQueue q)
{
QueuePtr p = q->front->next;
while (p)
{
printf("%d->", p->data);
p = p->next;
}
printf("NULL\n");
}