C查找列表的最后一个元素作为参数传递

时间:2013-01-26 16:50:24

标签: c list

我有一份全球清单

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

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

这就是我想要做的事情。我不知道如何让它发挥作用....

提前谢谢。

3 个答案:

答案 0 :(得分: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; 
}

答案 1 :(得分: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;

你必须根据你的实现进行调整(在那里添加一些星号,然后在这里删除一些星号)。

而星号声明是因为它导致错误:你无法分配整个structs,这就是为什么你应该用指针代替它。

答案 2 :(得分:0)

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

如果你的迭代器是最后一个元素,那么这个循环会考虑怎么做,但如果不是,那么该怎么做。您需要添加else { ite = ite->next;}或类似的东西,以便您继续遍历列表,直到找到结束。

第二个问题,也许更重要的是,你正在修改列表的副本。

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

这将创建list元素的副本。然后分配给此副本,并在块的末尾销毁副本。

使用

修复此问题
center *ite; 
...
ite = *iterator;

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