为了账号安全,请及时绑定邮箱和手机立即绑定

关于数据结构单链表头结点是否可以用指针替换?

关于数据结构单链表头结点是否可以用指针替换?

单链表定义时要声明一个头结点,但是这个头结点的data域是不使用的,只用其next域,那么这个头结点和一个普通指针有何区别?浪费了一个data域的空间?我的想法是直接用一个指针作为头结点,原先的头结点作为存储数据的第一个单元。头结点定义:LinkList h;这个h所指向的是头结点,按照书本和老师讲的规定是不储存数据,就用到一个next域,现在,我让这个data域也起作用,储存数据,h这个指针本身作为头结点。当头结点空时原:h->next=NULL;现:h=NULL;插入数据时,原:p=(LNode*)malloc(sizeof(LNode)); p->data=e;h->next=p;现:p=(LNode*)malloc(sizeof(LNode)); p->data=e;h=p;其他操作以此类推。我想问一下我这个想法有没有问题,想搞清楚,问了老师也没怎么说清楚,求解。
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

如果不用空的header节点的话,要修改头节点,函数需要传入header的地址而不是header本身(header此处已经是指针,也就是说要传入指针的指针)。
比如,

LNode *h, *p;


/* 从第一个节点开始删除 */

void del_front(Node** header) 

{

    ...

}


p=(LNode*)malloc(sizeof(LNode));

p->data=e;

h=p;


del_front(&h);

在上面这个例子中,你删除了老的头结点,那么新的头结点地址也就变了,也就是说h的值也应该跟着变。要改变指针的值,你只传入指针h给函数的话是不能修改h的值的(这是值传入),我们需要通过给函数传入指向指针的指针才能修改h的值,因此这么做就比较麻烦。

如果是将头结点作为特殊节点的话,我们即使从第一个节点开始删除,我们只需要传入头结点h给删除的函数,然后这个函数修改h->next就能解决问题了。所以这么做,维护性应该是要好些的。


查看完整回答
反对 回复 2018-10-29
  • 1 回答
  • 0 关注
  • 1112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信