C中的2D指针算法

时间:2011-06-19 14:30:17

标签: c multidimensional-array pointer-arithmetic

我试图在C中交换2D数组中的2个元素,但没有运气。

感谢目前为止的答案,但我编辑了这段代码,以便更清楚地了解我在做什么。

typedef struct smystruct { /* stuff... */ } mystruct;

void nswap( mystruct ** a, mystruct ** b )
{
  mystruct * tmp = *a;
  *a = *b;
  *b = tmp;
}

void nqsort( mystruct ** h, int m, int n )
{
  double key = 0.0;
  int i = 0, j = 0, k = 0;

  if( m < n ) {
    // choose the pivot point...
    k = (m + n) / 2;

    nswap( &h[ n ], &h[ k ] );

    key = (*h+m)->prob;

    i = m + 1;
    j = n;

    while ( i <= j ) {
      while ( (i <= n) && (*h+i)->prob <= key )
        i++;
      while ( (j >= m) && (*h+j)->prob > key )
        j--;
      if ( i < j ) {
        nswap( &h[i], &h[j] );
      }
    }

    // swap two elements
    nswap( &h[m], &h[j] );

    // recursively sort the lesser list
    nqsort( h, m, j-1 );
    nqsort( h, j+1, n );
  }
}

int main()
{
  mystruct * p = NULL;

  // get the number of nodes (m)...
  fscanf( in, "%d", &m );

  // allocate memory for the node and connectivity matrix arrays...
  p = (mystruct*)malloc( sizeof( mystruct ) * m );

  // read in the location and associated probabilities!...
  for ( ; loop < m ; ++loop ) {
    mystruct * tmpnode = p + loop;
    tmpnode->str = (char*)malloc( sizeof( char ) * 1024 );
    fscanf( in, "%s %lf", (char *)tmpnode->str, &tmpnode->prob );
  }

  nqsort( &p, 0, m );
}

毋庸置疑,这不起作用。我搜索了一些例子,似乎没什么用。建议n00b将不胜感激。

3 个答案:

答案 0 :(得分:2)

  1. 最后一个元素的索引为count-1,而不是count

    h[0]  h[1]  h[2]  h[3]  h[4]  h[5]  h[6]  h[7]  h[8]  h[9]
    ----------------------------------------------------------
                         total 10 elements
    
  2. 我不知道fwnodes是什么,也许你的意思是h

答案 1 :(得分:2)

那里有多个错误。

1 /您的2D数组分配错误(或代码丢失)。 2 /进行这种2D分配的正确方法是使用Iliffe指针(如C / C ++中的Numrical Recipes中所建议的那样)。

mystruct** alloc_array( int h, int w )
{
  int i;
  mystruct** m = malloc(h*sizeof(mystruct*));
  m[0] = malloc(h*w*sizeof(mystruct));
  for(i=1;i<h;i++) m[i] = m[i-1]+w;
  return m;
}

void release_array(mystruct** m)
{
  free( m[0] );
  free( m);
}

这种分配方式为你带来了一个连续的内存块(更易于处理,更易于缓存,不需要进行一些索引计算)和[] []访问。

您的交换功能随后变为:

void swap( mystruct* a, mystruct* b )
{
  mystruct tmp = *a
  *a = *b;
  *b = tmp;
}

可以像:

一样调用
swap( &some_tab[i][j], &some_other_tab[u][v] );

在一个完整的例子中:

int main()
{
  mystruct** my_array = alloc_array(3,4); /* 3x4 mystruct array */

  /* fill the array */

  /* Swap some */

  swap( &my_array[2][1], &my_array[0][3] );


  release_array(my_array);
}

答案 2 :(得分:0)

您正在将指向数组的指针传递给您的函数。这意味着h只有一个元素。

swap( &p, 10 );

应该是:

swap( p, 10 );

这意味着您需要更改函数以接受mystruct数组或将p更改为指向mystruct的数组。

而且,正如KennyTM建议最后一个元素的索引9不是10。