• 链表的插入问题


    BUG:

    今天我写了一个很SB的代码,这个问题其实我早己注意到,在以前写这样的代码的时候,我也留了个心眼,但可能是
    很长时间不写这些东西导致新问题的产生。
    其实这个问题我以前也写过笔记,现在再写一下加深印象。
    先附代码:
    1. #ifndef LIST_INSERTREMOVEPRINT_H
    2. #define LIST_INSERTREMOVEPRINT_H
    3. #include<iostream>
    4. struct ListNode{
    5. int val;
    6. struct ListNode *nxt;
    7. };
    8. void addListNode(struct ListNode*list,int value){
    9. struct ListNode *nodeInsert=(struct ListNode*)(malloc(sizeof(struct ListNode)));
    10. nodeInsert->val=value;
    11. nodeInsert->nxt=NULL;
    12. if(list==NULL){
    13. list=nodeInsert;
    14. return ;
    15. }
    16. struct ListNode *iter=list;
    17. while(iter->nxt!=NULL){
    18. iter=iter->nxt;
    19. }
    20. iter->nxt=nodeInsert;
    21. }
    22. #end
    其实熟悉的人一看就知道问题出在哪了!!!!!
    高亮部分就说明了这个问题。犯这个错误的原因在于对指针的传递不太明白。
    1. void addListNode(struct ListNode*list,int value)
    在这个函数中有两个形参,一个是链表节点的指针类型,别一个是int 型啰。
    对于这个链表节点指针,我们传入的是什么呢?当然,传入的是一个地址嘛,因为它是指针。
    嗯,我们是如何传递这个指针的呢,传值嘛!!!!!!!。你传递地址还是传值啊,只是这个值是”地址“而己嘛。
    既然明白这点,那么问题来了,你在函数体内改这
    1. list=nodeInsert
    你这个是什么意思啊?,,,把这个nodeInsert地址付值给list ?
    也就是你有这么个函数
    1. void test(int a,int value){
    2. int c;
    3. a=c;
    4. }
    你这是什么意思? 你还真想通过在函数体内的a=c 来改变实参值吗? 滚你妈的。
    1. iter->nxt=nodeInsert;
    这个就更扯蛋了,你还是在改变形参中的值,这个肯定不行啦。

    如何解决这个BUG

          1,  如果要通过形参改变实参,对于这个地址的传值问题,可以通过 "*" -----解引用运算符。
           也就是我们通过这个解引用这个形参,这样找到形参地址对应的空间,在内存里面改变这个实叁的值。
           2,传入指针的指针,再用解引用运算符。
           反正得解引用才能通过形参改实参!!!!!!
          





  • 相关阅读:
    Matlab实现bwlabel函数(区域标记)功能
    Matlab实现medfilt2函数功能
    Matlab实现基于频域对二维信号的低通滤波
    Matlab实现基于频域对一维信号利用傅里叶低通滤波平滑
    Matlab实现直方图规定化
    Matlab实现直方图均衡化
    Matlab实现imresize函数功能
    lc279贪心
    lc347 解法
    numpy中的np.mat(1)
  • 原文地址:https://www.cnblogs.com/yml435/p/4655455.html
Copyright © 2020-2023  润新知