同一个C程序在vc中和在codeblocks中运行结果不一样
在vc中程序结果运行正常,在codeblocks中运行不正常
vc是vc++6.0
codeblocks用的编译器是mingw32-gcc 4.9.3-1
int count=len+1;//构建哈夫曼树计数
int arr[2];//每次选出来的最小的两个元素的index
while(count<=2*len-1){
selectSmallTwo(h,count-1,arr);
**//printf(" ");**
h[arr[0]].parent=count;
h[arr[1]].parent=count;
h[count].lchild=h[arr[0]].index;
h[count].rchild=h[arr[1]].index;
h[count].weight=h[arr[0]].weight+h[arr[1]].weight;
count++;
}
在codeblocks中,如果在selectSmallTwo(h,count-1,arr);后加上一个printf()语句后就输出正常,而且用延迟函数也不行。
总的来说,我测试了三种情况
什么都不加
加printf()
延迟sleep()
只有第二种正常,第三种延迟不同时间得到的结果也不一样
完整代码
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
typedef struct HData{
int weight;
int index;
char contain;//非原始节点用#表示
int parent,lchild,rchild;
}HuffmanData;
int main()
{
//函数声明
void creat(HuffmanData h[],int len,int w[],char c[]);
void selectSmallTwo(HuffmanData h[],int n,int ind[]);
int adjustArray(int a[],int i, int j);
void quickSort(int a[],int low,int high);
HuffmanData hu[8];
int wg[4]={7,5,2,4};
char ch[4]={'A','B','C','D'};
creat(hu,4,wg,ch);
int i;
for(i=1;i<8;i++){
printf("index=%d,char=%c,weight=%3d,parent=%3d,lchild=%3d,rchild=%3d\n",hu[i].index,hu[i].contain,hu[i].weight,hu[i].parent,hu[i].lchild,hu[i].rchild);
}
return 0;
}
void creat(HuffmanData h[],int len,int w[],char c[]){
//声明
void selectSmallTwo(HuffmanData h[],int n, int ind[]);
int i;
for(i=1;i<=len;i++){//len为原始节点个数,i从1开始,以免和0作为没有父节点或子节点的标识混淆
h[i].weight=w[i-1];
h[i].contain=c[i-1];
h[i].parent=0;
h[i].lchild=0;
h[i].rchild=0;
h[i].index=i;
}
for(;i<=2*len-1;i++){
h[i].weight=0;
h[i].index=i;
h[i].contain='#';
h[i].parent=0;
h[i].lchild=0;
h[i].rchild=0;
}
int count=len+1;//构建哈夫曼树计数
int arr[2];//每次选出来的最小的两个元素的index
while(count<=2*len-1){
selectSmallTwo(h,count-1,arr);
//Sleep(1000);
h[arr[0]].parent=count;
h[arr[1]].parent=count;
h[count].lchild=h[arr[0]].index;
h[count].rchild=h[arr[1]].index;
h[count].weight=h[arr[0]].weight+h[arr[1]].weight;
count++;
}
}
void selectSmallTwo(HuffmanData h[],int n,int ind[]){//n为当前weight不为0的元素
//声明
void quickSort(int a[],int low,int high);
int i;
int j=0;//临时数组计数用
int flag=0;//最终结果计数用
int a[10];
for(i=1;i<=n;i++){
if(h[i].parent==0){
a[j++]=h[i].weight;
}
}
quickSort(a,0,9);
//返回最小的前两个
for(i=0;i<10;i++){
if(a[i]!=0&&flag<2){
for(j=1;j<=n;j++){
if(h[j].weight==a[i]){
ind[flag++]=h[j].index;
}
}
}
}
}
//快速排序
int adjustArray(int a[],int i, int j){
int x=a[i];
while(i<j){
while(i<j&&a[j]>=x){
j--;
}
if(i<j){
a[i]=a[j];
i++;
}
while(i<j&&a[i]<=x){
i++;
}
if(i<j){
a[j]=a[i];
j--;
}
}
a[i]=x;
return i;
}
void quickSort(int a[],int low,int high){
if(low<high){
int i=adjustArray(a,low,high);
quickSort(a,low,i-1);
quickSort(a,i+1,high);
}
}
正常输出应该如下图
跪求各位大神解答,小妹不胜感激!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有个数组没有初始化,可能使用了
a indeterminate (garbage) value
. 修改为int a[10] = {0},运行结果就正确了参考http://stackoverflow.com/ques...