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

  • Post author:
  • Post category:其他


#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



版权声明:本文为m0_57741101原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。