ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构刷题day11

2022-03-25 22:03:03  阅读:172  来源: 互联网

标签:linkpointer int C++ 链表 init link day11 数据结构 刷题


C和C++的链表函数传递

关于链表,已经写了三篇博客研究了,虽然考研的数据结构并没有细致入微,但是关于书上的不同写法,我心里总是有个疙瘩。

所以今天进行一次系统的总结,彻底写清链表在C/C++中作为函数被传递的问题。

先创建结构体。

typedef struct Link
{
	int elem;
	struct link* next;
}link, *linkpointer;

定义了一个名为link的数据形式,以及一个名为linkpointer的指向link形式数据的指针。

C++

在初始化链表时,有时需要这样写:

linkpointer p;//创建一个头指针
initlink(linkpointer &q);//将头指针传入
{
    q=(linkpointer)malloc(siezof(link));
}

学数据结构只写过c的我,当时就蒙了,这&是个什么东西?取地址吗?为什么要在这里取地址啊?

我们将这一句单独摘出来看。

linkpointer &q = p;

将一个结构体指针p的值,赋予给另一个结构体指针q的地址?什么玩意儿

实际上这里的&并非取地址的意思,而是C++中的特殊用法:引用。

C++中的引用是什么意思,可以自己看教程,作者看的是:

c++中引用&的使用 http://c.biancheng.net/view/2251.html

在函数传参中使用&,相当于q与函数外的p完全等价,数据形式相同,指向同一块内存。

我们写一段C++的程序来验证这一点

#include<stdio.h>
#include<stdlib.h>
typedef struct Link
{
	int elem;
	struct Link* next;
}link, *linkpointer;

void init(linkpointer &p)
{
	printf("%d", p);
}

int main()
{
	linkpointer p;
	p = (linkpointer)malloc(sizeof(link));
	p->elem = 1;
	p->next = NULL;
	init(p);
}

经过断点调试,我们确实验证了,p和q,两者完全等价。

传入前:
    +		p	0xcccccccccccccccc {elem=??? next=??? }	Link *
传入后:
    +		q	0xcccccccccccccccc {elem=??? next=??? }	Link *
//一模一样

所以也有了我们在书上看到的写法

#include<stdio.h>
#include<stdlib.h>
typedef struct Link
{
	int elem;
	struct Link* next;
}link, *linkpointer;

void init(linkpointer &p)
{
	p = (linkpointer)malloc(sizeof(link));
	p->elem = 1;
	p->next = NULL;
	printf("%d", p);
}

int main()
{
	linkpointer p;
	init(p);
}

我说实话,这种写法挺离谱的,main函数中的linkpointer p完全是个没有意义的声明,p既没有被分配内存,结构体内也没有数据,还非要通过&这种困难的方式传递给函数。

如果没有这个&

void init(linkpointer q)
init(p);

q为形参,而p又没有任何数据,在这里就会直接报错。

The variable 'p' is being used without being initialized.

我们来看另一种情况,在对链表进行操作时的情况。

void nodeinsert(linkpointer p,int target,int element)
nodeinsert(L,target,element)

这里的L一般已经初始化过了,摘出来是这样的

linkpointer p = L;

将结构体指针L的值,即链表的地址直接赋给形参p,p也就能在函数中正确操作内存中的链表了。

C语言

接下来还有一个问题,那在C语言中,没有引用这个用法,那怎么办呢?

想信弄懂了前面的知识,这个问题也难不住你了。

我们只需要用C语言的常规方法,将变量取址,传入时多加一个*即可。

void init(linkpointer *q)
init(&p)

而在普通对链表进行操作时,和C++完全一样,直接传就完事了

void nodeinsert(linkpointer p,int target,int element)
nodeinsert(L,target,element)

总结及鸣谢

一句话总结:需要更改链表指针本身的值时,必须加&,否则不需要加。

前者是调用了完全相同的变量,后者则是新定义了一个形参指针,指向相同的内存。

严蔚敏老师版的数据结构,说是C语言,又用了C++的”引用“传参,真的搞心态。

被传参戏耍了三天,和几个同学讨论了很久,也请教了老师。今天终于是彻彻底底弄明白了,讨论了每一种情况,在此总结,也希望可以帮到你。

鸣谢
吉吉同学和鱼同学
数据结构贾老师

标签:linkpointer,int,C++,链表,init,link,day11,数据结构,刷题
来源: https://www.cnblogs.com/huigugu/p/16056878.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有