我们用头插法建立单链表来说明函数参数中LNode* &L
和LNode* L
的区别:
LNode* &L
不仅可以访问L
指向的区域,而且可以直接改变L
的内容;- 但是
LNode* L
只能访问L
指向的区域
下面直接看例子
LNode* L
#include<stdio.h>
#include<stdlib.h>
//头插法建立一个单链表
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
/*
函数传参 LNode* L 表示只能访问L所指区域,不能直接修改L所指的内容
利用return L 来返回修改后的L(用S接收),但是L本身没有被修改
*/
LinkList HeadInsert(LNode* L){//头插法
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创建头结点
L->next=NULL;
printf("输入一个整数:");
scanf("%d",&x);
while(x!=9999)//输入9999时退出
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
printf("输入一个整数:");
scanf("%d",&x);
}
return L;
}
int main(){
//LNode* L; 这种写法也可以
LinkList L;
LinkList S,q;
S=HeadInsert(L);
int j=1;
q=S->next;
while(q!=NULL)
{
printf("S---结点%d:%d\n",j,q->data);
j++;
q=q->next;
}
return 0;
}
说明:
- 函数传参
LNode* L
表示只能访问L
所指区域,不能直接修改L
所指的内容 - 利用
return L
来返回修改后的L
(用S
接收),但是L
本身没有被修改
LNode* &L
#include<stdio.h>
#include<stdlib.h>
//头插法建立一个单链表
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
/*
函数传参LNode* &L,不仅可以访问L所指区域,也可以直接修改L的内容
使用地址引用&(L直接被修改)和return语句(用S来接收修改后的L);
当然这里你也可以不使用return语句,函数返回类型为void
参数也可以直接写为 LinkList &L,两种写法是等价的
*/
LinkList HeadInsert(LNode* &L){//头插法
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创建头结点
L->next=NULL;
printf("输入一个整数:");
scanf("%d",&x);
while(x!=9999)//输入9999时退出
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
printf("输入一个整数:");
scanf("%d",&x);
}
return L;
}
int main(){
//LNode* L; 这种写法也可以
LinkList L,p;
LinkList S,q;
S=HeadInsert(L);
int i=1,j=1;
q=S->next;
while(q!=NULL)
{
printf("S---结点%d:%d\n",j,q->data);
j++;
q=q->next;
}
printf("-----------------------------------\n");
p=L->next;
while(p!=NULL)
{
printf("L---结点%d:%d\n",i,p->data);
i++;
p=p->next;
}
return 0;
}
说明:
- 函数传参
LNode* &L
,不仅可以访问L
所指区域,也可以直接修改L
的内容; - 使用地址引用
&
(L
直接被修改)和return
语句(用S
来接收修改后的L
); - 当然这里你也可以不使用
return
语句,函数返回类型为void
; - 参数可以写为
LNode* &L
也可以写为LinkList &L
,两种写法是等价的(因为链表结构体声明时有这两种不同的方式)
大家可以复制代码运行理解理解,一定要动手理解