鏈式隊列有帶頭結點,和不帶頭結點的,我這裏是帶頭結點的。
邏輯結構如圖
編譯環境vc6.0,代碼如下:
/*
首元結點是指鏈表中存儲線性表中第一個數據元素的結點。
初始化:隊頭指針和隊尾指針都指向頭結點(不是首元結點)
隊滿狀態:只要還有內存,理論上不會滿
進隊操作:插入到鏈尾,尾指針指向新的尾結點
出頭操作:刪除首元結點(不是頭結點),頭指針指向新首元結點
*/
#include <stdio.h>
#include <stdlib.h>
//結點結構
typedef struct QNode
{
int data;
struct QNode* next;
}QNode,*Queueptr;
//鏈表結構
typedef struct
{
Queueptr front, rear; //對頭,隊尾指針
}LinkQueue;
//************************初始化**************************
int InitLinkQueue(LinkQueue* Q)
{
Q->front = Q->rear = (QNode*)malloc(sizeof(QNode)); //建立頭結點
if (!Q->rear || !Q->front)
{
return 0;
printf("動態分配內存失敗\n");
}
Q->front->next = NULL; //初始化爲空
return 1;
}
//************************判斷是否非空**************************
int IsEmpty(LinkQueue Q)
{
if (Q.front == Q.rear) //頭尾指針同時指向頭結點爲空
return 1;
else return 0;
}
//************************入隊**************************
int EnQueue(LinkQueue* Q, int e)
{
Queueptr s = (Queueptr)malloc(sizeof(QNode)); //動態申請內存
if (s == NULL)
return 0;
s->data = e;
s->next = NULL; //s插入到鏈尾巴,所有next指針指向空
Q->rear->next = s; //插入
Q->rear = s; //尾指針指向新的尾結點
return 1;
}
//************************出隊**************************
int DeQueue(LinkQueue* Q, int* e)
{
Queueptr p;
if (Q->front == Q->rear) //隊空
return 0;
p = Q->front->next; //將欲刪除的結點暫存給p
*e = p->data; //獲取元素值
Q->front->next = p->next; //刪除Q->front->next, Q->front時頭結點,Q->front->next 時首元結點
if (Q->rear == p) //若刪除後只剩下頭結點,將尾指針指向頭結點
Q->rear = Q->front;
free(p);
return 1;
}
//************************遍歷輸出**************************
int LinkQueueTraverse(LinkQueue Q)
{
Queueptr p; //結點指針
if (IsEmpty(Q))
{
printf("鏈表爲空\n");
return 0;
}
p = Q.front->next; //p指向首元結點
while (p)
{
printf("%-5d", p->data);
p = p->next;
}
return 1;
}
int main()
{
int i, e, n; //e入隊元素,n入隊元素個數
LinkQueue Q;
InitLinkQueue(&Q); //初始化
printf("初始化成功\n");
printf("請輸入,入隊元素個數\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("請輸入第%d個元素值", i + 1);
scanf("%d", &e);
if (EnQueue(&Q, e))
printf("入隊成功\n");
else printf("入隊失敗\n");
}
if (DeQueue(&Q, &e))
printf("\n元素%d出隊\n", e);
else printf("出隊失敗\n");
printf("遍歷輸出\n");
LinkQueueTraverse(Q);
return 0;
}
測試案例: