关于单链表添加一个节点函数的疑惑
本人刚开始学数据结构,看的是程杰老师的《大话数据结构》,下面的例子整理,百度过后,还是有疑惑。【
如果函数的参数是一个指针,不要指望用这个指针去分配内存
【错误例子:
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
} //编译器会报错
】
编译器总是要为函数的每个参数制作临时副本,指针参数p 的副本是 _p,编译器使 _p = p 。如果函数体内的程序修改了_p 的内容,就导致参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变。所以无法返回新分配内存的首地址,解决办法之一是:用指向指针的指针,另一方法是:用函数返回值传递动态内存
】
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p, s; //指针变量,一个用来查找匹配,另一个用来作为新结点
p = *L; //把头结点的地址赋给p
j=1;
while(p && j<i) //寻找第i个结点, p=0说明说明?
{
p = p->next;
++j;
}
if(!p || j>i)
return ERROR; //第i个元素不存在
s = (LinkList)malloc(sizeof(Node)); //生成新结点(C标准函数)
s->data = e;
s->next = p->next; //将p的后继结点赋值给s的后继
p->next = s; //将s赋值给p的后继
return OK;
}
】
我的问题:按照我找到解答的内容,这里Status ListInsert(LinkList *L,int i,ElemType e),也不用用一个二级指针啊,s = (LinkList)malloc(sizeof(Node)); 这句和LinkList L无关吧?函数中又没有用到L = (LinkList)malloc(sizeof(Node)); 之类的,那入口参数是LinkList L,有问题吗?还是我理解哪里错了?