【发布时间】:2017-12-07 12:14:53
【问题描述】:
我正在尝试创建一个链接列表,它创建得很好,但是当我尝试将新节点插入到已经非空的列表中并显示它时,只有新插入的节点存在。这是代码:
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" 输入,它会正确显示我创建的 3 个节点。但是,如果我再做一次,当它应该打印 6 个节点时,它只会再次打印 3 个,但会打印新的。
【问题讨论】:
-
您的列表头在通话之间被取消。你的代码太乱了/我没有经常使用 C 来给出更集中的答案。更正是在通话之间保留头部。
-
@TimBiegeleisen 你能指出头部被归零的位置吗?还是因为链表部分或 new_patient 函数而导致代码混乱?谢谢你的回答。
-
使用调试器。它会告诉你你的想法在哪里出错(以及程序中的错误)。
-
告诉我们您是如何进行两组调用以分别添加 3 个节点的。
-
@TimBiegeleisen 就像我在帖子中所说的那样。那
3 10 20 30。 3 表示将使用信息 10、20、30 创建 3 个单独的节点。并通过命名管道使用它。
标签: c linux pointers unix linked-list