为啥在建立单向链表时要用到 指针类型的引用参数 ,而在遍历链表时用指针参数就可以了???

 我来答
吴道子2011
2017-01-09 · TA获得超过1107个赞
知道小有建树答主
回答量:439
采纳率:0%
帮助的人:378万
展开全部
就以这个结构体来说
typedef struct Node

{
int data;

struct Node *next;
}Node, *LinkList; /* 定义LinkList */
这是建立链表函数,也就是链表初始化函数, InitList1是直接传指针,而不是指针的引用或二级指针
int InitList1(LinkList L) //等价于Node *L

{ L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */

if(!L) /* 存储分配失败 */

return 0;

L->next=NULL; /* 指针域为空 */

return 1;
}
int main()
{
LinkList L;

InitList1(L);//这里注意了,你的L是个Node *的指针,也就是LinkList型的,而 InitList1函数也是接受LinkList型,InitList1函数中接受的其实是L的一份拷贝,修改的是这份拷贝,也就是说你申请的Node空间地址给了InitList1函数中的那个L的拷贝,InitList1函数执行完,那个拷贝就销毁了,所以申请的空间就泄露了,而main中的L就一脸懵逼,创建失败。并没有修改main函数中的L,所以要通过传入L的引用或L的指针,因为L本身就是个指针,所以也就是传入指针的引用或二级指针。
}

如下面所示
int InitList2(LinkList &L) //传入L的引用

{ L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!L) /* 存储分配失败 */
return 0;
L->next=NULL; /* 指针域为空 */
return 1;
}
int InitList3(LinkList *L) //传入L的指针,也就是二级指针

{ *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!(*L)) /* 存储分配失败 */
return 0;
(*L)->next=NULL; /* 指针域为空 */
return 1;
}

至于你说的遍历、插入、删除都可以传指针,也就是直接传入L即可,因为就算是传入的是L的拷贝,你也可以根据这个拷贝的L->next走遍这个链表,到具体的地方插、删。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式