我有一个指向结构数组内部结构的指针数组,我希望用它的字母对'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;
}
}
//
答案 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);
}
}