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つだけ印刷されます。
あなたのリストの先頭がコール間でゼロになっています。あなたのコードはあまりにも厄介です/私はより頻繁に答えを与えるために十分頻繁にCを使用しません。修正は、コール間で頭を保持することです。 –
@TimBiegeleisenは、頭がどこにあるかを指摘できますか?また、リンクされたリスト部分またはnew_patient関数のためにコードが乱雑ですか?ご回答有難うございます。 – jonelearn
デバッガを使用します。それはあなたの考え(そしてあなたのプログラムのバグ)に誤りがあった場所を教えてくれるでしょう。 –