优先队列的链表实现
插入時需要按照優先級從高到低排序,一般操作系統的任務隊列調度會用到 /* 優先隊列(鏈表實現) * 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;
}
總結
- 上一篇: 无法嵌入互操作类型 请改用适用的接口_可
- 下一篇: 请解释和、|和||的区别?