链表的插入问题

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,传入指针的指针,再用解引用运算符。

反正得解引用才能通过形参改实参!!!!!!

来自为知笔记(Wiz)

时间: 2024-10-18 11:58:01

链表的插入问题的相关文章

pta 数据结构 习题2.4 递增的整数序列链表的插入(15 分)

习题2.4 递增的整数序列链表的插入(15 分) 本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性. 函数接口定义: List Insert( List L, ElementType X ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; type

数据结构Java实现03----单向链表的插入和删除

数据结构Java实现03----单向链表的插入和删除 文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构:            概念: 链式存储结构是基于指针实现的.我们把一个数据元素和一个指针称为结点.   数据域:存数数据元素信息的域. 指针域:存储直接后继位置的域. 链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来.链式存储结构的线性表称为链表. 链表类型: 根据链表的构造方式的不同可以分为: 单向链表 单向循环链表 双向循环链表 二

链表算法-链表前面插入节点

链表算法-链表前面插入节点

LeetCode-Sort List,链表排序(插入和归并),时间复杂度O(n^2) and O(nlgn)

题目: 1.Sort a linked list using insertion sort 2.Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 3.Sort a linked list in O(n log n) time using constant space

编程算法 - 有序双循环链表的插入 代码(C)

有序双循环链表的插入 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 有序双循环链表的插入, 需要找到插入位置, 可以采用, 两个指针, 一个在前, 一个在后. 保证前面的小于等于插入值, 后面的大于等于插入值. 特殊情况, 首尾插入(大于或小于整个链表)或单节点, 判断条件为后指针指向首节点. 则需要直接插入. 插入链表头, 需要调整链表头节点. 代码22行. 代码: /* * main.cpp * * Created on: 2014.9.18

链表中插入一个节点的三种情况

在链表中插入一个元素可以分为三种情况: 1.在节点的时候 2.在链表中间的任意位置 3.在链表的最后位置,也可以认为这种情况为追加(这个就留到追加的时候来实现) 下面是代码的实现 SN *Insert_S_Node( SN *head ) /* 传入的参数是被插入链表中的头指针 */ { SN *Insert_Node=NULL, *Dest_Node = NULL; /* Insert_Node是将要做成的新链表中的节点 Dest_Node是要插入的节点*/ INT32 OSM = 1, i3

有序链表的插入操作

C语言教材的有序单链表程序的插入我并不满意,因为链表为空,表尾等原因导致有四种情况要处理,给同学们的阅读造成困难.书上的做法较复杂的一个原因是链表是不带头结点的,所以要考虑新结点插入时会不会变成表头, 例如:当链表为空时, 插入3, 3变成表头,  再插入1, 链表为1->3, 链表头指向1, 代码必须处理这样的情况. 第一部分: 不含头结点的链表插入的非常规思路 下面我给出另外一个思路,新结点一律插入表头,这样就不要考虑链表为空的情况了.但是可能无序,可以从表头开始,相邻节点不符合次序要求交换

链表的插入、删除

结构体: 1 typedef struct Student{ 2 int m_val; 3 struct Student* m_next; 4 }NODE,*pNODE; 链表的插入: 1 //尾部插入 2 void linkInitTail(pNODE* pphead) 3 { 4 int val; 5 pNODE pNew,pTail; 6 while(scanf("%d",&val) == 1) 7 { 8 pNew = (pNODE)calloc(1,sizeof(NO

单链表顺序插入

向单链表中插入新元素,并保证插入后,元素是有序的. [程序实例] 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 bool sll_insert(ListNode **root, int value) 8 { 9 ListNode *PrevNode =NULL; 10 ListNode *Current = *root; 11 12 while (Current!=NULL && Current->val<

带头节点的单链表的插入操作

1.偶然看到了十字链表的应用,想到之前在<数据结构与算法分析>的链表一章中,需要用多重表实现一个简单的查询功能.功能需求如下: “已知 学生 和 学校课程 总数 分别为 40000 和 2500,现在需要得到两份报告,一份显示每门课成注册的所有学生信息, 一份显示每个学生注册了哪些课程.” 显然可以用一个 40000 * 2500 个元素的二维数组来解决,但是每个学生选课数目很少,因此会浪费很多空间.因此选择十字链表来实现. 既然是链表,那么肯定要有插入操作,于是便有了本文.算是对功能实现前的