转载-链表中LinkList L和LinkList *L的区别

typedef struct Node{

int elem;

struct node * next;

}node,*LinkList;

  

对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem;

对于LinkList *L:L是指向定义的Node结构体指针的指针,所以(*L)是指向Node结构体的指针,可以用->运算符来访问结构体成员,即(*L)->elem,当然,(**L)就是Node型结构体了,所以可以用点运算符来访问结构体成员,即(**L).elem;

对于LinkList &L;一般在做形参的时候用,是引用传递,它和传指针的作用一样,可以起到修改链表的效果。

在链表操作中,我们常常要用链表变量作为函数的参数,这时,用LinkList L还是LinkList *L就很值得考虑深究了,一个用不好,函数就会出现逻辑错误,其准则是:
1.如果函数会改变指针L的值,而你希望函数结束调用后保存L的值,那你就要用LinkList *L,这样,向函数传递的就是指针的地址,结束调用后,自然就可以去改变指针的值;  也可以考虑使用引用传递。
2.如果函数只会修改指针所指向的内容,而不会更改指针的值,那么用LinkList L;

下面说个具体实例吧!

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct Node
{
 ElemType elem;
 struct Node * next;
}Node, * LinkList;

//初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用*L

void InitList(LinkList *L)
{
 *L = (LinkList)malloc(sizeof(Node));
 (*L)->next = NULL;
}

//引用传递

 void InitList(LinkList &L)

{

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

(*L)->next=NULL;

}

//清空链表L,使L重新变为空链表,函数调用完后不会改变指针L的值,只会改变指针L所指向的内容(即L->next的值)

void ClearList(LinkList L)
{
 LinkList p;
 while(p = L->next)
  free(p);
}

 

//销毁链表L,释放链表L申请的内存,使L的值重新变为NULL,所以会改变L的值,得用*L

 void DestroyList(LinkList *L)
 {
   LinkList p;
   while(p = (*L)->next )
   free(p);
   free(*L);
   *L = NULL;
 }
 

void main()
 {
 LinkList L = NULL;
 InitList(&L);
 ClearList(L);
 DestroyList(&L);
}
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值