亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

優先隊列(priority_queue)的C語言實現代碼

2020-01-26 15:46:14
字體:
來源:轉載
供稿:網友

優先隊列(priority_queue)和一般隊列(queue)的函數接口一致,不同的是,優先隊列每次出列的是整個隊列中最?。ɑ蛘咦畲螅┑脑?。

本文簡要介紹一種基于數組二叉堆實現的優先隊列,定義的數據結構和實現的函數接口說明如下:

一、鍵值對結構體:KeyValue

復制代碼 代碼如下:

// =============KeyValue Struct==================================
typedef struct key_value_struct KeyValue;
struct key_value_struct
{
 int _key;
 void *_value;
};
KeyValue *key_value_new(int key, void *value);
void key_value_free(KeyValue *kv, void (*freevalue)(void *));

鍵值對作為優先隊列的中數據的保存形式,其中key用于保存優先級,_value用于指向實際的數據。

key_value_new用于創建一個KeyValue結構體;key_value_free用于釋放一個KeyValue結構體的內存,

參數freevalue用于釋放數據指針_value指向的內存。

二、優先隊列結構體:PriorityQueue

復制代碼 代碼如下:

// =============PriorityQueue Struct==============================
#define PRIORITY_MAX 1
#define PRIORITY_MIN 2
typedef struct priority_queue_struct PriorityQueue;
struct priority_queue_struct
{
 KeyValue **_nodes;
 int _size;
 int _capacity;

 int _priority;
};
PriorityQueue *priority_queue_new(int priority);
void priority_queue_free(PriorityQueue *pq, void (*freevalue)(void *));
const KeyValue *priority_queue_top(PriorityQueue *pq);
KeyValue *priority_queue_dequeue(PriorityQueue *pq);
void priority_queue_enqueue(PriorityQueue *pq, KeyValue *kv);
int priority_queue_size(PriorityQueue *pq);
int priority_queue_empty(PriorityQueue *pq);
void priority_queue_print(PriorityQueue *pq);


1)  其中nodes字段是二叉堆數組,_capacity是nodes指向的KeyValue*指針的個數,_size是nodes中實際存儲的元素個數。

     _priority可以是PRIORITY_MAX或PRIORITY_MIN,分別表示最大元素優先和最小元素優先。

2)  priority_queue_new和priority_queue_free分別用于創建和釋放優先隊列。

3)  priority_queue_top用于取得隊列頭部元素,

4)priority_queue_dequeue用于取得隊列頭部元素并將元素出列。

其實現的基本思路,以最大優先隊列說明如下:

①將隊列首部nodes[0]保存作為返回值

②將隊列尾部nodes[_size-1]置于nodes[0]位置,并令_size=_size-1

③令當前父節點parent(nodes[i])等于新的隊列首部(i=0)元素,

parent指向元素的兒子節點為left = nodes[2 * i + 1]和rigth = nodes[2 * i + 2],

比較left和right得到優先級高的兒子節點,設為nodes[j](j = 2 *i + 1或2 *i + 2),

④如果當前父節點parent的優先級高于nodes[j],交換nodes[i]和nodes[j],并更新當前父節點,

即令i=j,并循環 ③;

如果當前父節點的優先級低于nodes[j],處理結束。

5)priority_queue_enqueue用于將KeyValue入列

其實現的基本思路,以最大優先隊列說明如下:

①設置nodes[_size] 為新的KeyValue,并令_size++

②令當前兒子節點child(nodes[i])為新的隊列尾部節點(i=_size-1),child的父節點parent為nodes[j],

      其中j=  (i - 1) / 2

③如果當前兒子節點child的優先級高于parent, 交換nodes[i]和nodes[j],并更新當前兒子節點

      即令i = j,并循環③;

 如果當前兒子節點的優先級低于parent,處理結束。

6)  priority_queue_size用于取得隊列中元素個數,priority_queue_empty用于判斷隊列是否為空。

7)priority_queue_print用于輸出隊列中的內容。

文件pq.h給出了數據結構和函數的聲明,文件pq.c給出了具體實現,main.c文件用于測試。雖然是使用過程化編程的C語言,可以看到具體的編碼中應用了基于對象的思想,我們對數據結構和相關函數做了一定程度的聚集和封裝。

