将指针数组排序到结构体内的结构体

问题描述:

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

我的问题是排序'结构顶点'内的'* 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; 
    } 
} 
// 
+0

'结构顶点顶点* [26];''使用在struct'这种情况下是你的标志阅读'C'材料而不是'C++'材料。在C++中,在这种情况下不需要'struct'。 – PaulMcKenzie 2014-09-06 21:54:26

+0

'std :: sort(vertexes,&vertexes [size],byLetter)'应该是'std :: sort(vertexes,vertexes + size,byLetter);','vertexes [size]'是一个等待发生的访问冲突! '&amp; graph [i] .vertexes [graph [i] .tam]' – BeyelerStudios 2014-09-06 21:57:07

+0

'* A-> vertexes-> letter'试图解引用指针'A-> vertexes-> letter',甚至编译! – BeyelerStudios 2014-09-06 22:01:28

首先,性病::排序很简单。你给它起始条目和结尾条目。

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-主义,这里是你的程序的简单版本:

#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); 
    } 
} 
+0

更不用说std :: sort()没有做任何事情,并且可能具有UB来访问未初始化指针的地址。 – 0x499602D2 2014-09-06 22:07:18

+0

是的,但我专注于编译错误。我只是要求OP澄清他想要分类的东西。 – PaulMcKenzie 2014-09-06 22:16:20