我在Kochan编写的C编程的第10章中与练习4斗争。
任务如下:
编写一个名为
removeEntry()
的函数来删除一个条目 链表。该过程的唯一参数应该是指向 列表。有功能删除指向后的条目 通过论证。
由于某种原因,该功能无法正常工作。如果我在其中执行了printf()
,它似乎可行,但它在main()
中无效。我认为,鉴于我传递了一个指针,它将改变原始(而不是传递值)。但很明显,我做得不对。谁能帮我看看我哪里出错?
// Function to remove an entry from a linked list
#include <stdio.h>
struct entry
{
int value;
struct entry *next;
};
int main(void)
{
struct entry n1, n2, n3; // Original list
struct entry *listPointer = &n1; // List pointer set up for iterating list
void removeEntry(struct entry *pList);
//listHead.next = &n1; set list head to point to original beginning of list
n1.value = 100;
n1.next = &n2;
n2.value = 200;
n2.next = &n3;
n3.value = 300;
n3.next = (struct entry *) 0; // marks end of list
// Print out values before removing entry
printf("Before removing entry:\n");
while (listPointer != (struct entry *) 0)
{
printf("%i\n", listPointer->value);
listPointer = listPointer->next;
}
// reset listPointer to point to n1
listPointer = &n1;
// run function (DOES NOT WORK)
removeEntry(listPointer);
// print out values after (supposedly) removing entry
printf("\n\nAfter removing entry:\n");
while (listPointer != (struct entry *) 0)
{
printf("%i\n", listPointer->value);
listPointer = listPointer->next;
}
return 0;
}
/********************* REMOVE ENTRY ********************************/
void removeEntry(struct entry *pList)
{
// <-------&n2
pList = pList->next;
}
答案 0 :(得分:0)
您的代码中存在三个误解:
首先,正如kaylum在他的评论中所提到的,函数参数是用C中的值传递的。这意味着无论何时将参数传递给函数,都会在函数中使用参数的副本。当函数返回时,此副本将丢失。因此,您无法按照自己的意愿在pList
内更改removeEntry()
的值。
第二个问题(以某种方式链接)是你的函数removeEntry()
应该删除函数参数指向的条目之后的条目。因此,如果pList
指向一个条目,则应删除pList-&gt; next指向的条目。如果你这样做,你将同时解决你的第一个问题......
第三个问题是,在删除之前,应检查要删除的元素是否存在。最后,释放与您删除的元素对应的内存,但在您的情况下,这不适用,因为您不动态分配条目。
答案 1 :(得分:0)
耶!感谢kaylum和Heyji,我终于成功了!谢谢你们两个!
C总是很有趣,问题看起来如此困难,当你想出来的时候,你想知道你怎么会遇到如此简单的事情......
void removeEntry(struct entry *pList)
{
struct entry *pTemp = pList->next;
// <-------&n3
pList->next = pTemp->next;
}