我正在使用C&#39编程进行练习。
我必须创建一个链表,然后创建一个删除条目的函数。
我设法做到这一点没有太多问题。但是,这个练习特别要求我只用一个参数来做这件事。我无法弄清楚如何做到这一点。
这是练习:"编写一个名为removeEntry()
的函数来从链表中删除一个条目。该过程的唯一参数应该是指向列表的指针。让函数删除参数之后的条目。"
我的代码如下所示,正如您所看到的,我已经使用了两个参数。我怎么可能分配下一个值,以便在不使用两个值的情况下删除中间的值?我重新阅读了本书中的所有内容,搜索了此网站并广泛使用了Google,但我仍然无法解决这个问题。
谢谢。
#include <stdio.h>
struct entry
{
int value;
struct entry *next;
};
void removeEntry(struct entry *start, struct entry *remove);
int main (void)
{
//declarations
struct entry n1, n2, n3;
struct entry *list_pointer = &n1;
//creates list values and links
n1.value = 100;
n1.next = &n2;
n2.value = 200;
n2.next = &n3;
n3.value = 300;
n3.next = (struct entry *) 0;
//prints out all list values
while(list_pointer != (struct entry *) 0)
{
printf("%i\n", list_pointer->value);
list_pointer = list_pointer->next;
}
//resets list_pointer back to start
list_pointer = &n1;
//calls function and removes n2 from list by directly linking n1 to n3
removeEntry(&n1, &n3);
//print out amended list
while(list_pointer != (struct entry *) 0)
{
printf("%i\n", list_pointer->value);
list_pointer = list_pointer->next;
}
return 0;
}
void removeEntry(struct entry *start, struct entry *remove)
{
start->next = remove;
}
这是我的练习代码10.3。
虚拟结构是struct entry *list_pointer = &n1;
,用于在整个程序中引用列表的开头。
#include <stdio.h>
struct entry
{
int value;
struct entry *next;
};
void insertEntry(struct entry *addOn, struct entry *element);
int main (void)
{
struct entry n1, n2, n3, addOn;
struct entry *list_pointer = &n1;
n1.value = 100;
n1.next = &n2;
n2.value = 200;
n2.next = &n3;
n3.value = 300;
n3.next = (struct entry *) 0;
while(list_pointer != (struct entry *) 0)
{
printf("%i\n", list_pointer->value);
list_pointer = list_pointer->next;
}
list_pointer = &n1;
insertEntry(&addOn, &n1);
list_pointer = &addOn;
while(list_pointer != (struct entry *) 0)
{
printf("%i\n", list_pointer->value);
list_pointer = list_pointer->next;
}
return 0;
}
void insertEntry(struct entry *addOn, struct entry *element)
{
//element->next = addOn;
addOn->value = 400;
addOn->next = element;
//addOn->next = (struct entry *) 0;
}
答案 0 :(得分:1)
我认为这是你正在寻找的东西:
void removeEntry(entry *start){
if(start->next != NULL) {
start->next = start->next->next;
}
//else you can't really remove the next one, probably log or something then
}
答案 1 :(得分:1)
作为替代方案,由于您的练习基本上要求您始终删除第一个元素,因此您只需要更新列表指针以指向节点后面的节点“被删除”。你的原型:
void removeEntry(struct entry **start);
在main()中,调用:
removeEntry(&list_pointer);
您的函数传递列表指针的地址(因此可以更新):
void removeEntry(struct entry **list)
{
if (*list)
(*list) = (*list)->next;
}
我应该补充一点,这假设list参数始终是一个有效的指针。
答案 2 :(得分:1)
您没有包含本书为本练习提供的所有信息。
Stephen Kochan的练习10.4&#C>编程C,第4版读取:
编写一个名为removeEntry()的函数来从链接中删除条目 名单。该过程的唯一参数应该是指向列表的指针。 让函数删除之后的条目 论点。 (为什么你不能删除参数指向的条目?)你 需要使用你在练习3中设置的特殊结构来处理 从列表中删除第一个元素的特殊情况。
您需要使用练习10.3中描述的虚拟结构 - 本书中对此进行了详细解释。