在C中处理数组嵌套结构的最佳方法

时间:2010-11-01 21:44:39

标签: c

嘿大家,我在C中遇到了一些麻烦,我正在使用各种数组嵌套结构来模拟宇宙。这是结构代码......

struct star  
{  
    int x;  
    int y;  
    int z; 
    int m;  
    char name[100];  
};  
struct colony  
{  
    int pop;  
};  
struct planet  
{  
    int x;  
    int y;  
    int z;  
    int m;  
    int colonized;  
    char name[100];  
    struct colony colony_member;  
};  
struct galaxy  
{  
    int x;  
    int y;  
    int z;  
    char name[100];  
    struct planet planet_member;  
    struct star star_member;  
}; 

假设我在结构中制作了10个具有随机值的随机星系,我将如何在该星系结构中创建100个行星?我很困惑如何处理这个问题的最佳方式,或者即使结构如果我想去的方式也是如此。

提前致谢!
-Devan

2 个答案:

答案 0 :(得分:3)

你可以创建一个指针,让不同数量的行星和恒星进入你的星系!

struct galaxy
{
   int x;
   int y;
   int z;
   char name[100];
   struct planet *planet_member;
   struct star *star_member;
};

答案 1 :(得分:2)

您可以使用多种选项,从最简单的方法开始:

struct galaxy  
{  
  int x;  
  int y;  
  int z;  
  char name[100];  
  int number_of_planets;
  struct planet *planet_member;  // a pointer!
  struct star star_member;  
}; 

并创建一个星系:

galaxy g;
g.number_of_planets = some_random_value
g.planet_member = malloc (sizeof (planet) * g.number_of_planets);
for (i = 0 ; i < g.number_of_planets ; ++i)
{
   g.planet_member [i].x = something
   g.planet_member [i].y = something
   g.planet_member [i].z = something
   // and so on for each planet
}

不要忘记,你需要freemalloc的记忆,否则你会得到内存泄漏。

您可以使用更复杂的数据结构,例如链接列表。所以,你的galaxy结构有一个指向列表中第一个和最后一个行星的指针。每个行星都有一个指向列表中下一个和前一个行星的指针。因此,从第一个行星开始并读取下一个行星指针,您可以处理列表中的每个行星。在Google上查找链接列表以查找有关它的更多信息。这项工作要多得多,而且已经做了很多次的工作,这导致......

...进展到C ++,其中有一个标准库,可以为您完成链接列表和其他数据类型的所有繁琐管理。所以,你的结构会变成:

struct galaxy  
{  
  int x;  
  int y;  
  int z;  
  std::string name;  
  std::vector <struct planet> planets; // vector is an array like type
  std::list <star> stars;  // list is a linked list
}; 

但是,你可以更进一步,让galaxy成为一个C ++类,这样当你创建一个C ++类时,它会自动在其中创建行星和星星,当你获得它时,该类会自动释放所有行星并使其成为星星成立。