已解决|链表之2181合并零之间的节点
1207
2023.03.02
2023.03.04
发布于 未知归属地
 struct ListNode*newhead=(ListNode*)malloc(sizeof(ListNode));

shimizu大佬指出:
因为你现在的库里没有ListNode这个类型,有的是struct ListNode,如果想不加这个struct的话请用typedef声明

struct ListNode*newhead=(struct ListNode*)malloc(sizeof(struct ListNode));

错误信息:
image.png
solution.c: In function ‘mergeNodes'
Line 12: Char 30: error: 'ListNode' undeclared
翻译成中文就是
在函数'mergeNodes'
12行,30字符处出错了:'ListNode'没有声明

查到的参考资料:
https://blog.csdn.net/sfbpwx/article/details/103532478
(但是是C++,小白只会C)

可以通过的源代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


 //感悟:代码一次运行不对是正常,失败也是正常的,敢于这样去思考,去写代码,去运行代码
 //就已经非常棒了,人类就是在不断失败中进步的

struct ListNode * sumMove(struct ListNode*p,int*sum);
void add(struct ListNode*n,int sum);

struct ListNode* mergeNodes(struct ListNode* head){
    struct ListNode*p=head,*q;
    //struct ListNode*newhead=(ListNode*)malloc(sizeof(ListNode));用typedef才可以这样写
    struct ListNode*newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    int sum;
    struct ListNode*n=newhead;
    while(p->next!=NULL){
    sum=0;//小细节,勿被链表难度而击垮
       q=sumMove(p,&sum);//q变为快指针,要把q放到恰好是val为0的位置
       p=q;//慢针跟上
       add(n,sum);//在newhead后面接新的,用指针n来实现接续newhead尾部的目的 
       n=n->next;//为下一次添加到newhead链表做准备
    }
    n->next=NULL;
    return newhead->next;
}
struct ListNode* sumMove(struct ListNode*p,int*sum){//函数参数漏了一个struct,要仔细看位置
    p=p->next;//避开刚开始是0的值
    while(p->val!=0){
        *sum+=p->val;
        p=p->next;
    }
    return p;
}
//改一级指针的值,也就是改指针的指向,才需要传二级指针
void add(struct ListNode*n,int sum){
    struct ListNode*s=(struct ListNode*)malloc(sizeof(struct ListNode));
    s->val=sum;
    n->next=s;
}

总结:
①链表题(或者说有结构体的题,用到这些名字的题,比如malloc会用到)就要十分小心名字的叫法,确认有木有使用typedef。
②力扣中允许在目标函数之前进行函数声明。如果不声明也是会报错的。特别是相互调用的话声明一下就可以了。
③不用乱传二级指针,如果不改变一级指针的指向,那么就不必对一级指针真再去星号
④要对next,prior的含义有所理解,这种写法是顾名思义的,不必给自己搞得很累。

感谢大佬们的指导!

评论 (4)