带与不带头节点区别(十八)
节点 区别 十八 带头
2023-09-14 09:16:11 时间
●节点结构
typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList;
●不带头节点:此时头指针指向第一个节点
h->a1->a2->a3->…… // 头指针存放的是第一个节点的地址,即h,也就是说(*h)表示的是第一个节点
带头结点:此时头指针指向头结点
h->headnode->a1->a2->a3->…… // 头指针存放的是头结点的地址,也就是说(*h)表示的是头结点
● 空表的比较
//不带头节点 h = NULL; // h 表示的是第一个节点的地址,h = NULL 表示第一个节点的地址为空,也就是空表 // 带头结点 h->next = NULL; // h 表示的是头结点的地址,h->next 就是头结点的下一个节点,即首元节点为空,也就是空表
● 添加第一个节点的区别
带头结点
bool ListInsert(LinkList &L, int i, ElemType e){
if(i < 1) return false;
LNode *p;
int j = 0; // 当前节点是第几个节点
P = L;
while(p != NULL && j < i-1){
p = p->next;
j++;
}
if(p == NULL) return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
不带头结点
bool ListInsert(LinkList &L, int i, ElemType e){
if(i < 1) return false;
if(i == 1){
LNOde *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
return true;
}
LNode *p;
int j = 1; // 当前p指向第几个节点
P = L;
while(p != NULL && j < i-1){
p = p->next;
j++;
}
if(p == NULL) return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
为了方便找到差距,用对比软件看一下哪里不同
总结:
总的来说,就是带头结点时不管是否为空表,头指针的值都不会变化,都指向头结点。而不带头结点则需要根据不同情况来修改头指针的值。
不带头节点写代码不方便,需要专门写一段代码来解决第一个节点。
所以操作不统一,有所不便,所以绝大数时候使用带头结点的方式较为方便。
相关文章
- .NET加密配置文件connectionStrings节点
- CloudStack 4.4+KVM之KVM计算节点安装
- XML 声明必须是文档中的第一个节点并且在它之前不允许出现空白字符
- 云图说|DDS读写两步走,带您领略只读节点的风采
- 2374. 边积分最高的节点
- bootstrap jQuery Ztree异步载入数据,check选择&可加入、改动、删除节点
- rancher单节点部署和证书问题——筑梦之路
- jQuery 复制节点的元素实现加入到购物车功能
- elasticsearch如何安全重启节点
- 基于改进的 IEEE24 节点电力系统和比利时 20 节点天然气系统通过电转气和燃气轮机耦合
- Kubelet 运行机制分析 节点管理