完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
基于数组二叉堆实现的优先队,C语言实现(参考http://www.***51.net/article/41978.htm大神的代码)。在VC6.0上运行没问题,想移植到keil 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; unsigned int _value; }; KeyValue *key_value_new(int key, unsigned int 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); #endif /* *File:pq.c *purpose: definition of priority queue in C */ #include #include #include #include "pq.h" //Private Functions static void priority_queue_realloc(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,unsigned int value) { KeyValue *pkv = (KeyValue *)malloc(sizeof(KeyValue)); pkv->_key = key; pkv->_value = value; return pkv; } //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; } const KeyValue *priority_queue_top(PriorityQueue *pq) { if(pq->_size > 0) return pq->_nodes[0]; return NULL; } void priority_queue_enqueue(PriorityQueue *pq, KeyValue *kv) { 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; } 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_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; } |
|
相关推荐
4个回答
|
|
求帮助啊,弄了好久就是不行啊。
|
|
|
|
进入函数里面单步调试看看是什么问题。这个实在是爱莫能助。
|
|
|
|
看了很久我也没找到原因,只能是单步调试,跳进函数内部,观察一下那个变量是在什么时候自己改变的,最好能同时留意一下各个变量在内存中的地址。
|
|
|
|
谢谢各位的回复,现在只好换个算法实现功能。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
418 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1083 浏览 0 评论
846 浏览 0 评论
886 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
882 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11824 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 12:59 , Processed in 0.679888 second(s), Total 74, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号