復制代碼 代碼如下:

/*
*File: pq.h
*purpose: declaration of priority queue in C
*/
#ifndef _PRIORITY_QUEUE_H
#define _PRIORITY_QUEUE_H

// =============KeyValue Struct==================================
typedef struct key_value_struct KeyValue;
struct key_value_struct
{
      int _key;
      void *_value;
};
KeyValue *key_value_new(int key, void *value);
void key_value_free(KeyValue *kv, void (*freevalue)(void *));

// =============PriorityQueue Struct==============================
#define PRIORITY_MAX 1
#define PRIORITY_MIN 2
typedef struct priority_queue_struct PriorityQueue;
struct priority_queue_struct
{
      KeyValue **_nodes;
      int _size;
      int _capacity;

      int _priority;
};
PriorityQueue *priority_queue_new(int priority);
void priority_queue_free(PriorityQueue *pq, void (*freevalue)(void *));
const KeyValue *priority_queue_top(PriorityQueue *pq);
KeyValue *priority_queue_dequeue(PriorityQueue *pq);
void priority_queue_enqueue(PriorityQueue *pq, KeyValue *kv);
int priority_queue_size(PriorityQueue *pq);
int priority_queue_empty(PriorityQueue *pq);
void priority_queue_print(PriorityQueue *pq);

#endif

/*
*File:pq.c
*purpose: definition of priority queue in C
*Author:puresky
*Date:2011/04/27
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pq.h"

//Private Functions
static void priority_queue_realloc(PriorityQueue *pq);

static void priority_queue_adjust_head(PriorityQueue *pq);

static void priority_queue_adjust_tail(PriorityQueue *pq);

static int priority_queue_compare(PriorityQueue *pq,
    int pos1,
    int pos2);
static void priority_queue_swap(KeyValue **nodes,
  int pos1,
  int pos2);

//Functions of KeyValue Struct
KeyValue *key_value_new(int key,
             void *value)
{
      KeyValue *pkv = (KeyValue *)malloc(sizeof(KeyValue));
      pkv->_key = key;
      pkv->_value = value;
      return pkv;
}
void key_value_free(KeyValue *kv,
       void (*freevalue)(void *))
{
      if(kv)
      {
            if(freevalue)
            {
                  freevalue(kv->_value);
            }
            free(kv);
      }
}


//Functions of PriorityQueue Struct
PriorityQueue *priority_queue_new(int priority)
{
      PriorityQueue *pq = (PriorityQueue *)malloc(sizeof(PriorityQueue));
      pq->_capacity = 11; //default initial value
      pq->_size = 0;
      pq->_priority = priority;

      pq->_nodes = (KeyValue **)malloc(sizeof(KeyValue *) * pq->_capacity);
      return pq;
}

void priority_queue_free(PriorityQueue *pq,
              void (*freevalue)(void *))
{
      int i;
      if(pq)
      {
            for(i = 0; i < pq->_size; ++i)
                  key_value_free(pq->_nodes[i], freevalue);
            free(pq->_nodes);
            free(pq);
      }
}

const KeyValue *priority_queue_top(PriorityQueue *pq)
{
      if(pq->_size > 0)
            return pq->_nodes[0];
      return NULL;
}

KeyValue *priority_queue_dequeue(PriorityQueue *pq)
{
      KeyValue *pkv = NULL;
      if(pq->_size > 0)
      {
            pkv = pq->_nodes[0];
            priority_queue_adjust_head(pq);
      }
      return pkv;
}

void priority_queue_enqueue(PriorityQueue *pq,
                   KeyValue *kv)
{
      printf("add key:%d/n", kv->_key);
      pq->_nodes[pq->_size] = kv;
      priority_queue_adjust_tail(pq);
      if(pq->_size >= pq->_capacity)
            priority_queue_realloc(pq);
}

int priority_queue_size(PriorityQueue *pq)
{
      return pq->_size;
}

int priority_queue_empty(PriorityQueue *pq)
{
      return pq->_size <= 0;
}

void priority_queue_print(PriorityQueue *pq)
{
      int i;
      KeyValue *kv;
      printf("data in the pq->_nodes/n");
      for(i = 0; i < pq->_size; ++i)
            printf("%d ", pq->_nodes[i]->_key);
      printf("/n");

      printf("dequeue all data/n");
      while(!priority_queue_empty(pq))
      {
            kv = priority_queue_dequeue(pq);
            printf("%d ", kv->_key);
      }
      printf("/n");
}

static void priority_queue_realloc(PriorityQueue *pq)
{
      pq->_capacity = pq->_capacity * 2;
      pq->_nodes = realloc(pq->_nodes, sizeof(KeyValue *) * pq->_capacity);
}

static void priority_queue_adjust_head(PriorityQueue *pq)
{
      int i, j, parent, left, right;

      i = 0, j = 0;
      parent = left = right = 0;
      priority_queue_swap(pq->_nodes, 0, pq->_size - 1);
      pq->_size--;
      while(i < (pq->_size - 1) / 2)
      {
            parent = i;

            left = i * 2 + 1;
            right = left + 1;
            j = left;
            if(priority_queue_compare(pq, left, right) > 0)
                  j++;
            if(priority_queue_compare(pq, parent, j) > 0)
            {
                  priority_queue_swap(pq->_nodes, i, j);
                  i = j;
            }
            else
                  break;

      }

}

static void priority_queue_adjust_tail(PriorityQueue *pq)
{
      int i, parent, child;

      i = pq->_size - 1;
      pq->_size++;
      while(i > 0)
      {
            child = i;
            parent = (child - 1) / 2;

            if(priority_queue_compare(pq, parent, child) > 0)
            {
                  priority_queue_swap(pq->_nodes, child, parent);
                  i = parent;
            }
            else
                  break;

      }
}


static int priority_queue_compare(PriorityQueue *pq,
    int pos1,
    int pos2)
{
      int adjust = -1;
      int r = pq->_nodes[pos1]->_key - pq->_nodes[pos2]->_key;
      if(pq->_priority == PRIORITY_MAX)
            r *= adjust;
      return r;
}

static void priority_queue_swap(KeyValue **nodes,
  int pos1,
  int pos2)
{
      KeyValue *temp = nodes[pos1];
      nodes[pos1] = nodes[pos2];
      nodes[pos2] = temp;
}

/*
*File: main.c
*purpose: tesing priority queue in C
*Author:puresky
*Date:2011/04/27
*/

