Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C(初学者):为什么赢了;这不是我的工作吗?编辑:从一个错误到另一个错误_C_Algorithm_Struct_Qsort - Fatal编程技术网

C(初学者):为什么赢了;这不是我的工作吗?编辑:从一个错误到另一个错误

C(初学者):为什么赢了;这不是我的工作吗?编辑:从一个错误到另一个错误,c,algorithm,struct,qsort,C,Algorithm,Struct,Qsort,我正在做K&R练习6-4,即: 6-4。编写一个程序,按出现频率的降序打印输入中的不同单词。在每个单词前面加上计数 我决定创建一个名为dstncFreqNode6_4的结构: struct dstncFreqNode6_4 { char *word; int count; struct dstncFreqNode6_4 *left; struct dstncFreqNode6_4 *right; }; 然后,我分析了输入的单词,并为每个不同的单词创建了一个“DSTNCF

我正在做K&R练习6-4,即:

6-4。编写一个程序,按出现频率的降序打印输入中的不同单词。在每个单词前面加上计数

我决定创建一个名为dstncFreqNode6_4的结构:

struct dstncFreqNode6_4
{
   char *word;
   int count;
   struct dstncFreqNode6_4 *left;
   struct dstncFreqNode6_4 *right;
};
然后,我分析了输入的单词,并为每个不同的单词创建了一个“DSTNCFREKNODE6_4”节点和两个指向它的指针:一个插入BST(添加新词/更新已遇到单词的计数),另一个插入到“dsntFredNode6_4”指针的全局数组

这样做是为了通过遍历BST(其中包含到目前为止遇到的所有单词的指针)来更新单词(节点)的计数。解析完整个输入后,指针数组将按成员的“count”变量排序,然后打印。自从

添加新词/更新计数的代码如下:(我不认为有任何问题,因为BST和数组似乎填充正确,所以您可以忽略这一点):

我似乎不明白它为什么不能正确排序。实际上,我实现了自己的快速排序算法,得到了相同的结果。我现在真的不知道

如果能有一双新鲜的、专业的眼睛为我指明正确的方向,那就太好了。谢谢

编辑

对不起,这是打给qsort的电话:

qsort(wordCounts, numWords, sizeof(struct dstncFreqNode6_4 *), qcmp6_4);
编辑#2:


根据建议,我制作了一个指向节点的指针数组“wordCounts”(本文中的所有代码都已更新以反映这一点)。因此本质上,BST和数组包含相同的信息(实际上数组指针初始化为BST中相应的指针),但它们的用途不同。BST用于添加新词/更新已经遇到的词的计数,数组在末尾排序(根据每个词的计数)并打印。但是,我遇到了与我最初遇到的问题相同的问题:在调用qsort之后,数组的顺序保持不变。

在我看来,您试图对一个节点数组进行排序,每个节点都包含指向数组中其他节点的指针。排序之后,这些指针当然会指向数组中错误的元素。也许这就是你的问题

顺便说一下,我看到您正在使用
realloc
。每当必须将分配的数组移动到新位置以满足新的大小要求时,指向数组元素的指针也会出现同样的问题,更糟糕的是:节点指针现在将全部指向无效地址,使用它们将导致未定义的行为


一种可能的解决方案是永远不要修改原始的节点数组,而是创建指向节点的第二个指针数组,并使用比较函数对该指针数组进行排序,该函数比较它们指向的节点。

因此,我已设法使用自己的quicksort实现对其进行排序。在stlib.h版本中,我的数组仍然没有排序。它只能用于基元类型的数组吗?因为这是我能看到的阻止它工作的唯一原因

以下是我的自定义qsort代码供参考:

void swapFreq6_4(struct dstncFreqNode6_4 **a, struct dstncFreqNode6_4 **b)
{
   struct dstncFreqNode6_4 *t=*a; *a=*b; *b=t;
}

void **sortFreq6_4(struct dstncFreqNode6_4 **arr, int beg, int end)
{

   if (end > beg + 1)
   {
      struct dstncFreqNode6_4 *piv = *(arr + beg);
      int l = beg + 1;
      int r = end;


     while (l < r)
     {
         if ( (*(arr + l))-> count <= piv -> count)
             l++;
         else
             swapFreq6_4((arr + l), (arr + --r));
     }



     swapFreq6_4((arr + --l), (arr + beg));
     sortFreq6_4(arr, beg, l);
     sortFreq6_4(arr, r, end);

  }
}
void swapFreq6_4(结构dstncFreqNode6_4**a,结构dstncFreqNode6_4**b)
{
结构DSTNCFREKNODE6_4*t=*a;*a=*b;*b=t;
}
无效**排序请求6_4(结构dstncFreqNode6_4**arr、int beg、int end)
{
如果(结束>beg+1)
{
结构DSTNCFREKNODE6_4*piv=*(arr+beg);
int l=beg+1;
int r=结束;
while(l计数
l++;
其他的
swapFreq6_4((arr+l)、(arr+--r));
}
swapFreq6_4((arr+--l),(arr+beg));
SORTFREK6_4(arr、beg、l);
SORTFREK6_4(arr、r、end);
}
}

有人知道为什么stdlib的qsort代码不能与我的结构一起工作吗?我是不是用错了(我对它的调用以及比较函数都在原始帖子中)?

所以,您向我们展示了几乎所有的内容,除了对实际数组的qsort的实际调用。你认为这可能很重要吗?你的评论让我查看了我的代码,发现我使用的是节点指针的大小,而不是qsort的节点大小。这样就解决了非排序问题。。。现在唯一的问题是我有一个分割错误!使用调试器应该很容易找到分段错误。设置一个断点,然后逐行遍历代码,直到错误暴露出来。这已经消除了分段错误,但是,最初的问题仍然存在。realloc的问题是我关心和意识到的,但我不知道这会对我尝试做的事情产生什么影响。因此,我实现了一系列指针,但问题仍然存在
qsort(wordCounts, numWords, sizeof(struct dstncFreqNode6_4 *), qcmp6_4);
void swapFreq6_4(struct dstncFreqNode6_4 **a, struct dstncFreqNode6_4 **b)
{
   struct dstncFreqNode6_4 *t=*a; *a=*b; *b=t;
}

void **sortFreq6_4(struct dstncFreqNode6_4 **arr, int beg, int end)
{

   if (end > beg + 1)
   {
      struct dstncFreqNode6_4 *piv = *(arr + beg);
      int l = beg + 1;
      int r = end;


     while (l < r)
     {
         if ( (*(arr + l))-> count <= piv -> count)
             l++;
         else
             swapFreq6_4((arr + l), (arr + --r));
     }



     swapFreq6_4((arr + --l), (arr + beg));
     sortFreq6_4(arr, beg, l);
     sortFreq6_4(arr, r, end);

  }
}