博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表中LinkList L与LinkList *L 借鉴
阅读量:4657 次
发布时间:2019-06-09

本文共 1274 字,大约阅读时间需要 4 分钟。

链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别

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就很值得考虑深究了,一个用不好,函数就会出现逻辑错误,其准则是:

如果函数会改变指针L的值,而你希望函数结束调用后保存L的值,那你就要用LinkList *L,这样,向函数传递的就是指针的地址,结束调用后,自然就可以去改变指针的值;
而如果函数只会修改指针所指向的内容,而不会更改指针的值,那么用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;
}

//清空链表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;
}

int main()

{
LinkList L = NULL;
InitList(&L);
ClearList(L);
DestroyList(&L);
}

转载于:https://www.cnblogs.com/mykonons/p/5862891.html

你可能感兴趣的文章
leetcode 575. 分糖果(Distribute Candies)
查看>>
科学计算和可视化
查看>>
IOS界面篇
查看>>
php正则
查看>>
NumPy(数组计算)
查看>>
设计模式之单例模式
查看>>
集团财务治理下的信息化规划
查看>>
63.Unique Paths II
查看>>
[HNOI2015]实验比较
查看>>
搭建自动化构建
查看>>
完成评论功能
查看>>
ProjectEuler 13
查看>>
[转]基于SAML的单点登录介绍
查看>>
signer information does not match signer information of other classes in the same package
查看>>
安装mysql Install/Remove of the Service Denied!错误的解决办法
查看>>
Docker三大核心概念之镜像
查看>>
笔记:Java Socket
查看>>
poj1275 Cashier Employment
查看>>
css box-sizing以及calc()
查看>>
oracle 批量插入和批量更新
查看>>