2014-09-06 6 views
-3

У меня есть массив указателей на структуры внутри массива struct и я хочу отсортировать свой «график []» по его буквам.Сортировка массива указателей на структуры внутри структуры

Моя проблема заключалась в сортировке '* vertexes []' внутри 'struct vertex'. Теперь я не могу показать «письмо» в каждом из указателя внутри '* Вершины [] ...

Вот код с 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

+0

'std :: sort (vertexes & vertexes [size], byLetter)' должен быть 'std :: sort (вершины, вершины + размер, byLetter);', 'vertexes [size]' - это нарушение доступа, ожидающее своего появления! То же самое можно сказать о '& graph [i] .vertexes [graph [i] .tam]' – BeyelerStudios

+0

'* A-> vertexes-> letter' пытается разыменовать указатель' A-> vertexes-> letter', который doesn ' t даже скомпилировать! – BeyelerStudios

ответ

1

Во-первых, станд :: сортировка просто , Вы даете ему начальную запись и конечную запись.

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); 
} 

Собираем все вместе, и удаление C-изм положить struct повсюду, вот простая версия вашей программы:

#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

+0

Да, но я сосредоточился на ошибке компиляции. Я просто попросил ОП разъяснить, что он пытается сортировать. – PaulMcKenzie

Смежные вопросы