C语言可以实现队列的基本操作,比如设置一个带头结点的队列,并对其进行初始化、判空、出队和入队操作。
需要注意的是,栈和队列的逻辑结构相同,但队列会在队尾输入,队头删除数据元素。
/*链式队列结点*/
typedef struct LinkNode {
int data;
struct LinkNode* next;
}LinkNode;
/*链式队列*/
typedef struct {
LinkNode* front, * rear; //队列的队头和队尾指针
}LinkQueue;
/*初始化队列*/
void InitQueue(LinkQueue *Q) {
(*Q).front = (*Q).rear = (LinkNode *)malloc(sizeof(LinkNode));
(*Q).front->next = NULL;
}
/*判空*/
bool IsEmpty(LinkQueue Q) {
if (Q.front == Q.rear)
return true;
else
return false;
}
/*新元素入队*/
void EnQueue(LinkQueue* Q, int x) {
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q->rear->next = s; //新结点插入到rear之后
Q->rear = s; //修改表尾指针
}
/*队头元素出队*/
bool DeQueue(LinkQueue* Q, int* x) {
if (Q->front == Q->rear)
return false; //空队
LinkNode* p = (*Q).front->next;
(*x) = p->data; //用变量x返回队头元素
(*Q).front->next = p->next; //修改头结点的next指针
if (Q->rear == p) //此次是最后一个结点出队
Q->rear = Q->front; //修改rear指针
free(p);
return true;
}
void main() {
LinkQueue Q;
InitQueue(&Q);
if(IsEmpty(Q)){
EnQueue(&Q, 11);
EnQueue(&Q, 12);
EnQueue(&Q, 13);
}
int x = 0;
DeQueue(& Q, &x);
}