结构数组在排序时给出错误的输出

2024-04-14

1)我有一个结构

struct node
    {
        char symbol;
        int freq;
        int left, right,root;
        int value;
        short is_sorted;
    };

struct node data[1000];

其中 data[215].freq(频率){0,1,2,3,4,5} 是通过从文件“Input.txt”中读取以下字母符号(symbol)(abcdef)值作为唯一参数来获得的。现在我必须添加该数组的两个最小频率,然后将新获得的元素放置在同一个数组中,以便它将保持频率的递增顺序(它已经排序数组,看到我们有 0,1,2,3 ,4,5)。

(2)还要注意的是,添加的最小的两个元素不能再参与排序和加法,如果已经添加了就必须固定一次位置,但是加法新得到的元素可以参加加法和再次排序。例如:我们将两个最小元素0和1相加,0+1=1,所以“1”是相加的结果,现在这个“1”必须定位在data[].freq中,这样仍然应该是递增的顺序。所以 :

data[i].freq = 0 1 1(added here) 2 3 4 5

现在我们必须再次找到最小的两个节点(请再次阅读注释(2)以便更好地理解)。我们不能再次添加0和1,因为它们已经参与了加法。所以这次我们将添加 1 和 2(这个位于索引 3 处,请不要与索引 2 处的那个混淆)。所以我们得到 1+2=3

0 1 1 2 3 3 4 5 我们再次定位 3 来维持递增顺序。我们再次重复:对于索引 4 和 5 处的元素(因为我们已经对索引 0,1 和 2,3 处的元素进行了加法),我们将得到 3+3=6,再次将其放置在 data[].freq 中。

0 1 1 2 3 3 4 5 6 这次 6 大于 4 和 5,因此它将出现在 5 之后以保持递增顺序。

最后我们会得到data[dataSize].freq像这样:

data[dataSize].freq= [0 1 1 2 3 3  4 5 6 9 15].

所以加法保持在索引 0,1 和 2,3 和 4,5 和 6, 7 和 8,9 之间,最后我们有 15,这是最后一个,所以我们在这里停止。这部分我已经在我的代码中完成了. 我需要什么帮助?当我运行代码时,显示数据将如下所示:Symbol Freq Left Right(它实际上是一个仅使用数组的哈夫曼树实现,没有 malloc 和指针)。

预期的输出是这样的:(当我使用 qsort() 时,它工作正常,但由于复杂原因,我没有使用 qsort() ):

./extended  Input.txt 
Reading file...
Data is:
0: symbol: a, Freq: 0, Left: -1, Right -1
1: symbol: b, Freq: 1, Left: -1, Right -1
2: symbol: 0, Freq: 1, Left: 0, Right 1
3: symbol: c, Freq: 2, Left: -1, Right -1
4: symbol: d, Freq: 3, Left: -1, Right -1
5: symbol: 5, Freq: 3, Left: 2, Right 3
6: symbol: e, Freq: 4, Left: -1, Right -1
7: symbol: f, Freq: 5, Left: -1, Right -1
8: symbol: 4, Freq: 6, Left: 4, Right 5
9: symbol: 3, Freq: 9, Left: 6, Right 7
10: symbol: 2, Freq: 15, Left: 8, Right 9
d: 00
a: 0100
b: 0101
c: 011
e: 10
f: 11

所以我已经实现了上面提到的算法,它对于打印频率(Freq)效果很好但它没有正确打印符号和左右子元素,我尝试了很长时间,但无法弄清楚我的代码中有错误的地方。(我确信树创建部分是正确的(即遍历)tree() 函数,问题出在代码中的某些地方在main() 函数,而且我已经评论了可疑的部分)。 下面是我的代码:

