0

我有一个全局列表

typedef struct center {
  char center_name[100];
  char hostname[100];
  int port;

  struct center *next_center;
} center;

所以当我开始时:

int main(int argc, char** argv) {
  center *head = null;
  parse(argv, &head);
}

在哪里解析:

 void parser (char** argv, center **head) {
   //read a file amd add the elements to a newCenter
   addToCenterList(newcenter, head);
 }

其中 addToCenterList:

void addToCenterList(center *newcenter, center **head) {
  center *newNode = malloc(sizeof(center));
  strcpy(newNode->center_name, newcenter->center_name);                
  strcpy(newNode->hostname, newcenter->hostname);
  newNode->port = newcenter->port;
  newcenter->next_center = NULL;    

  if (*head == NULL)       
    *head = newNode; 
  else {
    //problem starts here, it never adds after the first element
    center **iterator; 
    center ite; 
    iterator = head; 
    ite = **iterator;

    while(1){
      if(ite.next_center == NULL){
        *ite.next_center = *newNode; 
        break; 
      }                  
    }
}

我的问题从 else 开始:我正在传递列表头的地址。所以我知道我需要一个允许在列表中移动的变量。我已经尝试了很多东西,但没有任何工作。我想到了:遍历列表并将每个“节点”的地址存储在某个变量中,如果该地址的内容(节点!)其 next_center 是 == NULL,那么我将停止查找,因为那是最后一个元素。之后我会为 next_center 地址分配一个新内容。

这就是我想要做的。我不知道如何使它工作....

提前致谢。

4

3 回答 3

1
void addToCenterList(center *newcenter, center **head) {
  center *newNode ;

  while  (*head )       { head = &(*head)->next_center;  }

  *head = newNode = malloc(sizeof *newNod);
  strcpy(newNode->center_name, newcenter->center_name);
  strcpy(newNode->hostname, newcenter->hostname);
  newNode->port = newcenter->port;
  /* Note the next line:
   ** the OP assigned not to newNode, but to newcenter,
   ** which appears to be
   ** "read-only" source data element
   */
  newNode->next_center = NULL; 
}
于 2013-01-26T18:29:34.727 回答
0
while(1){
     if(ite.next_center == NULL){
         *ite.next_center = *newNode; 
         break; 
     }                   
}

这个循环考虑如果你的迭代器是最后一个元素怎么办,但不是如果不是怎么办。您需要添加 aelse { ite = ite->next;}或其他内容来实现该效果,以便您不断迭代列表直到找到结尾。

第二个问题,也许更关键,是您正在修改列表的副本。

center ite; 
...
ite = **iterator;

这将创建列表元素的副本。然后你分配给这个副本,副本在块的末尾被销毁。

center *ite; 
...
ite = *iterator;

这将插入第二个元素(修复 while(1) 循环中的语法),然后插入第三个元素将由于第一个提到的问题而导致无限循环。

于 2013-01-26T17:05:50.973 回答
0

删除 addToCenterList 最后几行中的星号,看看会发生什么。

item *k = &head;
while (*k != NULL)
    k = &((*k)->next);
item e = calloc(1, sizeof(struct element));
if (!e) {// calloc didn't work
    // error handling
}
e->value = value;
*k = e;

请注意,它item是指针类型:

struct element {
    int value;
    struct element * next;
};

typedef struct element * item;

您必须针对您的实施对其进行调整(在此处添加一些星号并在此处删除一些)。

星号声明是因为它会导致错误 afaik: You can't assign whole structs,这就是为什么你应该用指针来代替。

于 2013-01-26T16:54:58.633 回答