zoukankan      html  css  js  c++  java
  • 链表中LinkList L与LinkList *L 借鉴

    链表中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);
    }

  • 相关阅读:
    Day3-python基础3
    批量分发
    Day2-python基础2
    数据类型总结,and字符编码和文件处理
    集合与字符编码
    列表等及其部分讲解
    赋值符号和循环略解
    Python中常量,和基本数据类型,输入输出的方法,基本运算符。
    Python解释器了解,及部分变量
    计算机硬件,操作系统,编程语言
  • 原文地址:https://www.cnblogs.com/mykonons/p/5862891.html
Copyright © 2011-2022 走看看