链表总的首元结点、头结点、头指针的区别

前言,:今天看书的时候,又复习了一下链表的知识点,但是标题上这个知识点老是弄混淆,所以接下来做一个小小的总结,给自己加深理解。

一、三者的基本概念;

1、首元结点:就是指链表中存储第一个数据元素a1的结点,如下表格所示结点ZHAO就是首元结点:

L-----> 数据域和指针域-----> ZHAO+指针域---->  

2、头结点:它是在首元结点之前附设的一个节点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可以存储与数据元素类型的其他附加信息,例如,当数据元素为整数型时,头结点的数据域中可存放该线性表的长度。如上表中的数据域和指针域(在链表和线性中一个结点包含两个域:一个是数据域,另外一个是指针域,指针域它本有自己的存储地址,同时又指向下一个节点的数据域,这就形成了一个逻辑关系)就是一个头结点。

3、头指针:它是指向链表中的第一个结点的指针。若链表设有头结点,则头指针所指结点为线性表的头结点;若链表不设头结点,则头指针所指结点为该线性表的首元结点,例如,上面的表格中L就是一个头指针

二、链表增加头结点的作用有以下几点:

1、增加了头结点后,首元结点的地址保存在头结点(就是所说的“前驱”结点)的指针域中,则对链表的第一个数据元素的操作与其他数据元素相同,无需进行特殊处理

2、便于空表的和非空表的统一处理;当链表不设头结点时,假设L为单链表的头指针,它应该指向首元结点,则当单链表为长度n为0的空表时,L指针为空(判断空表的条件可记为:L==NULL)

3、增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针,若链表为空的话,那么头结点的指针域为空。

三、总结:

在顺序表中,由于逻辑上相邻的两个元素在物理位置上是紧邻的,则每个元素的存储位置都可从线性表起始位置计算得到;而在单链表中,各个元素的存储位置是随意的,但是它要知道头指针,才能够精确定位表中的元素位置。

原文地址:https://www.cnblogs.com/1121518wo/p/11186168.html

时间: 2024-10-20 06:23:09

链表总的首元结点、头结点、头指针的区别的相关文章

单链表的头指针、头结点与首元结点

继续我们昨天所说的单链表.单链表也是一种线性表,所以总得有个头有个尾.链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了.之后的每一个结点,其实就是上一个的后继指针指向的位置.雅加达娱乐城 这里有个地方要注意,就是对头指针概念的理解,这个很重要.“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针.画一个图吧. 这个图看起来很清晰了.比如说头结点,我们就可以这么描述了: 头结点是为了操作的统一与方便而设立的,放在第一个元

软考题目之头结点、头指针和首元节点

遇到一个让人迷惑的题目. 以下关于线性表采用链式存储时删除节点运算的描述,正确的是() A.带头结点的线性链表删除结点时,不需要更改头指针. B.带头结点的线性链表删除第一个结点时,需要更改头指针. C.不带头结点的线性链表删除结点时,需要更改头指针. D.不带头结点的线性链表删除第一个结点时,不需要更改头指针. 首先,明确几个概念. 首元结点:指链表中存储第一个数据元素a1的结点. 头结点:是为了操作方便在首元结点前复设的结点. 头指针:指向链表中第一个结点(或为头结点或为首元结点)的指针.

有头结点的链表操作

#include<iostream> #include <stack> using namespace std; struct Node { int data; Node *next; }; //没有头结点的插入新节点 Node* AddNode(Node *head,int num)//如果是void 类型的 那么head要用指向指针的指针 { Node *pNew=(Node*)malloc(sizeof(Node)); pNew->data=num; pNew->

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点.链表结点定义如下: struct ListNode { int       m_nKey; ListNode* m_pNext; }; c语言实现 /* File : rlink.c Author : Date : 2015/4/4 platform : windows7 x86_64 version : 1.0 Function : 反转一个链表 */ #include <stdio.h> #include <stdli

(含有头结点以及尾结点)单链表各类功能的实现

对单链表实现如下功能: void InitList(List *list); //初始化单链表 bool push_back(List *list,ElemType x); //尾插法 void show_seqlist(List *list); //显示链表内容 bool push_front(List *list,ElemType x);//头插法 bool pop_back(List *list); //尾删法 bool pop_front(List *list); //头删法 Node

使用只有头结点的链表实现栈

使用静态内部类充当单链表 1 package db; 2 3 /** 4 * 只有头结点实现栈 5 * 6 * @author fightzhao 7 * 8 */ 9 public class Stack<E> { 10 /* 11 * 有以下方法 入栈 push(E x) 出栈pop() 栈顶元素top() 12 */ 13 private static class Node<E> { 14 public Node<E> next; 15 public E data

链表中头指针和头结点

线性表使用顺序(数组)存储时有个弊端,那就是在插入和删除时需要大量的移动数据,这显示是非常消耗时间的,所以可以采用链式存储,即有一个指针域(单链表),来记录下个结点的存储位置(地址),这样在插入和删除结点时只需要修改指针域即可,从而大量减少移动数据所消耗的时间.来看链表的定义: struct node { int data; struct node *next; }; 其中有两个元素,data为数据域,用于存储数据,next为指针域,用于存储下个结点的位置(地址).那么什么是头指针呢?我们把指向

线性表带头结点的单链表的链式表示和实现

带有头结点的单链表的12个基本操作 #define DestroyList ClearList//DestroyList()和ClearList()的操作是一样的 void InitList(LinkList &L){ L = NULL; } void ClearList(LinkList &L){ LinkList p; while (L){ p = L; L = L->next; free(p); } } Status ListEmpty(LinkList L){ if (L)r

单链表 头指针与头结点

头指针: 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针. 头指针具有标识作用,所以常用头指针冠以链表的名字. 无论链表是否为空,头指针均不为空. 头指针是链表的必要元素. 头结点: 它是为了操作的统一和方便设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度). 有了头结点以后,对在第一元素结点前插入结点和删除第一结点起操作与其他结点的操作就统一了. 头结点不一定是链表的必须元素. typedef struct Node { int dat