队列(Queue)简称为“队”,是一种受限的线性表。只允许在线性表的一端进行插入,在另一端进行删除;
称插入数据的一端为队尾(rear),称删除数据的一端为队首(front);向队尾添加数据称为入队,新入队的元素称为队尾元素;在队列中删除元素称为出队,元素出队后它的后续元素称为新的队首元素
队列的链式存储实现:
链队的实现和链表很相似,只是操作受限了而已
代码:
#define ElemType int #include <stdio.h> #include <stdlib.h> typedef struct Node{ ElemType data; struct Node *next; }Node; typedef struct Queue{ //链队结构体 struct Node *head; //队头 struct Node *tail; //队尾 int size; //队长 }Queue; // InitQueue(&Q): 初始化队列 void InitQueue(Queue* q){//初始化链队 q->head = NULL; q->tail = NULL; q->size = 0; } // DestroyQueue(&Q): 销毁队列 void DestroyQueue(Queue* q){ //空指针或空队,什么也不做退出 if(q==NULL || q->size==0){ return; } //临时指针 Node* t = NULL; while(q->head->next != NULL){ t = q->head; q->head = q->head->next; free(t); } free(q->head); q->head = NULL; q->tail =NULL; q->size = 0; } // IsEmpty(Q): 队列判空 int ListEmpty(Queue q){ return q.size == 0; } // GetSize(Q): 返回队列长度 int GetSize(Queue q){ return q.size; } // GetHead(Q): 查看队头 ElemType GetHead(Queue q){ if(q.size == 0){ exit(1); } return q.head->data; } // GetTail(Q): 查看队尾 ElemType GetTail(Queue q){ if(q.size == 0){ exit(1); } return q.tail->data; } // EnQueue(&Q,e): 入队 void EnQueue(Queue* q, ElemType e){ Node* newNode = (Node*) malloc(sizeof(Node)); newNode->data = e; newNode->next = NULL; if(q->size == 0){ q->head = q->tail = newNode; }else{ q->tail->next = newNode; q->tail = newNode; } q->size ++; } // DeQueue(&Q,&e): 出队 ElemType DeQueue(Queue* q){ if(q->size == 0){ exit(1); } ElemType ret = q->head->data; Node* t = q->head; q->head = q->head->next; free(t); q->size --; if(q->size == 0){ q->tail = NULL; } return ret; } Node* GetPriorNode(Queue* q, int i){//获取队列的第i-1个节点,没有返回NULL if(q->size < i || i <= 1){ return NULL; }else if(i == 2){ return q->head; } Node* p = q->head; int j; for(j=3; j<=i; j++){ p = p->next; } return p; } //获取e在队中第一次出现的位置,没有返回0 int LocateElem(Queue q, ElemType e){ int i = 0; Node* t = q.head; while(t != NULL){ i++; if (t->data == e) { return i; }else{ t = t->next; } } i=0; return i; } // Traverse(Q): 遍历队列 void Traverse(Queue q){//遍历链队 printf("\n"); Node* t = q.head; while(t != NULL){ printf("%d\t", t->data); t = t->next; } printf("\n"); } //==测试程序================================================================================== int main(int argc, char const *argv[]) { Queue q; InitQueue(&q); Traverse(q); EnQueue(&q, 2); EnQueue(&q, 12); printf("出队:%d\n", DeQueue(&q)); EnQueue(&q, 22); EnQueue(&q, 32); printf("54·index:%d\n", LocateElem(q, 54));; printf("32·index:%d\n", LocateElem(q, 32));; printf("head:%d\n", GetHead(q)); printf("tail:%d\n", GetTail(q)); DeQueue(&q); Traverse(q); DeQueue(&q); DeQueue(&q); printf("是否为空:%d\n", ListEmpty(q)); DestroyQueue(&q); Traverse(q); return 0; }
运行: