链表中的LinkList L、LinkList *L

对于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本身,就要用LinkList *L
而如果要求函数调用后只修改指针L所指向的内容,而不更改指针L本身,那么用LinkList L就行了;

//代码1(正确的代码)
#include<cstdio>
#include<stdlib.h>
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
 
//初始化链表,函数调用完毕后,head指针会指向一个空的链表,即会改变head指针本身,所以必须用二级指针,即要用**header
//**header修改head指针所指向变量的值,*header修改head指针本身 
void CreateList(LNode **header){ //(LinkList *header)
	(*header)=(LNode*)malloc(sizeof(LNode));//(LinkList)malloc(sizeof(LNode));head指针本身变了
	(*header)->data=11;
	(*header)->next=NULL;
}
int main(){
	LinkList head=NULL;//创建结构体指针head
	CreateList(&head);//传递head指针本身的地址:head指针的地址传进去后被复制了一份copy,在函数中传递的是指针head的地址的copy
	if(head!=NULL){
		printf("%d\n",head->data);//11
	}
	free(head);
	return 0;
}


//代码2(错误的代码)
#include<cstdio>
#include<stdlib.h>
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
void CreateList(LNode *header){
	header=(LNode*)malloc(sizeof(LNode));
	header->data=11;
	header->next=NULL;
}
int main(){
	LinkList head=NULL;//创建结构体指针head
	CreateList(head);//head指针传进去后被复制了一份copy,在函数中传递的是head指针的copy,只能对head指针的copy及其所指向的内容进行修改,不能修改head指针本身
	if(head!=NULL){
		printf("%d\n",head->data);//什么都没有输出,因此这样写是错误的!!!!!!
	}
	free(head);
	return 0;
}

所以,初始化链表时应该使用代码1而不是代码2;
同理,对于初始化、销毁都会改变node结构体指针,都要用二重指针;
对于单链表的读取、插入、删除,只需要用一重指针(用二重指针也行)。

如果用引用的方法可以直接避开上面的问题,那么问题就简单多了:

#include<cstdio>
#include<stdlib.h>
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
//header其实是传入指针head的别名
void CreateList(LinkList &header){ //参数也可写成(LNode *&header)
	header=(LNode*)malloc(sizeof(LNode));//(LinkList)malloc(sizeof(LNode));
	header->data=11;
	header->next=NULL;
}
int main(){
	LinkList head=NULL;
	CreateList(head); 
	if(head!=NULL){
		printf("%d\n",head->data);//11 
	}
	free(head);
	return 0;
}
  • 14
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值