码迷,mamicode.com
首页 > 其他好文 > 详细

指针在建立链表时的应用

时间:2018-09-22 12:59:35      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:std   内存   int   clu   clear   改变   alt   inf   分享   

btypedef 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);
    return 0;
}
LinkList L  定义了一个LinkList的对象,叫L
LinkList *L 定义了一个可以指向LinkList对象的指针,叫L
(*L).elem   指针L指向的对象的成员变量elem,与L->next等价
L.elem      对象L的成员变量elem
L->next     指针L指向的对象的成员变量next
(*L)->next       指针L指向的对象指向的对象的成员变量next

技术分享图片

技术分享图片



指针在建立链表时的应用

标签:std   内存   int   clu   clear   改变   alt   inf   分享   

原文地址:https://www.cnblogs.com/tianzeng/p/9689516.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!