【问题标题】:Inserting and deleting a node in linked list在链表中插入和删除节点
【发布时间】:2015-10-18 23:07:59
【问题描述】:

我正在学习 C 中的结构,并且有两个关于我的代码的问题:

1) 为什么insert()方法会显示这些错误?:

|44|error: incompatible types when returning type 'void *' but 'ListNode' was expected|
|47|error: incompatible types when returning type 'struct Node *' but 'ListNode' was expected|

在行中:

 if(current -> next == NULL){
            printf("The node was not found!");
            return NULL; //<<<<<-----------------SHOWS ERROR HERE Line #44
 }

return newNode; //Line #47 

2) 我已经为delete() 节点编写了代码,但感觉代码可能有问题。如何通过 C 中的main() 方法测试/运行程序:)??

3) 如何在printList() 方法中打印任意类型的变量?

很抱歉问这些新手问题! 谢谢!

注意:程序可以接受任何数据类型,head* 是一个虚拟节点!

【问题讨论】:

    标签: c struct linked-list


    【解决方案1】:

    1) 您需要将NULL 转换为正确的返回类型。所以,return (ListNode *) NULL

    您可能希望将该函数的返回类型更改为ListNode *。如果你真的想返回struct,那么返回NULL 是行不通的,所以你需要返回一个空的ListNode struct

    2) 要测试delete 是否有效,创建一个非平凡的链表,打印内容,调用delete(),再次打印内容以确保该节点确实被删除.

    如果更新指针出现问题,您可能会在某处得到一个空指针,并且无法正确地遍历列表。

    3) 首先,printf 在您的情况下应该有两个参数:more info。第一个是格式字符串,它基本上告诉它类型,第二个是实际变量。

    您需要知道要打印的类型。您需要将void *data 转换为正确的指针,然后取消引用。 C 无法知道你想要什么。

    printf("%d\n", *(int *)mydata);
    

    【讨论】:

    • 感谢@Pushkin 的回复!对于 3) 我如何检查数据的类型?例如,在 Java 中,如果 data instanceof String then cast,我会这样做。 C中的命令是什么?谢谢!
    • instanceof 在面向对象编程的上下文中是相关的。然而,C 不是 OOP 语言,也没有类的概念。 data 的类型是 void *,因为这是您将其传递给函数的方式。同样,C 不知道它是否“真的”是一个 int、char 或其他任何东西。它所知道的是它是void *,因为这就是你告诉 C 的。你不能比猜测它的类型更好。 C 帮不了你。
    • 要么重新定义结构以允许它接受多种类型(但明确地),所以int * i_data; char *c_data; ...(虽然这不是很优雅)。或者只是选择一种类型并坚持下去。 char * 在这里可能是个好主意。您可以检查 char *data 是否可以“强制转换”为整数。如果不是,那么它是一个字符串,如果可以,那么也许将它视为一个 int。
    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多