C++中函数传参 * &x 和 &x 的区别 使用链表举例说明 看完就懂

我们用头插法建立单链表来说明函数参数中LNode* &LLNode* 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,两种写法是等价的(因为链表结构体声明时有这两种不同的方式)

大家可以复制代码运行理解理解,一定要动手理解

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值