优先队列的链表实现

来源:互联网 发布:软件开发环境 编辑:程序博客网 时间:2020/11/24 14:00
插入时需要按照优先级从高到低排序,一般操作系统的任务队列调度会用到  /* 优先队列(链表实现)  * 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