#include <stdio.h>
#include <stdlib.h>
#include "pq.h"

int main(int argc, char **argv)
{
      int i;
      PriorityQueue *pq = priority_queue_new(PRIORITY_MAX);

     
      int a[]={1, 9, 7, 8, 5, 4, 3, 2, 1, 100, 50, 17};

      for(i = 0; i < sizeof(a)/ sizeof(int); ++i)
      {
            KeyValue *kv = key_value_new(a[i], NULL);
            priority_queue_enqueue(pq, kv);
      }

      priority_queue_print(pq);
      priority_queue_free(pq, NULL);

      system("pause");
      return 0;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最新日韩中文字幕| 一区二区三区无码高清视频| 91精品久久久久久久久久入口| 欧美激情18p| 亚洲第一区第二区| 在线免费观看羞羞视频一区二区| 国产欧美日韩精品在线观看| 久久久久免费视频| 日韩成人激情视频| 精品亚洲一区二区三区在线播放| 91高清在线免费观看| 欧美疯狂xxxx大交乱88av| 亚洲精品久久久久久下一站| 国产精品一区二区久久久久| 国产综合视频在线观看| www.日韩系列| 一区二区亚洲精品国产| 久久99亚洲精品| 欧美激情在线狂野欧美精品| www.xxxx欧美| 欧美日韩综合视频| 欧美日韩日本国产| 91色精品视频在线| 日产精品99久久久久久| 亚洲在线视频福利| 欧美性精品220| 精品香蕉一区二区三区| 欧美性xxxxx极品| 九九热精品在线| 日韩在线观看网址| 日韩最新免费不卡| 欧美日韩中文字幕综合视频| 丁香五六月婷婷久久激情| 91精品在线国产| 成人在线中文字幕| 国产一区二区三区毛片| 欧美激情一级精品国产| 隔壁老王国产在线精品| 欧美视频在线免费看| 欧美日韩国产一区二区三区| 欧美不卡视频一区发布| 91高清视频在线免费观看| 亚洲人成电影在线播放| 日本不卡高字幕在线2019| 亚洲精品中文字幕女同| 国产做受高潮69| 久久久久久成人精品| 日韩av免费网站| 亚洲18私人小影院| 清纯唯美亚洲综合| 亚洲三级黄色在线观看| 亚洲欧洲在线免费| 国产精选久久久久久| 久久99热这里只有精品国产| 亚洲视频自拍偷拍| 欧美在线视频观看免费网站| 精品视频在线观看日韩| 8090理伦午夜在线电影| 中文字幕精品在线视频| 日韩欧美成人网| 中文字幕久精品免费视频| 亚洲xxx自由成熟| 欧美亚洲国产日本| 91在线中文字幕| 日韩av影视综合网| 亚洲美女www午夜| 久久久久久久影视| 欧美视频在线观看 亚洲欧| 国产午夜精品久久久| 久久久久久69| 国模精品一区二区三区色天香| 日韩欧美aaa| 国产精品老女人精品视频| 亚洲国产女人aaa毛片在线| 国产一区二区美女视频| 欧美高清激情视频| 亚洲成人中文字幕| 亚洲精品第一国产综合精品| 91在线播放国产| xxx欧美精品| 成人性教育视频在线观看| 亚洲成人av片在线观看| 欧美亚州一区二区三区| 久久久日本电影| 亚洲欧美在线一区二区| 色先锋久久影院av| 久久久精品久久久久| 国产91网红主播在线观看| 久久视频精品在线| 爱福利视频一区| 琪琪第一精品导航| 久久久久亚洲精品| 伊人青青综合网站| 91日韩在线播放| 亚洲欧美日韩一区二区三区在线| 精品久久久999| 国产精品视频一区二区高潮| 久久国产精品影视| 国产精品视频一区二区高潮| 亚洲国产精品久久91精品| 午夜精品美女自拍福到在线| 亚洲天堂av高清| 日韩精品免费视频| 91色中文字幕| 26uuu另类亚洲欧美日本老年| 精品亚洲va在线va天堂资源站| 最新91在线视频| 欧美视频在线观看免费| 亚洲一区二区三区在线视频| 精品视频在线播放色网色视频| 久久精品国产欧美激情| 亚洲一区免费网站| 精品国内亚洲在观看18黄| 国产精品91久久久久久| 久久天堂电影网| 亚洲女人天堂视频| 久久免费在线观看| 国产精品96久久久久久又黄又硬| 日韩免费av在线| 国产精品精品视频| 性欧美暴力猛交69hd| 久久69精品久久久久久国产越南| 97久久精品国产| 一本色道久久88综合亚洲精品ⅰ| 日韩一级黄色av| 69影院欧美专区视频| 国产精品白丝av嫩草影院| 中文字幕日韩av综合精品| 成人乱色短篇合集| 亚洲久久久久久久久久久| 欧美电影第一页| 国产成人中文字幕| 欧美激情一区二区三区久久久| 国产精品第七影院| 伊人久久精品视频| 国产精品91久久| 日韩av三级在线观看| 国产精品欧美风情| 一区二区三区无码高清视频| 色偷偷噜噜噜亚洲男人| 国产精品精品国产| 91久久在线播放| 日韩av免费在线播放| 中文字幕不卡在线视频极品| 国产香蕉精品视频一区二区三区| 国产成人精品免高潮在线观看| 欧美高清视频免费观看| 国产精品久久久久久亚洲影视| 欧美大全免费观看电视剧大泉洋| 国产精品电影网| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲的天堂在线中文字幕| 91在线免费网站| 欧美一区二区三区艳史| 久久av在线看| 亚洲男人天堂古典| 亚洲欧美另类在线观看| 欧美午夜久久久| 亚洲视频免费一区| 正在播放欧美视频| 91tv亚洲精品香蕉国产一区7ujn| 中文一区二区视频| 羞羞色国产精品| 亚洲福利在线视频|