nt main(int argc, char **argv)
{
int i,count=0,j,f,s;
struct node data[1000];
int data_size=-1;
if(argc<2)
{
printf("Provide input file..");
return;
}
printf("Reading file...\n");
read_data(argv[1], data, &data_size);
printf("datasize: %d\n", data_size);


  for (i=0; i+1<data_size; i+=2) 
  {
//printf("count1: %d\n", count);
data[data_size].symbol='0'+count;
data[data_size].freq=data[data_size].root =data[i].freq+data[i+1].freq;
data[data_size].left=i;
data[data_size].right=i+1;
data[i].value=0;
data[i+1].value=1;
data[i].is_sorted=1;
data[i+1].is_sorted=1;
data[data_size].value='\0';
data[data_size].is_sorted=0;  

    for (j=data_size-1; j>f+1; j--) 
    {
    if (data[data_size].root >=data[j].freq) 
        {
    //  printf("Inside if loop\n");
        break;
        } 
        else 
        {
        //  printf("else loop\n");  
        data[j+1].freq=data[j].freq;
        data[j+1].symbol=data[j].symbol ;
        data[j+1].left=data[j].left ;
        data[j+1].right=data[j].right ;     
        //data[j+1]=data[j];
        }
        }
        ////////////////
        //printf("data[j+1].sym1: %c\n", data[j+1].symbol );
        data[j+1].freq=data[data_size].root ;
        data[j+1].symbol=data[data_size].symbol ;
        data[j+1].left=data[data_size].left ;
        data[j+1].right=data[data_size].right ;
        count=count_unsorted(data,data_size);
        data_size++;    
        printf("count2: %d\n", count);
}    
printf("Data is:\n");
for(i=0;i<data_size;i++)
{
printf("%d: symbol: %c, Freq: %d, Left: %d, Right %d\n", i,data[i].symbol, data[i].freq, data[i].left, data[i].right);
}
char path[100]={'\0'};
traverse_tree(data, data_size-1,path);
return 0;
}

我的代码的输出是:

  Reading file...
    0: symbol: a, Freq: 0, Left: -1, Right -1
    1: symbol: b, Freq: 1, Left: -1, Right -1
    2: symbol: f, Freq: 1, Left: -1, Right -1
    3: symbol: c, Freq: 2, Left: -1, Right -1
    4: symbol: d, Freq: 3, Left: -1, Right -1
    5: symbol: f, Freq: 3, Left: -1, Right -1
    6: symbol: e, Freq: 4, Left: -1, Right -1
    7: symbol: f, Freq: 5, Left: -1, Right -1
    8: symbol: 2, Freq: 6, Left: 4, Right 5
    9: symbol: 3, Freq: 9, Left: 6, Right 7
    10: symbol: 4, Freq: 15, Left: 8, Right 9
    f: 11
    e: 10
    f: 01
    d: 00
    hp@ubuntu:~/Desktop

当我尝试这样做时: printf("data[j].sym: %c\n", data[data_size].symbol );insde 注释部分(这是我将值插入元素和符号的最可疑的部分)" 那么我有非常符号的奇怪值是"data[j].sym: f data[j].sym: f data[j].sym: 2 data[j].sym: 3 data[j].sym: 4 "我不知道为什么它的前两个地方有“f”,应该有“0 1 2 3 4" not "f f 2 3 4 "


所以最后,我自己完成了:如果将来遇到类似类型的问题,我在这里为某人提供代码:

void sort_array(struct node *data, int length)
{
int i,j;
for(i=0;i<length-1 && data[i].freq<=data[length-1].freq;i++); //This loop breaks when it gets the desired position, So complexity is about n-1 for total n elements.
for(j=length-1;j>i;j--)
{
struct node temp;
temp.symbol=data[j].symbol;
temp.freq=data[j].freq;
temp.left=data[j].left;
temp.right=data[j].right;
temp.value=data[j].value;

data[j].symbol=data[j-1].symbol;
data[j].freq=data[j-1].freq;
data[j].left=data[j-1].left;
data[j].right=data[j-1].right;
data[j].value=data[j-1].value;

data[j-1].symbol=temp.symbol;
data[j-1].freq=temp.freq;
data[j-1].left=temp.left;
data[j-1].right=temp.right;
data[j-1].value=temp.value;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构数组在排序时给出错误的输出 的相关文章

  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 编程 Pearls - 随机选择算法

    Programming Pearls 第一版第 120 页介绍了从 N 个整数总体中选择 M 个等概率随机元素的算法 InitToEmpty Size 0 While Size lt M do T RandInt 1 N if not Me
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 应在堆栈上分配的最大数量

    我一直在寻找堆栈溢出有关应在堆栈上分配的最大内存量的指南 我看到了堆栈与堆分配的最佳实践 但没有关于应该在堆栈上分配多少以及应该在堆上分配多少的指南 有什么想法 数字可以作为指导吗 什么时候应该在堆栈上分配 什么时候应该在堆上分配 多少才算
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