【发布时间】:2020-03-22 11:27:36
【问题描述】:
当我修改链表时(基于 ID),它成功地修改了节点,但删除了列表的其余部分。仅当我修改添加到列表中的最新节点时,整个列表才会保留。
我知道问题出在最后:
phead=i;
return phead;
但我不知道如何解决它,因为我没有找到任何可以帮助我的东西,尽管我确信很容易知道它为什么是错误的。
struct ItemNode *modify1Item(struct ItemNode *phead){
int modID;
int lfound=0;
int lID;
char lDesc[30];
char lName[30];
double lUPrice;
int lOnHand;
struct ItemNode *i=phead;
printf("Enter the ID of the item that you want to modify\n");
scanf("%d", &modID);
while(i != NULL){
if(i->ID == modID){
break;
}
i= i->next;
}
if(i==NULL){
printf("An item with that ID wasn't found.\n");
return 0;
}
else{
printf("Enter new Name\n");
scanf("%s", lName);
strcpy(i->name, lName);
printf("Enter new Description\n");
scanf("%s", lDesc);
strcpy(i->desc, lDesc);
printf("Enter new Unit Price $\n");
scanf("%lf", &lUPrice);
i->uPrice = lUPrice;
printf("Enter new Number of Items On Hand\n");
scanf("%d", &lOnHand);
i->onHand = lOnHand;
}
phead=i;
return phead;
}
当我返回它时,我说 head=modify1Item(phead);
【问题讨论】:
-
让我先提出一些建议。不要将您的链表管理功能与用户提供的输入操作混用。两者应保持分开。用户想要提供一些数据来对列表执行一些操作,该数据的获取和执行的操作应该是分开的。获取该数据,然后将其提供给您的链表函数以执行所需的操作。它显着整理了您的链表函数代码,并显着增加了在开发过程中隔离问题的机会。
-
也就是说,这个函数只修改现有项目。这个函数的调用者,以及他们如何处理结果,将会很重要。我敢打赌它类似于
head = modifyItem(head);,这是错误的,但这只是一个摇摆(wild-arse-guess),因为我们没有所需的minimal reproducible example。 -
今晚我的水晶球多云,但表明列表最初是在没有正确分配每个节点的情况下填充的,或者通过为每个节点分配相同的指针。我一直在摇球,但没有MCVE,它仍然是阴天。
标签: c pointers linked-list nodes