范例宝典中关于链表这块讲的真心不敢恭维,先说链表逆置这段:
stud *reverse(stud *head)
{
stud *p, *r, *h;
h = head->next;
if (h && h->next)
{
p = h;
r = p->next;
p->next = NULL;
while (r)
{
p = r;
r = r->next;
p->next = h;
h->prior = p;
h = p;
}
head->next = h;
h->prior = head;
return head;
}
}
比较让人费解,虽然结果也对,但感觉不简洁啊,不如这样实现:
//单链表逆序改双链表逆置
stud *reverse1(stud *head)
{
stud *pf,*pb,*r;
pf=head;
pb=pf->next;
while(pb!=NULL)
{
r=pb->next;//暂存pb的下一个节点
pb->next=pf;//改变pf、pb之间的链接
pf->prior=pb;
pf=pb;//pf、pb重新赋值,指向下一个需要改变节点位置对
pb=r;
}
head->next=NULL;
head=pf;
return head;
}
另外:链表这块,关于链表插入、删除等操作,在子函数中都是这样传参的:(实例080链表删除)
void del (stud *p) //删除链表的一个结点 { p->next->prior=p->prior;//指针p的前驱 p->prior->next=p->next;//指针p的后继 free(p); }
要是删除的是尾结点怎么办?不报错吗?另外删除参数是stud *p,这样好吗?规范的写法应该是传指针的指针:
是这样吧?