关于数据结构单链表的方法中的参数(LinkList L)和(LinkList &L)的区别

本文探讨了在C++中处理链表时,如何正确使用指针参数。创建链表时,如果要改变链表头指针(如`L`)的值,函数参数需为`LinkList& L`,否则无法改变原始指针。而遍历链表时,`L`或`&L`均可。示例代码展示了不同参数传递方式对链表操作的影响。
#include<stdio.h>

#include<stdlib.h>

typedef struct LNode{

int data;

struct LNode *next;

}LNode,*LinkList; 

需要知道的是LinkList类型是一个指针,指向的是LNode结构体。

当需要对L本身的值进行改变时(就是L指向一个新的地址),就需要传的是LinkList   &L

如果传的是L那么不能改变L只能改变L所指向的内容

例如:

方法参数是L: 

void CreateList(LinkList L){

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

int i=1;

while(i!=2020){

scanf("%d\n",&i);

LNode *p;

p=(LNode *)malloc(sizeof(LNode));

p->data=i;

p->next=L->next;

L->next=p;

}

printf("输入结束\n"); 

}

int main(){

LinkList L=NULL;

CreateList(L);

LNode *p=L->next;

while(p!=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

return 0;

} 

 

什么都没有,意思是L还是NUll因为这样传递只能改变L指向的节点,不能改变L本身。

方法参数是&L:

void CreateList(LinkList &L){

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

int i=1;

while(i!=2020){

scanf("%d\n",&i);

LNode *p;

p=(LNode *)malloc(sizeof(LNode));

p->data=i;

p->next=L->next;

L->next=p;

}

printf("输入结束\n"); 

}

int main(){

LinkList L=NULL;

CreateList(L);

LNode *p=L->next;

while(p!=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

return 0;

} 

 

 这样就会输出结果。 

对于遍历列表如何传L呢?是加&还是不加呢,代码如下:

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode{

int data;

struct LNode *next;

}LNode,*LinkList;

void CreateList(LinkList &L){//新建 链表的函数 

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

int i=1;

while(i!=2020){

scanf("%d\n",&i);//不知怎么回事,输入2020之后还需要再输一个数 

LNode *p;

p=(LNode *)malloc(sizeof(LNode));

p->data=i;

p->next=L->next;

L->next=p;

}

printf("输入结束\n"); 

}

void Bianli(LinkList &L){//遍历链表的函数 

printf("遍历列表\n"); 

LNode *p=L->next;

while(p!=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

}

int main(){

LinkList L=NULL;

CreateList(L);

Bianli(L);

} 

 可以看出如果方法的参数是&L的话是可以遍历的; 

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode{

int data;

struct LNode *next;

}LNode,*LinkList;

void CreateList(LinkList &L){//新建 链表的函数 

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

int i=1;

while(i!=2020){

scanf("%d\n",&i);//不知怎么回事,输入2020之后还需要再输一个数 

LNode *p;

p=(LNode *)malloc(sizeof(LNode));

p->data=i;

p->next=L->next;

L->next=p;

}

printf("输入结束\n"); 

}

void Bianli(LinkList L){//遍历链表的函数 

printf("遍历列表\n"); 

LNode *p=L->next;

while(p!=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

}

int main(){

LinkList L=NULL;

CreateList(L);

Bianli(L);

} 

 如果是参数L的话也是可以遍历的 

因此可以得出结论:L

如果对列表的头指针(L)本身进行改变的话,方法的参数的是&L,不然此方法无效。如果只是改变的是L所指向的内容的话,可以是&L也可以是L。

主方法体都是方法名(L)。

其实与int指针是一样的,想改变值只能传地址,不能传变量,只是这里的变量换成了节点指针变量

https://www.bilibili.com/read/cv6146383 出处:bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值