所以,我的问题是,如何在不更改原始列表的情况下推进链接列表的副本。我有点理解为什么会发生这种情况,但我不知道一种避免这种情况发生的方法。
这就是我所做的,当我调用使用这些列表的另一个函数时,它们不存在。
typedef struct _edgeList
{
int target;
char* tCity;
char* country;
int population;
float weight;
struct _edgeList *next;
} EdgeList;
typedef struct _collisionList
{
int id;
char *city;
char* country;
int population;
EdgeList *edges;
struct _collisionList *next;
} CollList;
void CityWithMostTargets(CollList** hash)
{
CollList** aux = hash;
int i = 0;
int edges = 0;
int major = 0;
char* city;
for(i = 0; i < HASH_SIZE; i++)
{
while(aux[i])
{
if(aux[i]->edges)
{
edges = CountEdges(hash[i]->edges);
}
if(edges > major)
{
major = edges;
city = strdup(hash[i]->city);
}
if(!aux[i]->next)
break;
aux[i] = aux[i]->next;
}
}
aux = hash;
printf("City: %s\nNumber of edges: %d", city, major);
getchar();
}
您可以定义另一个变量来保存要使用的aux[i]
的值。
for(i = 0; i < HASH_SIZE; i++)
{
CollList* a = aux[i];
while (a)
{
// etc.
并替换该循环中aux[i]
的其他用法以使用a
。