在c中删除链表中的条目的功能

时间:2016-11-02 19:44:36

标签: c pointers linked-list

我在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;

}

2 个答案:

答案 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;

}