链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别
2016-04-19 18:42
483 查看
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; } void main() { LinkList L = NULL; InitList(&L); ClearList(L); DestroyList(&L); }
相关文章推荐
- java中newInstance()和new()
- SQLiteOpenHelper中的getWritableDatabase和getReadableDatabase会的区别
- 快速分解算法
- [树链剖分 线段树] BZOJ 2908 又是nand
- calcHist没有与参数列表匹配的
- STL各种类型使用总结
- Android 一张图片(BitMap)占用内存的计算 图片内存优化
- Touch ID 的简单使用
- 第七周 项目1(2) (友元函数)
- RecyclerView之ViewHolder封装实现点击、长按、headerView和多选功能
- Linux 中轻量级文本编辑器 nano
- 创业公司成长记<一>
- Android开发-API指南-<intent-filter>
- SDUT 2603:Rescue The Princess
- 一次失败的面试
- python 2.x和3.x中maketrans和translate函数的使用
- 微信公众平台消息接口开发(20)图片识别之人脸识别
- [乱搞 暴力] BZOJ 1142 [POI2009]Tab
- 从还有一个角度看大数据量处理利器:布隆过滤器
- JavaScript模块化