队列的实现(链表)
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。
入队列: 进行插入操作的一端称为队尾。
出队列: 进行删除操作的一端称为队头。
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
#include#include #include typedef int QDataType; typedef struct QueueNode { QDataType data; struct QueueNode *next; }QueueList; void QueueInit(QueueList **head); void QueueDestory(QueueList *head); QueueList *QueuePush(QueueList *head, QDataType data); bool QueueEmpty(QueueList *head); void QueuePop(QueueList **head); QDataType QueueBack(QueueList *head); QDataType QueueFront(QueueList *head); size_t QueueSize(QueueList *head); void QueuePrint(QueueList *head); int main() { QueueList *head; QueueInit(&head); QueuePrint(head); for(int i = 0; i < 4; i++) { head = QueuePush(head, i); } QueuePrint(head); head = QueuePush(head, 89); printf("89入栈:n"); QueuePrint(head); printf("出栈:n"); QueuePop(&head); QueuePrint(head); printf("栈头数据:%dn", QueueFront(head)); printf("栈尾数据:%dn", QueueBack(head)); printf("栈大小:%dn", QueueSize(head)); return 0; } //队列初始化 void QueueInit(QueueList **head) { // *head = (QueueList *)malloc(sizeof(QueueList)); *head = NULL; } //队列的销毁 void QueueDestory(QueueList *head) { if(head == NULL) { return ; } QueueList *tmp = head; while(tmp) { QueueList *mmp = tmp->next; free(tmp); tmp = mmp; } } //进队列 QueueList *QueuePush(QueueList *head, QDataType data) { // assert(head); QueueList *newnode = (QueueList *)malloc(sizeof(QueueList)); if(newnode == NULL) { printf("开辟空间失败!"); exit(-1); } newnode->data = data; newnode->next = NULL; if(head == NULL) { head = newnode; } else { QueueList *tmp = head; while(tmp->next != NULL) { tmp = tmp->next; } tmp->next =newnode; } return head; } //出队列 void QueuePop(QueueList **head) { assert(*head); assert(!QueueEmpty(*head)); //head是否为空 QueueList *tmp = *head; (*head) = (*head)->next; free(tmp); } //队列是否为空 bool QueueEmpty(QueueList *head) { assert(head); return head == NULL; } //获取头数据 QDataType QueueFront(QueueList *head) { assert(head); assert(!QueueEmpty(head)); //head是否为空 return head->data; } //获取尾数据 QDataType QueueBack(QueueList *head) { assert(head); assert(!QueueEmpty(head)); //head是否为空 QueueList *tmp = head; while(tmp->next != NULL) { tmp = tmp->next; } return tmp->data; } //获取队列的长度 size_t QueueSize(QueueList *head) { assert(head); assert(!QueueEmpty(head)); //head是否为空 QueueList *tmp = head; size_t cnt = 0; while(tmp != NULL) { cnt++; tmp = tmp->next; } return cnt; } //队列的打印 void QueuePrint(QueueList *head) { for(QueueList *p = head; p != NULL; p = p->next) { printf("%d %#X n", p->data, p); } }



