2017-12-07 4 views
0

リンクリストを作成しようとしていますが、すでに作成されていないリストに新しいノードを挿入して表示しようとすると、挿入されたノードが存在する。ここでのコードは次のとおりです。新しいノードをリンクリストに挿入すると新しいノードが作成されます

struct patient{ 
    char name[NAME]; 
    int ttime; 
    int atime; 
    int priority; 
    struct patient *next; 
}; 

struct wr{ 
    struct patient *fnode; 
    struct patient *lnode; 
}*wr; 

void wr_insert(struct patient *node){ 
    if(wr->fnode == NULL){ 
    wr->fnode = node; 
    wr->lnode = node; 
    } 

    else{ 

    wr->lnode->next = node; 

    wr->lnode = node; 

    } 

} 
void display(){ 
    struct patient *tmp = wr->fnode; 
    while(tmp != NULL){ 
    printf("%s %d %d %d\n",tmp->name,tmp->ttime,tmp->atime,tmp->priority); 
    tmp = tmp->next; 
    } 
} 
    void new_patient(char *line){ 
     int i,check; 
     listsem = sem_open(lISTSEM, 0); 
     char *token; 
     token = strtok(line," "); 
     check = atoi(token); 
     if(check == 0){ 
     struct patient *node = malloc(sizeof(struct patient)); 
     strcpy(node->name,token); 
     node->ttime = atoi(strtok(NULL," ")); 
     node->atime = atoi(strtok(NULL," ")); 
     node->priority = atoi(strtok(NULL," ")); 
     node->next = NULL; 
     sem_wait(listsem); 
     wr_insert(node); 
     sem_post(listsem); 
     } 
     else{ 
     struct patient *group = malloc(sizeof(struct patient)); 
     sprintf(group->name,"20171201-%d",groupnum); 
     group->ttime = atoi(strtok(NULL," ")); 
     group->atime = atoi(strtok(NULL," ")); 
     group->priority = atoi(strtok(NULL," ")); 
     group->next = NULL; 
     groupnum++; 
     sem_wait(listsem); 
     wr_insert(group); 
     sem_post(listsem); 
     for(i=1;i<check;i++){ 
      struct patient *node = malloc(sizeof(struct patient)); 
      sprintf(node->name,"20171201-%d",groupnum); 
      node->ttime = group->ttime; 
      node->atime = group->atime; 
      node->priority = group->priority; 
      node->next = NULL; 
      groupnum++; 
      sem_wait(listsem); 
      wr_insert(node); 
      sem_post(listsem); 
     } 
     display(); 
     } 
     get_patient(); 
    } 

したがって、たとえば、パイプ"3 10 20 30"からi入力は、それは当然、私が作成した3つのノードが表示されている場合。しかし、もし私が6ノードを印刷する必要があるときは、もう一度やり直してください。新しいノードは3つだけ印刷されます。

+0

あなたのリストの先頭がコール間でゼロになっています。あなたのコードはあまりにも厄介です/私はより頻繁に答えを与えるために十分頻繁にCを使用しません。修正は、コール間で頭を保持することです。 –

+0

@TimBiegeleisenは、頭がどこにあるかを指摘できますか?また、リンクされたリスト部分またはnew_patient関数のためにコードが乱雑ですか?ご回答有難うございます。 – jonelearn

+0

デバッガを使用します。それはあなたの考え(そしてあなたのプログラムのバグ)に誤りがあった場所を教えてくれるでしょう。 –

答えて

0

この構造体の定義/インスタンス:、のインスタンスへのポインタではないルートポインタが細かいので

struct wr 
{ 
    struct patient *fnode; 
    struct patient *lnode; 
} *wr; 

が、正しくはありませんが、wrのインスタンスは、構造体のインスタンスである必要があります構造体。

は提案する:

struct wr 
{ 
    struct patient *fnode; 
    struct patient *lnode; 
} wr; 

、コードの残りの部分は構造体ではなく、このだから、構造体へのポインタのインスタンスとしてwrを扱う必要があります:

void wr_insert(struct patient *node) 
{ 
    if(wr->fnode == NULL) 
    { 
     wr->fnode = node; 
     wr->lnode = node; 
    } 

    else 
    { 
     wr->lnode->next = node; 
     wr->lnode = node; 
    } 

は次のようになります。

void wr_insert(struct patient *node) 
{ 
    if(wr.fnode == NULL) 
    { 
     wr.fnode = node; 
     wr.lnode = node; 
    } 

    else 
    { 
     wr.lnode->next = node; 
     wr.lnode = node; 
    } 
関連する問題