链表的插入问题

it2025-12-30  11

BUG:

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

如何解决这个BUG

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

转载于:https://www.cnblogs.com/yml435/p/4655455.html

相关资源:数据结构—成绩单生成器
最新回复(0)