优先队列的链表实现
来源:互联网 发布:软件开发环境 编辑:程序博客网 时间:2024/03/29 23:37
插入时需要按照优先级从高到低排序,一般操作系统的任务队列调度会用到 /* 优先队列(链表实现) * front 为队头指针(链表头节点) * rear 为队尾指针 */ #include<stdio.h> #include<stdlib.h> typedef struct list_t{ int _element; int _priority; struct list_t *_next; }list_t; /* 要改变一个变量的值,需要传入变量的地址作参数; * 要改变一个指针的值,需要传入该指针的地址作参数(即指针的指针); */ void insertPriorQueue(list_t **front, list_t **rear, int value, int priority) { list_t *prev; list_t *curr; curr = (list_t*)malloc(sizeof(list_t)); if(curr == NULL) { printf("error: malloc\n"); exit(0); } curr->_element = value; curr->_priority = priority; curr->_next = NULL; if(*rear == NULL) { //empty queue: we need make front = rear = NULL *rear = curr; *front = *rear; } else { /* if node to be inserted has highest priority hence should be the first node */ if((*front)->_priority < priority) { curr->_next = *front; *front = curr; } /* if node has the lowest priority hence should be inserted the last node */ else if ((*rear)->_priority > priority) { (*rear)->_next = curr; *rear = curr; } /* find the proper place to insert */ else { prev = *front; while((prev->_next)->_priority >= priority) prev = prev->_next; curr->_next = prev->_next; prev->_next = curr; } } } void delPriorQueue(list_t **front, list_t **rear, int *value) { list_t *temp; if((*front == *rear) && (*rear == NULL)) { printf("Queue underflow\n"); exit(0); } *value = (*front)->_element; temp = *front; *front = (*front)->_next; if(*rear == temp) *rear = (*rear)->_next; printf("%d(%d)\n", temp->_element, temp->_priority); free(temp); } void printPriorQueue(list_t *head) { while(head != NULL) { printf("%d", head->_element); printf("(%d) ", head->_priority); head = head->_next; } putchar('\n'); } void item() { printf("*************** Welcome to the Queue *************\n"); printf("1: Insert one element;\n"); printf("2: Delete one element;\n"); printf("0: Exit.\n"); printf("*************************************************\n"); printf("Select your operation: "); } main(void) { char item_choice; list_t *front = NULL; list_t *rear = NULL; int n, priority; item(); while(1) { item_choice = getchar(); switch (item_choice) { case '1': printf("Insert a element to the queue: "); scanf("%d %d", &n, &priority); insertPriorQueue(&front, &rear, n, priority); printf("\nQueue: "); printPriorQueue(front); putchar('\n'); item(); break; case '2': printf("Get an element from the queue: "); delPriorQueue(&front, &rear, &n); //printf("Element: %d\n", n); printf("Queue: "); printPriorQueue(front); putchar('\n'); item(); break; case '0': printf("Good luck to you!\n"); return 0; } } return; }
0 0
- 优先队列的链表实现
- 优先队列的实现
- 优先队列的实现
- 优先队列(链表实现)
- 无序链表实现优先队列
- 有序链表实现优先队列
- 优先队列的数组实现
- 优先队列的简单实现
- 优先队列的c++实现
- 索引优先队列的实现
- 优先队列的一种实现
- 索引优先队列的实现
- PriorityQueue 优先队列的实现
- 【算法设计-优先队列】优先队列的实现与操作
- 无序双向链表的优先队列
- 基于堆的优先队列的实现
- 利用数组和链表实现优先队列
- 堆和优先队列的实现
- 知识点一:序列
- java技术支持-图书馆
- aws 恢复mysql数据库数据
- Linux系统下如何查看及修改文件读写权限
- 静态页面制作(三)
- 优先队列的链表实现
- easyUI中class="easyui-combobox"默认选值
- Cannot fetch index base URL https://pypi.python.org/simple/
- POJ3693 Maximum repetition substring 后缀数组
- 几种常见的排序算法(C++)
- 大话设计模式(八)抽象工厂模式进化
- servlet学习总结(二)—图片下载和读取属性文件
- UIApplicationLaunchOptionsRemoteNotificationKey
- 用rem来做响应式开发