为啥在建立单向链表时要用到 指针类型的引用参数 ,而在遍历链表时用指针参数就可以了???
1个回答
展开全部
就以这个结构体来说
typedef struct Node
{
int data;
struct Node *next;
}Node, *LinkList; /* 定义LinkList */
这是建立链表函数,也就是链表初始化函数, InitList1是直接传指针,而不是指针的引用或二级指针
int InitList1(LinkList L) //等价于Node *L
{ L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!L) /* 存储分配失败 */
return 0;
L->next=NULL; /* 指针域为空 */
return 1;
}
int main()
{
LinkList L;
InitList1(L);//这里注意了,你的L是个Node *的指针,也就是LinkList型的,而 InitList1函数也是接受LinkList型,InitList1函数中接受的其实是L的一份拷贝,修改的是这份拷贝,也就是说你申请的Node空间地址给了InitList1函数中的那个L的拷贝,InitList1函数执行完,那个拷贝就销毁了,所以申请的空间就泄露了,而main中的L就一脸懵逼,创建失败。并没有修改main函数中的L,所以要通过传入L的引用或L的指针,因为L本身就是个指针,所以也就是传入指针的引用或二级指针。
}
如下面所示
int InitList2(LinkList &L) //传入L的引用
{ L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!L) /* 存储分配失败 */
return 0;
L->next=NULL; /* 指针域为空 */
return 1;
}
int InitList3(LinkList *L) //传入L的指针,也就是二级指针
{ *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!(*L)) /* 存储分配失败 */
return 0;
(*L)->next=NULL; /* 指针域为空 */
return 1;
}
至于你说的遍历、插入、删除都可以传指针,也就是直接传入L即可,因为就算是传入的是L的拷贝,你也可以根据这个拷贝的L->next走遍这个链表,到具体的地方插、删。
typedef struct Node
{
int data;
struct Node *next;
}Node, *LinkList; /* 定义LinkList */
这是建立链表函数,也就是链表初始化函数, InitList1是直接传指针,而不是指针的引用或二级指针
int InitList1(LinkList L) //等价于Node *L
{ L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!L) /* 存储分配失败 */
return 0;
L->next=NULL; /* 指针域为空 */
return 1;
}
int main()
{
LinkList L;
InitList1(L);//这里注意了,你的L是个Node *的指针,也就是LinkList型的,而 InitList1函数也是接受LinkList型,InitList1函数中接受的其实是L的一份拷贝,修改的是这份拷贝,也就是说你申请的Node空间地址给了InitList1函数中的那个L的拷贝,InitList1函数执行完,那个拷贝就销毁了,所以申请的空间就泄露了,而main中的L就一脸懵逼,创建失败。并没有修改main函数中的L,所以要通过传入L的引用或L的指针,因为L本身就是个指针,所以也就是传入指针的引用或二级指针。
}
如下面所示
int InitList2(LinkList &L) //传入L的引用
{ L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!L) /* 存储分配失败 */
return 0;
L->next=NULL; /* 指针域为空 */
return 1;
}
int InitList3(LinkList *L) //传入L的指针,也就是二级指针
{ *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!(*L)) /* 存储分配失败 */
return 0;
(*L)->next=NULL; /* 指针域为空 */
return 1;
}
至于你说的遍历、插入、删除都可以传指针,也就是直接传入L即可,因为就算是传入的是L的拷贝,你也可以根据这个拷贝的L->next走遍这个链表,到具体的地方插、删。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询