C 如何仅用一个参数重写removeString函数?

C 如何仅用一个参数重写removeString函数?,c,pointers,linked-list,arguments,C,Pointers,Linked List,Arguments,我正在做一个“用C编程”的练习 我必须创建一个链表,然后创建一个删除条目的函数 我成功地做到了这一点,没有太多问题。然而,这个练习特别要求我只使用一个参数。我想不出怎么做 这是一个练习:“编写一个名为removentry()的函数,从链表中删除一个条目。该过程的唯一参数应该是指向该列表的指针。让该函数删除该参数后面的条目。” 下面是我的代码,正如您所看到的,我使用了两个参数。我怎么可能分配下一个值,以消除中间的一个不使用两个?我重读了书中的所有内容,搜索了这个网站,并广泛使用谷歌,但我仍然无法解

我正在做一个“用C编程”的练习

我必须创建一个链表,然后创建一个删除条目的函数

我成功地做到了这一点,没有太多问题。然而,这个练习特别要求我只使用一个参数。我想不出怎么做

这是一个练习:“编写一个名为
removentry()
的函数,从链表中删除一个条目。该过程的唯一参数应该是指向该列表的指针。让该函数删除该参数后面的条目。”

下面是我的代码,正如您所看到的,我使用了两个参数。我怎么可能分配下一个值,以消除中间的一个不使用两个?我重读了书中的所有内容,搜索了这个网站,并广泛使用谷歌,但我仍然无法解决这个问题

多谢各位

#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;
}

我想这就是你想要的:

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
}

另一种选择是,由于您的练习基本上要求您始终删除第一个元素,因此您只需更新列表指针,以指向要“删除”的节点后面的节点。您的原型:

void removeEntry(struct entry **start);
在main()中,调用:

您的函数传递列表指针的地址(以便更新):


我应该补充一点,这假设list参数始终是一个有效指针。

您没有包括本练习书中所述的所有信息

Stephen Kochan第四版C语言编程练习10.4的内容如下:

编写一个名为removentry()的函数,以从链接列表中删除条目 列表过程的唯一参数应该是指向列表的指针。 让函数删除 论点(为什么不能删除参数所指向的条目?) 需要使用练习3中设置的特殊结构来处理 从列表中删除第一个元素的特殊情况


您需要使用练习10.3中描述的虚拟结构——这在本书中有详细解释。

如果条目位于数组而不是列表中,您是否能够解决该问题?如果是的话,想象一下这个解决方案会是什么样子。不,我不认为这是他们在“指针”一章之后希望我做的:)重点是思考一个你可以解决的类似问题,寻找这个问题和你试图解决的问题之间的相似之处,并推广已知的解决方案。你是上帝,谢谢。你能解释一下国际单项体育联合会声明的必要性吗?我发现该程序只处理主体。请尝试使用仅包含单个元素的条目;)(或者尝试用&n3调用它)但是一个真正的解释,如果start->next为NULL,则无法将其转换为“struct entry”,因此它没有“next”字段。因此,如果它没有“下一步”,那么在开始->下一步->下一步(因为开始->下一步是“无”且没有后续“->下一步”)时,您将有一个糟糕的内存访问。通过删除所有3个元素,我在测试该函数时遇到了一个分段错误。我相信原因是,在某个时刻,list_指针将为NULL,函数中的start变量将为NULL指针,当您根据start->next进行测试时,您崩溃了。您是什么意思?如果您传递一个空值yes,这将是一个错误的内存访问,但这是用户的错误。您可以设置一个if案例来防止(start==NULL),但我通常不会这样做。也许我认为这是一种不好的做法,double*在这方面是如何工作的?它是指向指针变量的指针,换句话说,列表指针变量的地址;这使您能够在函数中更改其值。我明白了!感谢您,muchI没有这样做:
struct entry*list\u pointer=&n1?@MattCleary程序中没有虚拟结构。练习3要求我创建一个指向列表开头的虚拟结构。这就是我所做的…@MattCleary请将你的答案发布到练习10.3并指出虚拟结构。@MattCleary练习10.3要求在列表的前面插入一个新条目。你的训练计划不能做到这一点。在正确完成练习10.3之前,您将无法完成练习10.4。
void removeEntry(struct entry **start);
removeEntry(&list_pointer);
void removeEntry(struct entry **list)
{
    if (*list)
        (*list) = (*list)->next;
}