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

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:全体structsを割り当てることはできません。そのため、代わりにポインターを使用して割り当てる必要があります。

于 2013-01-26T16:54:58.633 に答える
0
while(1){
     if(ite.next_center == NULL){
         *ite.next_center = *newNode; 
         break; 
     }                   
}

このループは、イテレータが最後の要素である場合の処理​​を考慮しますが、そうでない場合の処理​​は考慮しません。その効果にa または何かを追加してelse { ite = ite->next;}、最後が見つかるまでリストを繰り返し処理する必要があります。

2 番目の問題は、おそらくもっと重要なことですが、リストのコピーを変更していることです。

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

これにより、リスト要素のコピーが作成されます。次に、このコピーに割り当てると、ブロックの最後でコピーが破棄されます。

それを修正してください

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

これにより、2 番目の要素が挿入され (while(1) ループの構文が修正されます)、3 番目の要素を挿入すると、最初に述べた問題により無限ループが発生します。

于 2013-01-26T17:05:50.973 に答える