2 yzn77 yzn77 于 2016.03.13 10:52 提问

单链表更新头元素的问题

划短线哪句说只更新了头元素指针的本地副本是什么意思?上边那个不带*,下边那个带*,有什么区别?求各位大神帮忙解答图片

1个回答

cxsmarkchan
cxsmarkchan   2016.03.13 11:12
已采纳

C/C++的参数传递方式是值传递。可以用一个更简单的例子来说明:

void swap(int a, int b){
    int tmp = a;
    a = b;
    b = tmp;
}
int main(){
    int a = 1, b = 2;
    swap(a, b);
    cout << a <<" " << b;
    return 0;
}

我们希望结果是"2 1",但返回的结果是"1 2"。这就是所谓值传递,调用swap(a, b)是,并不是把a和b传进swap了,而是把a和b各自复制了一份(称为副本,也就是书上所说的本地副本),再传进去。你把这个副本交换了,但原来的a和b并没有被交换。
一种解决方案是:

void swap(int* a, int* b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
int main(){
    int a = 1, b = 2;
    swap(&a, &b);
    cout << a <<" " << b;
    return 0;
}

这段代码是可以正常工作的,因为函数的参数是指针,指针所标志的是内存地址。例如,a在内存中的位置是0x1234,b内存中的位置是0x4321,那么传进去的就是0x1234和0x4321(当然,也是把这两个“数”复制了一份传进swap)。swap函数做的事情,是把0x1234和0x4321两个地方所存的数交换一下,那么a和b的值就被交换了。
结论:如果你要修改一个元素,那么就应该传递这个元素的指针。
问题是:如果你要修改的元素就是一个指针呢?
答案是:传递指针的指针,这就是正确代码中为IntElement** head的原因。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
单链表(带或不带头结点)的建立、反转和部分反转
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。从上可知:链表中的元素在内存中是不连续的存储,每个结点只能也只有它能知道下一个结点的存储位置。单链表是线性表链式存储的一种,其存储不连续。它的数据结构中包含两个变量:数据和指向下一个结点的指针。每个结点(尾结点除外)都只知道
设head为单链表的头指针,将单链表中元素按递增顺序就地排列
设head为单链表的头指针,并设单链表带有头结点,编写算法将单链表中的数组元素按照其值递增有序的顺序进行就地排列
作业三 单链表
单链表:
单链表显示的时候,链表头元素没有显示出来
首先,必须清楚链表在构造的时候,头结点是否使用,也就是说头结点是否就是第一个结点。如果头结点数据为空,使用以下的访问格式: LinkNode* p=head->next; //头结点是不可用结点,故应该使用p=head->next while(p!=NULL) { coutdata<<" "; p=p-
头插法建立单链表 c
头插法建立单链表 c
链表插入与删除操作中的头、尾指针
[题目]:有一个单链表,它的元素全部是整数。head和tail分别是指向该链表第一个元素(即头元素)和最后一个元素(即尾元素)的全局性指针。请实现调用接口如下所示的两个C语言函数:                                                   int Delete (element *elem);                                
单链表、头指针、头结点、首元节点
链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。 这里有个地方要注意,就是对头指针概念的理解,这个很重要。“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针。画一个图吧。   头指针就是链表的名字。头指针仅仅是个指针而已。 头结点是
已知头指针分别为la和lb的有序单链表,其数据元素都是按值非递减排列。现要归并la和lb得到单链表lc,使得lc中的元素按值非递减排列。
    已知头指针分别为la和lb的有序单链表,其数据元素都是按值非递减排列。现要归并la和lb得到单链表lc,使得lc中的元素按值非递减排列。主程序:#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; typedef int ElemType; typedef struct SingleNode{ ElemType data; struct Si...
C/C++学习(七)单链表的头插法,尾插法,元素插入、删除和查找 .
链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的。在C语言中,链表是通过指针相关实现的。而单链表是链表的其中一种,关于单链表就是其节点中有数据域和只有一个指向下个节点的指针域。创建单链表的方法有两种,分别是头插法和尾插法。所谓头插法,就是按节点的逆序方法逐渐将结点插入到链表的头部。反之尾插法就是按节点的顺序逐渐将节点插入到链表的尾部。相对来说,头插法要比尾插法算法简单,但是最后产生
取单链表倒数第k个元素
【版权声明:转载请保留出处:blog.csdn.net/algorithm_only。邮箱:liuy0711@foxmail.com】 1. 算法要求 已知一个带有表头结点的单链表,结点结构为 typedef struct lnode { elemtype data; struct lnode *next; }lnode, *linklist;假设该链表只给出了头指针l.在不