问题描述
- 数据结构中的线性表中的指针使用
-
数据结构 单链表
类型定义:
typedef struct lnode
{
elemtype data;
struct lnode *next;
}Lnode, *LinkList;int InitList(LinkList L)//构造一个空的线性表L
{ 构造一个空的线性表L
*L=(LinkList)malloc(sizeof(struct LNode));
if(!*L) / 存储分配失败 /
exit(OVERFLOW);
(*L)->next=NULL; / 指针域为空 */
return OK;
}int ListInsert(LinkList L,int i,ElemType e) //在带头结点的单链线性表L中第i个位置之前插入元素e
{
int j=0;
LinkList p=L,s;
while(p&&j
{
p=p->next;
j++;
}
if(!p||j>i-1) /* i小于1或者大于表长 /
return ERROR;
s=(LinkList)malloc(sizeof(struct LNode)); / 生成新结点 /
s->data=e; / 插入L中 */
s->next=p->next;
p->next=s;
return OK;
}void main()
{
LinkList L;
ElemType e;
int i;
int j;
i=InitList(&L);
for(j=1;j<=10;j++)
ListInsert(L,j,j);
}
在类型定义中linklist已经是指向节点的指针了,为什么在构造一个空的线性表L的函数int InitList(LinkList *L) 中形参为LinkList *L(即L为指向指针的指针),而不是LinkList L????linklist作为一个指针也可以操作链表的呀!!!
在链表插入函数int ListInsert(LinkList L,int i,ElemType e)中,形参为什么却变成了LinkList L???
在main函数中定义的是指针变量LinkList L; 为何不定义成Lnode L????
什么时候该用LinkList *L,什么时候该用LinkList L,什么时候该用Lnode L?????它们的区别是什么????望大神详细回答,感激万分!!!
解决方案
如果你不修改指针,只是修改指针指向的对象/结构体,那么就不需要指针的指针,指针就可以了。
解决方案二:
因为你希望将L指向另一个指针,而调用者可以得到这个新的指针,所以要用指针的指针。
如果不用指针,那么将L指向别的指针,实参不会受影响,也就起不到初始化的作用。
解决方案三:
值传递没法改变实际指针指向,所以这里传入二级指针,initlist(&l)这里。就跟交换两个数的函数一个意思?