| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 414 人关注过本帖
标题:优先队列怎么弄?这样行吗?麻烦看一下,得不到想要的结果
只看楼主 加入收藏
c764193441
Rank: 2
等 级:论坛游民
帖 子:18
专家分:16
注 册:2012-9-23
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:7 
优先队列怎么弄?这样行吗?麻烦看一下,得不到想要的结果
程序代码:
麻烦看一下,基本逻辑上我觉得是没问题的,但是总调试不出来,不知道哪里出问题了



#include<stdio.h>
#define maxdata 50
typedef struct priority
{
   int data;
   int priority;
   }priorityqueue;
   priorityqueue a[maxdata];
int n=0;
void minheapfixup(priorityqueue a[],int i)
{
int j;
priorityqueue temp;
temp.priority=a[i].priority;
temp.data=a[i].data;
j=(i-1)/2;
while(j>=0&&i!=0)
{if(a[i].priority<=temp.priority)
break;
a[i].data=a[j].data;
a[i].priority=a[j].priority;
i=j;
j=(i-1)/2;
}
a[i].priority=temp.priority;
a[i].data=temp.data;
}
void minheapadd(priorityqueue a[],int n,int ndata,int npriority)
{
a[n].data=ndata;
a[n].priority=npriority;
minheapfixup(a,n);
n++;
}
void minheapfixdown(priorityqueue a[],int i,int n)
{
int j;
priorityqueue temp;
j=2*i+1;
while(j<n)
{
if(j+1<n&&a[j+1].priority<a[j].priority)
j++;
if(a[j].priority>temp.priority)
break;
a[i].priority=a[j].priority;
a[i].data=a[j].data;
i=j;
j=2*i+1;
}
a[i].priority=temp.priority;
a[i].data=temp.data;
}
void swap(int i,int j)
{priorityqueue temp;
temp.data=a[i].data;
temp.priority=a[i].priority;
a[i].data=a[j].data;
a[i].priority=a[j].priority;
a[j].data=temp.data;
a[j].priority=temp.priority;
}
void minheapdelete(priorityqueue a[],int n)
{swap(0,n-1);
minheapfixdown(a,0,n-1);
}
void makeminheap(priorityqueue a[],int n)
{
for(int i=n/2-1;i>=0;i--)
minheapfixdown(a,i,n);
return;
}
void minheapsortTodescendarray(priorityqueue a[],int n)
{
for(int i=n-1;i>=1;i--)
{
swap(i,0);
minheapfixdown(a,0,i);
}return ;
}
int main()
{       int e,d,p;
        printf("请输入数据:\n");
        printf("你要输入数据的个数?");
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            printf("请输入数据的值");scanf("%d",&a[i].data);
            printf("请输入数据的权值");scanf("%d",&a[i].priority);
        }
        printf("输入完成!请选择");
        makeminheap(a,n);
        minheapsortTodescendarray(a,n);
        do
        {printf("\n1查找\n");
        printf("2插入\n");
        printf("3删除\n");
        printf("4退出\n");
        scanf("%d",&e);
        switch(e)
        {
            case 1:{printf("最小权值数据为:");printf("%d\n",a[0].data);}break;
            case 2:{printf("请输入插入的数据和权值");scanf("%d%d",&d,&p);minheapadd(a,n,d,p); minheapsortTodescendarray(a,n);}break;
            case 3:{printf("%d",a[0].data);minheapdelete(a,n); minheapsortTodescendarray(a,n);}break;
            case 4:return 0;
        }
        }while(1);
return 0;
}


[ 本帖最后由 c764193441 于 2013-3-6 12:39 编辑 ]
2013-03-05 22:20
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:14 
红色的用了一样的命名了,吧其中的一个改一下吧
其他的逻辑如果有错误,你就自己找咯

#include<stdio.h>
 #define maxdata 50
 typedef struct priority
 {
    int data;
    int priority;
    }priorityqueue

…………
…………

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-06 12:23
c764193441
Rank: 2
等 级:论坛游民
帖 子:18
专家分:16
注 册:2012-9-23
收藏
得分:0 
回复 2楼 yuccn
这里应该没问题,我用的是堆排序来实现的,优先队列有很多种,能用其他方法吗?
2013-03-06 12:27
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 3楼 c764193441
你 的意思是说,红色那个不改掉,能够编译通过?

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-06 12:30
c764193441
Rank: 2
等 级:论坛游民
帖 子:18
专家分:16
注 册:2012-9-23
收藏
得分:0 
回复 4楼 yuccn
可以运行,但得不了想要的结果
2013-03-06 12:33
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 5楼 c764193441
那就怪了,可能编译器的原因,我这边vs2010编译,不该掉那个编译不通过



我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-06 12:35
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
发帖子最好说明 详细点
如果就是写“得不了想要的结果”,估计没有人知道你想要什么结果的。这样一般人都懒得理的

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-06 12:36
c764193441
Rank: 2
等 级:论坛游民
帖 子:18
专家分:16
注 册:2012-9-23
收藏
得分:0 
回复 6楼 yuccn
我用codeblocks来弄的,那个堆排序很难理解,有其他方法实现优先队列吗
2013-03-06 12:38
快速回复:优先队列怎么弄?这样行吗?麻烦看一下,得不到想要的结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036064 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved