链队列
即用链表表示的队列,为单链表的插入和删除操作的特殊情况,只是尚需修改尾指针或头指针。实际操作如图:
存储结构设置:
简化结构定义
typedef int QElemType;
首先队列需要两个分别指示队头和队尾的指针(即头指针与尾指针)来确定。
typedef struct {
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}linkQueue;
然后设置在队列中的具体结点
typedef struct QNode{
QElemType data; //存储元素
struct QNode *next; //结点指针域
}QNode,*QueuePtr;
完整代码如下:
#include#include #include #define OVERFLOW -2 #define OK 1 #define TRUE 1 #define ERROR 0 #define FALSE 0 typedef int Status; typedef int QElemType; typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front,rear; //队头队尾指针 }linkQueue; Status InitQueue(linkQueue *Q) { Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q->front) { exit(OVERFLOW); } Q->front->next=NULL; return OK; } Status DestroyQueue(linkQueue *Q) { while(Q->front) { Q->rear=Q->front->next; free(Q->front); Q->front=Q->rear; } return OK; } Status EnQueue(linkQueue *Q,QElemType e) { QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p) { exit(OVERFLOW); } p->data=e; p->next=NULL; Q->rear->next=p; Q->rear=p; return OK; } Status DeQueue(linkQueue *Q,QElemType *e) { QueuePtr p; if(Q->front==Q->rear) { return ERROR; } p=Q->front->next; *e=p->data; Q->front->next=p->next; if(Q->rear=p) //处理当队列中只有一个元素 { Q->rear=Q->front; } free(p); return OK; } Status QueuePrint(linkQueue Q) { QueuePtr p; p=Q.front->next; while(p) { printf("%2d",p->data); p=p->next; } printf("n"); return OK; } int main() { int i,n; QElemType e; linkQueue q; InitQueue(&q); printf("请输入队列数据元素的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("请输入要入队数据元素的值:"); scanf("%d",&e); EnQueue(&q,e); } QueuePrint(q); DeQueue(&q,&e); printf("删除了队头元素%dn",e); QueuePrint(q); DestroyQueue(&q); printf("销毁队列后:q.front=%u q.rear=%un",q.front,q.rear); //%u为无符号十进制转义字符 }



