如何只用一个参数重写我的removeString函数?

时间:2016-07-27 18:40:27

标签: c pointers linked-list arguments

我正在使用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;
}

3 个答案:

答案 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中描述的虚拟结构 - 本书中对此进行了详细解释。