栈与队列:链队列算法+可执行代码
1.队列是只允许在一端进行插入 在另一端进行删除的线性表 2.队列先进先出 //队列的链式存储结构(插进去 吐出来) typedef struct QNode { ElemType data; struct QNode *next; }QNode, *QueuePrt; typedef struct { QueuePrt front,rear;//队头,尾指针 }LinkQuene; initQueue(LinkQueue *q) //初始化 { q->front = q->rear = (QuenuePtr)malloc(sizeof(QNode)); if(!q->front) exit(0); q->front->next = NULL; } InsertQueue(LinkQueue *q, ElemType e) //插入 { QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if(p == NULL); exit(0); p->data = e; p->next = NULL; q->rear->next = p; q->rear = p; //指向把新插入的结点 } DeleteQuenue(LinkQueue *q,ElemType *e) { QueuePtr p; if(q->front == q->rear) //如果是空队列 返回 return; p = q->front->next; //让p指向第一个结点 *e = p->data; //用指针获取 q->front->next = p->next; //头结点的指针指向第二个结点 if(q->rear == p) //只有一个元素 因为上面p已经指向第一个结点了 q->rear = q->front; free(p); } DestoryQueue(LinkQueue *q)//销毁队列 { while(q->front) { q->rear = q->front->next;//把尾指针指向第一个元素 free(q->front); q->front = q->rear; } } GetHead(LinkQueue q) //获取头元素 { if(q.front!=q.rear) return q.front->next->data; } //链队列可执行代码 #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR -1 typedef int QElemType; typedef int Status; typedef int SElemType; typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; //队头指针 QueuePtr rear; //队尾指针 }LinkQueue; Status InitQueue(LinkQueue *Q); //初始化队列 Status EnQueue(LinkQueue *Q, QElemType e); //入队列 Status DeQueue(LinkQueue *Q, QElemType *e); //出队列 SElemType GetHead(LinkQueue Q); //获取队列头元素 Status InitQueue(LinkQueue *Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); if(Q->front == NULL) { exit(0); } Q->front->next = NULL; return OK; } Status EnQueue(LinkQueue *Q, QElemType e) { QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if(p == NULL) { exit(0); } 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; //让p指向第一个结点 *e = p->data; Q->front->next = p->next; if(Q->rear == p) //如果只剩下最后一个元素 需要调整尾指针的值 Q->rear = Q->front; free(p); return OK; } SElemType GetHead(LinkQueue Q) { if(Q.front != Q.rear) return Q.front->next->data; } int main(void) { LinkQueue q; int e; int heade; InitQueue(&q); printf("请输入队列元素,用空格隔开,以0结束\n"); scanf("%d",&e); while(e != 0) { EnQueue(&q,e); scanf("%d",&e); } printf("链队列的队头元素是: "); heade = GetHead(q); printf("%d",heade); printf("\n"); while(q.front != q.rear) { DeQueue(&q,&e); printf("%d ",e); } return 0; }