同一个C程序在vc中和在codeblocks中运行结果不一样

发布于 2022-09-03 14:59:05 字数 3776 浏览 18 评论 0

在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()语句后就输出正常,而且用延迟函数也不行。
总的来说,我测试了三种情况

  1. 什么都不加

  2. 加printf()

  3. 延迟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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忆梦 2022-09-10 14:59:05

有个数组没有初始化,可能使用了a indeterminate (garbage) value. 修改为int a[10] = {0},运行结果就正确了

#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);
    }
    getchar();
    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;//最终结果计数用
    
    
    //a没有初始化
    //可能是在后面调用的过程中使用了垃圾值
    int a[10] = {0};


    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);
    }
}

参考http://stackoverflow.com/ques...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文