c中具有多维数据类型的多维数组

时间:2014-01-13 23:07:21

标签: c arrays sorting queue structure

我必须实现一个奇怪的数据结构。有一个队列,其中包含内存分配(可能是队列或数组,但没有链接列表或代码中使用malloc()的任何内容)。 我们必须使用这个机构: -

Struct  //we don't have to use pointer in structure in achieving the task
{
int frequency;
unsigned char symbol;
short int left,right;     
}

在这里你可以看到我们在第一个索引处有a,b,c,d和e这样的字母表,在第二个索引上有相应的频率,而另外两个索引暂时没用,但是我们必须为他们现在。

现在只对我们有用的东西只是第二个索引(这是字母表的频率)。我在这个问题中要做的就是两个添加两个最小频率(我必须把它放在一个地方,以便必须保持增加的顺序)例如:你可以看到下面我们添加前两个节点的频率:所以对于第一个索引我们得到“a + b”的结果,让我们说“z”(a + b = z)和第二个索引(3 + 3 = 6),另外两个索引是“0”和“0”,所以对我们没用。我们现在必须调整这个获得的记忆,使其保持频率增加的顺序

现在的问题是: (1)任何想法如何实现这种类型的数据结构? (不使用指针,malloc(),链表等)(但可以使用队列/堆栈),而且我们可以使用memcpy()进行移位。 (2)如何在这种情况下实现排序(但它是次要的,首先是如何实现它?)(很抱歉,我正在对可以解决这个问题的主题标记这个问题,对不起) 如果你对这个问题一无所知,请不要犹豫我。

2 个答案:

答案 0 :(得分:1)

我认为你也可以声明一个包含26个结构的数组,因为看起来每个字母只能有一个条目,不再有

struct counting_thing //we don't have to use pointer in structure in achieving the task
{
int freq;
unsigned char sym;
short int left,right;     
}

struct counting_thing ordered_things[25];    // one entry for each letter [a-z]

然后,您只需要一个在节点数组上运行的排序算法,并使用每个节点的freq元素作为比较的基础。

答案 1 :(得分:1)

这种结构主要用于搜索或存储吗?你会不断添加和删除元素,还是会保持相当静态?

假设我理解了这个问题(保证),听起来像最简单的方法是使用struct类型的常规数组 1

struct afreq {
  int freq;
  unsigned char sym;      // why unsigned? why not just plain char?
  short int left,right;
};

...
struct afreq data[N]; // where N is large enough for as many elements
                      // as you need
size_t dataSize;

使用qsort库函数根据需要对数组进行排序。您必须编写一个比较函数以传递给qsort

int cmpAfreq( const void *lhs, const void *rhs )
{
  const struct afreq *l = lhs;
  const struct afreq *r = rhs;

  if ( l->freq < r->freq ) return -1;
  if ( l->freq > r->freq ) return 1;
  return 0;
}

所以,假设您从以下内容开始:

struct afreq data[N] = { {3, 'a', 0, 0 }, {3, 'b', 0, 0}, {4, 'c', 0, 0 },
                         {6, 'd', 0, 0 }, {9, 'e', 0, 0} };
size_t dataSize = 5;

你可以像这样添加一个新元素:

struct afreq newItem;
newItem.freq = data[i].freq + data[j].freq;
newItem.sym = 'z';
newItem.left = newItem.right = 0;

if ( dataSize < N )
{
  data[dataSize++] = newItem;
  qsort( data, dataSize, sizeof data[0], cmpAfreq );
}
else
{
  // data array is full, can't add another element
}

要从数组中删除元素,可以用最后一个元素覆盖要删除的元素,将计数器减1,然后重新排序数组:

data[i] = data[dataSize--];
qsort( data, dataSize, sizeof data[0], cmpAfreq );

这绝不是高效;每次添加或删除数据时必须完全重新排序数组将是昂贵的(特别是因为qsort在已经大部分排序的数组上的性能很差)。但这可能是我能想到的最直接的实现。

<小时/> 1。实际上,听起来像最简单的方法是使用像C ++或Java或Python这样的语言,或者只是提供map或类似容器的其他任何东西,键入你的{{1成员