单链表创建的LinkList L与LinkList *L区分的问题

本文详细解释了在链式存储结构中,为何在处理线性表操作时,获取元素通常使用LinkListL参数,而插入或删除等操作则采用LinkList*L参数。通过实例和代码分析,阐述了一级指针和二级指针在链表操作中的作用,强调了在顺序存储结构中可以使用一级指针,而在链表中由于内存地址不连续,需要二级指针来修改链表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习线性表的存储结构中,很多人在学习线性表的链式存储结构即单链表时,有人会注意函数传参LinkList L与LinkList *L的问题,如下
下面展示一些 内联代码片

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef struct Node
{
   
	ElemType data;				//数据域
	struct Node* Next;	    //指针域(指向节点的指针)
}Node;

typedef struct Node* LinkList;;
Status GetElem(LinkList L, int i, ElemType* e) //获取单链表L中的第i个元素,用e返回其值。
Status ListInsert(LinkList *L, int i, ElemType e)//向单链表第i个位置插入新元素e。

有人会发现为什么获取单链表的元素形参输入是LinkList L,而向单链表插入或者删除等操作要用到LinkList *L。

我从以下几个方面逐一递进解释:
1、对于LinkList L: L是指向定义的Node结构体的指针,因为我们前面用typedef struct Node* LinkList,就是LinkList相当于struct Node*,这里的*是跟Node的后面,LinkList是一个指向该结构体的的指针的别名,故此可以用->运算符来访问结构体成员,即L->data,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem;

而对于LinkList *L:L是指向定义的Node结构体指针的指针,也就是说L的内容是指向定义的Node结构体指针的地址,(*L)是指向Node结构体的指针,注意,这里的(*L)要理解好。

2、从上面的定义我们知道LinkList L的L是一级指针,而后面的LinkList *L是二级指针,对于一级指针我们都知道,可以通过改变的指针的值从而改变量,如

#include<stdio.h>
int main()
{
   
	int a = 100;
	int b = 200;
	int* p;
	p = &a;
	printf("%d,",*p);
	p = &b;
	printf("%d\n",
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值