对结构内部结构的指针数组进行排序

时间:2014-09-06 21:48:39

标签: c++ arrays pointers struct

我有一个指向结构数组内部结构的指针数组,我希望用它的字母对'graph []'进行排序。

我的问题是在'struct vertex'中排序'* vertexes []'。现在我无法在'* vertexes []'...

中的每个指针中显示'字母'

以下是PaulMcKenzie更正的代码:

#include <algorithm> //std::sort()
#include <cstdio> //std::scanf(), std::putchar()
//
struct vertex {
    vertex *vertexes[26];
    vertex **end; //Do the same as 'size'
    unsigned int size;
    char letter;
    void insert(vertex *dest) { vertexes[size] = dest; ++size; /* or *end = dest; end+=1; */ }
    bool empty(void) const { return(this->size == 0); /* or return(vertexes == end); */ }
};
//
bool byLetter(const vertex *A, const vertex &B)
{
    return(A->letra < B->letra);
}
//
int main(void)
{
  unsigned int n(0), N, A, v, V;
  char ini, fim;
  vertex graph[26]; //Each one represents a letter of the alphabet
  std::scanf("%u ", &N);
  while(n++ < N) {
    for(v = 0; v < 26; ++v) {
      graph[v].size = 0;
      graph[v].end = graph[v].vertexes;
      graph[v].letter = v+'a';
    }
    std::scanf("%u %u ", &V, &A);
    do {
      std::scanf("%c %c ", &ini, &fim);
      graph[ini-'a'].insert(&graph[fim-'a']);
    } while(--A != 0);
    for(v = 0; v < V; ++v) {
      if(!graph[v].empty()) {
          std::sort(graph[v].vertexes, &graph[v].vertexes[graph[v].size], byLetter);
          //Not sure why graph[v] + size is more safe then this...
          graph[v].show(); //Problem here
      }
    }
    std::putchar('\n');
  }
  return(0);
}
//
void vertex::show(void)
{
  vertex **p(vertexes); //'p' iterates thought vertexes 
  while(p != end) { //but I can't access the letter in each pointer 
    std::putchar(*(*p->vertexes->letter)); // problem here
    std::putchar(',');
    p+=1;
   }
}
//

1 个答案:

答案 0 :(得分:1)

首先,std :: sort很简单。你给它起始条目和结束条目。

    std::sort(graph[i].vertexes, graph[i].vertexes + 26, byLetter);

有26 vertexes,所以只需添加26即可到达最后一个。

下一个问题是,由于vertexes是一个指针数组,因此函数byLetter将传递两个指向vertex的指针,而不是两个引用:

bool byLetter(const vertex *A, const vertex *B)
{
    return(A->letter < B->letter);
}

将所有内容放在一起,并删除将struct放在所有位置的C-ism,这是您的程序的简单版本:

#include <algorithm> 

struct vertex {
    vertex *vertexes[26];
    unsigned int size;
    char letter;
    void sort(void);
};

bool byLetter(const vertex *A, const vertex *B)
{
    return(A->letter < B->letter);
}

int main()
{
    unsigned int i;
    vertex graph[26];
    for(i = 0; i < 26; ++i) {
        std::sort(graph[i].vertexes, graph[i].vertexes + 26, byLetter);
    }
}