我正在用C编写一个基本的链表程序,删除时遇到一些麻烦。 这就是我所拥有的:

#include <stdio.h>

struct node * delete(struct node * head, struct node * toDelete);
void print(struct node * head);

struct node {
    int value;
    struct node *next;
};

int main(int argc, const char * argv[]) {

    struct node node1, node2, node3;
    struct node *head = &node1;

    node1.value = 1;
    node1.next = &node2;

    node2.value = 2;
    node2.next = &node3;

    node3.value = 3;
    node3.next = (struct node *) 0;

    print(head);

    delete(head, &node3);

    print(head);

    return 0;
}

struct node * delete(struct node * head, struct node * toDelete) {
    //if to delete is head
    if (head == toDelete) {
        head = head->next;

    } else {
        //find node preceding node to delete
        struct node *current = head;
        while (current->next != toDelete) {
            current = current->next;
        }
        current = current->next->next;
    }
    return head;
}

void print(struct node * head) {
    struct node *current = head;

    while (current != (struct node *) 0) {
        printf("%i\n", current->value);
        current = current->next;
    }
}

问题1:所以我试着写:

delete(head, node3);

但xCode希望我在“node3”前添加“&”。 通常情况下,当我定义一个函数来获取指针时,我需要传入内存地址吗?

问题2:

我的打印功能用于打印出3个节点的值。 在调用delete并尝试删除node3之后,它仍然打印出3个节点。 我不确定我哪里出错了。 我找到了我要删除的节点之前的节点,并在节点之后设置其下一个指向节点的指针(非正式地:node.next = node.next.next)。

有任何想法吗?

谢谢你的帮助,bclayman

===============>>#1 票数:7

but xCode wanted me to add "&" in front of "node3". Is it generally true that
when I define a function to take a pointer, I need to pass in the memory 
address?

是的,如果你声明函数采用指针,你必须传递一个指针。

此外,当从链表中删除值时,您将要更改

current->next = current->next->next

===============>>#2 票数:6

你应该传递它&node3 要删除,请从current = current->next->next;更改您的代码current = current->next->next; to current->next = current->next->next;

===============>>#3 票数:4

试试改变current = current->next->next; current->next=current->next->next 如果它不起作用,请告诉我。

===============>>#4 票数:4 已采纳

通常情况下,当我定义一个函数来获取指针时,我需要传入内存地址吗?

是的,xCode是对的。 node3是一个struct node ,但是你的函数deletestruct node *作为第二个参数,所以你必须将指针传递给node3 ,而不是变量本身。

在调用delete并尝试删除node3之后,它仍然打印出3个节点。

这是因为你没有改变next的价值。 另外,为了保护内存,请不要忘记检查指针是否为NULL

while ((current->next != toDelete) && (current->next != NULL)) {
    current = current->next;
}
if (current->next != NULL)
    current->next = current->next->next;

  ask by bclayman translate from so

未解决问题?本站智能推荐:

2回复

C中的链接列表

此功能用于在列表的开头添加新项目。 我怀疑的是,在大多数书中,涉及链表的函数函数使用指向节点结构的指针而不是结构本身的实例。 是否有理由首选形式的功能或两种方法同样好?
3回复

C中的链接列表

我有一个程序(我正在尝试解决的示例的一部分),该程序从文本文件( bus.txt )中读取一个值,然后针对这些座位数初始化作为链表的结构的值。 所有这些都是在函数内部完成的,我希望链表在函数外部可用。 然后,我想打印出结果,但似乎无法设法找到解决方案。
1回复

C中的链接列表

尽管这不是我课程的要求,但我正在尝试实现单链表和双链表,以确保我理解这些概念。 我已经制定了大部分我认为除了那我试图调试和一个问题printf我的出路。 尽管我阅读了不同的文章,但我无法找出它们为什么不能以类似的方式工作。 一个我的插入函数,当while(h != NULL)踢出时我必
1回复

C中的链接列表

我仍然是C语言列表中的新手,但是我遇到了一个大问题……首先,我想向您展示将项目插入列表的代码: 这是我的主要功能: 最后可能是打印功能的问题: 我的问题是,当我运行该应用程序时,程序运行良好。 但是,当我启动该应用程序时,该程序仅存储第一个输入的数据,第二个和第三个丢失
1回复

C中的链接列表

这是我尝试完成的用于构建链接列表的代码的摘录。 由于某种原因,在尝试编译代码时,我不断收到错误“错误:期望的';',标识符或'('在'struct'之前'。”有人可以帮帮我吗。
2回复

C中的链接列表

我在运行此链表实现(包含单词作为数据)时遇到了一些问题。 问题是当我尝试在链接列表中打印单词(我插入的单词)时,我什么都没得到。 我做错了什么,打破了我的头脑? 我希望这不是什么傻事。 无论如何这里是代码 -
1回复

链接列表中的链接列表

我正在尝试创建(有序)链接列表的(有序)链接列表。 list-of-list链接由其成员列表的第一个节点承载。 我试图通过以下代码实现这一点,但我尝试将第二个节点插入列表列表后,我的程序崩溃了。 这是我想要构建的数据结构的示意图: 码: 是什么导致了我的错误?
1回复

C中的Malloc链接列表

我是C的新手。我需要使用malloc在c中创建一个链表,我应该在struct list * solution()中创建我的解决方案。 给定数字列表,我需要它们显示直到给出int -1为止。 创建链表后,返回一个指向链表根节点的指针。到目前为止,我只能在程序执行后看到一个数字。 我希望
1回复

在C中删除链接列表

在下面,我正在创建一个链表,然后尝试将其删除,但是该程序将编译并运行,但是对我来说链表将不会删除,并且该程序会陷入循环或其他状态(基本上它不会在应该终止时终止)我必须手动杀死它) 任何人都可以建议我哪里出了问题,在编写“ deletePoly”函数之前,一切都很好(例如,程序可以编译并运行
1回复

C中的范围和链接列表

我试图在C语言中更轻松地构建和使用链接列表,并且在大多数情况下,我认为我的基础知识有所下降。 但是,我遇到了有关范围的问题,特别是指针与结构指针的链接。 在我的linked_list.c实现中,我正在使用一个main功能来测试并试用我构建的链接列表功能。 但是最终的目标是从另一个文件运