(一) 这个错误我调试了很久,现在些日志以示警戒。我写的是一个普通的链表。但是出现了很多让我苦笑不得的错误。最后的原因归结为:我传入了NULL指针给InitList()函数。实在不应该呀。昨天看书的时候,看到给printf()传入NULL 指针的悲剧,没有想到我就犯了这个错误。废话少说,现在上实例:
原来的错误:
int main(int argc, char** argv)
{
LinkList L = NULL;
InitList(L); ...
}
应将其改为:InitList(&L);因为L是NULL,不能作为参数传进去。会找不到地址。
以后要绝对的注意不要传NULL指针给函数。
(二)还有一个注意的是:当函数里面要改变指针的值时,传给函数的是指针的地址,而不是指针。那边接到的只是指针的一份拷贝。如果你传入一个指针,而不是指针的地址。那么,你在函数里即使改变了指针的地址,那也是改变了指针拷贝的地址,局部变量,函数结束之后就释放了。所以还是没有改变指针的内容。
改正的方法是:传入指针的地址,用二重指针接收。
如:void ListInsert(LinkList L,int i,int e){
int j = 0;
LinkList p = L->next,q;
if(i <= 0 ||i > ListLength(L)+1)
exit(1);
while(p&&j<i-1){
j++;
p = p->next;
}
q = (LinkList)malloc(sizeof(struct LNode));
q->data = e;
q->next = p ->next;
p->next = q;
if(p == L)
L = q;
}
和
void ListInsert(LinkList *L,int i,int e){
int j = 0;
LinkList p = (*L)->next,q;
if(i <= 0 ||i > ListLength(*L)+1)
exit(1);
while(p&&j<i-1){
j++;
p = p->next;
}
q = (LinkList)malloc(sizeof(struct LNode));
q->data = e;
q->next = p ->next;
p->next = q;
if(p == *L)
*L = q;
}
区别很明显:就是要改变指针L里面的内容,所以需要传入指针的地址。第一个会出现错误。第二个不会。