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

查看:141
本文介绍了c - 关于数据结构单链表头结点是否可以用指针替换?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

单链表定义时要声明一个头结点,但是这个头结点的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;

其他操作以此类推。

我想问一下我这个想法有没有问题,想搞清楚,问了老师也没怎么说清楚,求解。

解决方案

如果不用空的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就能解决问题了。所以这么做,维护性应该是要好些的。

这篇关于c - 关于数据结构单链表头结点是否可以用指针替换?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