精华内容
下载资源
问答
  • 链表头结点作用

    千次阅读 2014-02-14 12:48:45
    数据结构中,在单链表的...头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。 作用 1、防止单链表是空的而设的.当链表为空的时候,带头结点的头指针就指向头

    转自:http://blog.chinaunix.net/space.php?uid=20754930&do=blog&id=3336495

    数据结构中,在单链表的开始结点之前附设一个类型相同的结点,称之为头结点。头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。

    作用
    1、防止单链表是空的而设的.当链表为空的时候,带头结点的头指针就指向头结点.如果当链表为空的时候,单链表没有带头结点,那么它的头指针就为NULL.
    2、是为了方便单链表的特殊操作,插入在表头或者删除第一个结点.这样就保持了单链表操作的统一性!
    3、单链表加上头结点之后,无论单链表是否为空,头指针始终指向头结点,因此空表和非空表的处理也统一了,方便了单链表的操作,也减少了程序的复杂性和出现bug的机会。
    4、对单链表的多数操作应明确对哪个结点以及该结点的前驱。不带头结点的链表对首元结点、中间结点分别处理等;而带头结点的链表因为有头结点,首元结点、中间结点的操作相同 ,从而减少分支,使算法变得简单 ,流程清晰。对单链表进行插入、删除操作时,如果在首元结点之前插入或删除的是首元结点,不带头结点的单链表需改变头指针的值,在C 算法的函数形参表中头指针一般使用指针的指针(在C+ +中使用引用 &); 而带头结点的单链表不需改变头指针的值,函参数表中头结点使用指针变量即可。
     
    // extern.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Node
    {
        int value;
        struct Node *next;
    
    }*pNode;
    
    
    pNode creatList()
    {
        pNode p = (pNode)malloc(sizeof(struct Node));
        p->next = NULL;
    
        if (p == NULL)
        {
            exit(1);
        }
        return p;
    }
    
    int insertNode(pNode& pRoot, int value)
    {
        pNode pPre = pRoot;
        pNode pCur = pPre->next;
    
        while (pCur != NULL && pCur->value < value)
        {
            pPre = pPre->next;
            pCur = pPre->next;
        }
    
        pNode pNew = (pNode)malloc(sizeof(struct Node));
        if (pNew == NULL)
        {
            return 0;
        }
        pPre->next = pNew;
        pNew->next = pCur;
        pNew->value = value;
    
        return 1;
    }
    
    
    void printList(pNode& pRoot)
    {
        pNode pFirst = pRoot->next;
        while(pFirst != NULL)
        {
            printf("%d\n", pFirst->value);
            pFirst = pFirst->next;
        }
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int i;
        int array[] = {5, 12, 25, 4, 26, 7};
        pNode pList = creatList();
    
        for (i = 0;i < 6; i++)
        {
            insertNode(pList, array[i]);
        }
    
        printList(pList);   
    	return 0;
    }
    
    

     

    展开全文
  • 头结点的含义以及引入头结点作用

    千次阅读 多人点赞 2020-06-23 11:56:15
    一、概念 头结点:是虚拟出来的一个节点,不保存数据。...如果有头结点,头指针就指向头结点。 二、为何引入头结点 1)对链表的删除、插入操作时,第一个结点的操作更方便 如果链表没有头结点,那么头

    一、概念

    头结点:是虚拟出来的一个节点,不保存数据。头结点的next指针指向链表中的第一个节点。对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息。头结点不是链表所必需的

    头指针:是指向第一个结点的指针,如果链表没有引入头结点,那么头指针指向的是链表的第一个结点。头指针是链表所必需的

    [注意]无论是否有头结点,头指针始终指向链表的第一个结点。如果有头结点,头指针就指向头结点。

    二、为何引入头结点

    1)对链表的删除、插入操作时,第一个结点的操作更方便

    如果链表没有头结点,那么头指针指向的是链表的第一个结点,当在第一个结点前插入一个节点时,那么头指针要相应指向新插入的结点,把第一个结点删除时,头指针的指向也要更新。也就是说如果没有头结点,我们需要维护着头指针的指向更新。因为头指针指向的是链表的第一个结点,如果引入头结点的话,那么头结点的next始终都是链表的第一个结点。

                带头结点的单链表

     

     

           不带头结点的单链表

     

     

     

    引入头结点后,头指针指向头结点,那么无论链表是否为空,头指针均不为空。

    2)统一空表和非空表的处理

    有了头结点之后头指针指向头结点,不论链表是否为空,头指针总是非空,而且头结点的设置使得对链表的第一个位置上的操作与在表中其它位置上的操作一致,即统一空表和非空表的处理

     

     

     

    展开全文
  • 头结点作用

    2021-01-13 15:59:56
    数据结构中,在单链表的开始结点之前附设一个类型相同的结点,称之为头结点头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。 作用 1、防止单链表是空的...

    数据结构中,在单链表的开始结点之前附设一个类型相同的结点,称之为头结点。头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。
    含有头结点的链表插入
    作用
    1、防止单链表是空的而设的,当链表为空的时候,带头结点的头指针就指向头结点,如果当链表为空的时候,单链表没有带头结点,那么它的头指针就为NULL。
    2、是为了方便单链表的特殊操作,能有效减少代码量,在插入在表头或者删除第一个结点时不用考虑特殊情况,删除或插入用户的第一个节点的值和删除或插入中间的值用一样的代码,这样就保持了单链表操作的统一性!
    3、单链表加上头结点之后,无论单链表是否为空,头指针始终指向头结点,因此空表和非空表的处理也统一了,方便了单链表的操作,也减少了程序的复杂性和出现bug的机会。
    4、总结来说,没有头结点对第一个结点的操作大多和中间结点不太一样,每个操作都要考虑特殊情况,有头结点的话就不必考虑那么多了,还不容易出现代码错误。

    展开全文
  • 链表中头结点会让插入与删除简化,但至于如何简化,为什么会简化可能不清楚,那我们就来实现一下删除与插入无头结点的代码。 无头结点实现插入,删除,遍历输出 #include"stdio.h" #include"stdlib.h" typedef ...

    链表中头结点会让插入与删除简化,但至于如何简化,为什么会简化可能不清楚,那我们就来实现一下删除与插入无头结点的代码。

    无头结点实现插入,删除,遍历输出

    #include"stdio.h"
    #include"stdlib.h"
    
    typedef struct Node {
    	int data;
    	struct Node* Next;
    }*PNode;
    
    int NoHead_ListInsert(PNode* List, int i, int e) {
    	PNode P = *List;		int j = 1;
    	if (i == 1) { //无头结点时要对插入第一个结点单独操作
    		PNode l = (PNode)malloc(sizeof(struct Node));
    		l->data = e;
    		l->Next = P;
    		*List = l; //List = &l;
    	}
    	else {
    		while (P && j < i - 1) {
    			P = P->Next;
    			j++;
    		}
    		if (!P || i - 1 < j) {
    			printf("Input i error\n");
    			return 0;
    		}
    		PNode l = (PNode)malloc(sizeof(struct Node));
    		l->data = e;
    		l->Next = P->Next;
    		P->Next = l;
    	}
    	return 1;
    }
    
    int NoHead_Delete(PNode* List, int i) {
    	PNode P = *List;	int j = 1;
    	if (!*List) { //无头结点,要单独判断这个链表是否为空
    		printf("empty\n");
    		return 0;
    	}
    	if (i == 1) { //无头结点,要对删除首结点单独操作
    		*List = P->Next;
    		free(P);
    	}
    	else {
    		while ((P->Next) && j < i - 1) { //P->Next 是咱们要删除的结点 必须保证这个删除结点存在
    			P = P->Next;
    			j++;
    		}
    		if (i - 1 < j || !(P->Next)) {
    			printf("input i error\n");
    			return 0;
    		}
    		PNode l = P->Next;
    		P->Next = l->Next;
    		free(l);
    	}
    }
    
    void NoHead_Print(PNode List) {
    	while (List) {
    		printf("%d ", List->data);
    		List = List->Next;
    	}
    	printf("\n");
    }
    
    
    int main() {
    	int In, De, in;
    	PNode List = NULL;
    	NoHead_ListInsert(&List, 0, 9);
    	scanf("%d", &In);
    	for (int i = 0; i < In; i++) {
    		scanf("%d",&in);
    		NoHead_ListInsert(&List, i + 1, in);
    	}
    	NoHead_Print(List);
    
    	scanf("%d", &De);
    	NoHead_Delete(&List, De);
    	NoHead_Print(List);
    	return 0;
    }
    

    对带头结点的链表实现

    #include"stdio.h"
    #include"stdlib.h"
    
    typedef struct Node {
    	int data;
    	struct Node* Next;
    }*PNode;
    
    int ListInsert(PNode* List, int i, int e) {
    	PNode P = *List;		int j = 0;	//如果要插入第一个结点前,P要指向头结点,所以初始化P指向头结点
    	while (P && j < i - 1) { //有头结点可以统一操作
    		P = P->Next;
    		j++;
    	}
    	if (!P || i - 1 < j) {
    		printf("Input i error\n");
    		return 0;
    	}
    	PNode l = (PNode)malloc(sizeof(struct Node));
    	l->data = e;
    	l->Next = P->Next;
    	P->Next = l;
    	return 1;
    }
    
    int Delete(PNode* List, int i) {
    	if (!(*List)->Next) {
    		printf("List Empty\n");
    		return 0;
    	}
    	PNode P = *List;	 int j = 0; //删除第一个结点时,P指向头结点
    	while (P->Next && j < i - 1) { //P->Next 为要删除结点,必须保证存在
    		P = P->Next;
    		j++;
    	}
    	if (!(P->Next) || i - 1 < j) {
    		printf("input i error\n");
    		return 0;
    	}
    	PNode l = P->Next;
    	P->Next = l->Next;
    	free(l);
    	return 1;
    }
    
    void Print(PNode List) {
    	List = List->Next; //有头结点,要指向第一个有效结点
    	while (List) {
    		printf("%d ", List->data);
    		List = List->Next;
    	}
    	printf("\n");
    }
    
    int main() {
    	int In, De, in;
    	PNode List = (PNode)malloc(sizeof(struct Node));
    	List->Next = NULL; //注意初始化时要让最后一个结点为NULL
    	ListInsert(&List, 0, 1);
    	scanf("%d", &In);
    	for (int i = 0; i < In; i++) {
    		scanf("%d", &in);
    		ListInsert(&List, i + 1, in);
    	}
    	Print(List);
    	scanf("%d", &De);
    	Delete(&List, De);
    	Print(List);
    }
    
    
    实现代码的时候要注意:
    • 插入和删除的第i个结点时,要找到第i-1个结点,在找结点时,注意这两个操作的while循环条件不同,
      因为插入不需要管第i个结点是否为空,但删除必须要第i个结点不为空
    展开全文
  • 浅谈单链表头结点作用

    千次阅读 2020-09-12 16:21:21
    引入头结点的好处 使得在链表头部的操作(如:插入删除等)与在链表中部与尾部一致(统一) 使非空链表与空链表的操作统一 以插入为例,分析上述两点好处 //I 带头节点的单链表(空) 插入节点 s->next = H->...
  • 数据结构:头指针,头结点详解(新手.小白)

    千次阅读 多人点赞 2019-10-26 22:18:22
    1.头结点:(1)数据结构中,在单链表的开始结点之前设立一个节点称之为头结点头结点的数据域可以不存储任何信息,也可以存储链表的长度等附加信息,头结点的指针域存储指向第一个结点的指针(即第一个结点的存储...
  • 我想平常的二叉树的结构大家都非常了解(如下图所示),不难看出当二叉树有n个结点的时候,有2n个指针域,但是却有n+1个指针域的指向都是空指针域,当我们寻找某一个结点的孩子结点的时候非常的方便,但是当我们想要...
  • 数据结构中头结点作用

    万次阅读 多人点赞 2019-01-19 12:20:36
    数据结构中,在单链表的开始结点之前附设一个类型相同的结点,称之为头结点头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。 作用 1、防止单链表是空的...
  • 单链表头结点作用

    千次阅读 2014-03-27 11:57:57
    数据结构中,在单链表的开始结点之前附设一个类型相同的结点,称之为头结点头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。 作用: 1、防止单链表是...
  • C语言带头结点的单链表

    千次阅读 2018-11-07 22:43:47
    带头结点的单链表 之前的文章创建的单链表都是不带头结点的单链表。有时,我们为了更加方便地对链表进行操作,会在单链表...头结点头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般...
  • 链表节点作用

    2019-12-20 17:35:47
    深刻理解:带头结点和不带头结点的区别 使用头结点的优势 定义 头指针:链表第一个节点的存储位置 首节点:第一个存储数据的节点 头节点: 首节点前面,存放首节点地址 头节点不是链表必须的 ,但有头节点能让链表对...
  • 头指针和头结点意义和区别

    万次阅读 多人点赞 2019-01-08 23:09:14
    由定义可知头指针指向链表第一个存储位置,当存在头结点时头指针指向头结点,这时如果删除链表中的节点头指针不会改变(头指针不能删除)。 当不存在头结点时,头指针指向首结点,如果这时候删除首...
  • 头结点: 为了操作方便,通常在链表的首元结点之前附设一个结点,称为头结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理。...
  • 链表中设置头结点作用

    千次阅读 2015-03-14 14:55:42
    (1)对带头结点的链表,在表的...若链表没有头结点,则首元素结点没有前驱结点,在其前插入结点或删除该结点时操作会复杂些。 (2)对带头结点的链表,表头指针是指向头结点的非空指针,因此空表与非空表的处理是一样的。
  • 链表的头结点和尾节点的用处

    万次阅读 2016-07-13 21:15:48
    尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和 rear, 查找...
  • 本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数。L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置,如原单链表元素依次为1,2,3,4,...
  • 单链表为什么要设置头结点

    万次阅读 多人点赞 2018-09-25 16:15:00
    单链表为什么要设置头结点 转自https://www.cnblogs.com/youxin/p/3279391.html 链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一...
  • 头指针是指链表的第一个节点的指针,若链表有头结点,则是指向头结点的指针 头指针具有标识作用,所以经常用头指针冠以链表的名字 无论链表是否为空,头指针都不为空,它是链表的必要元素 头结点 头结点是为了操作...
  • 线性表中头结点作用

    千次阅读 2015-05-03 20:47:13
    在初学数据结构时,无论是创建顺序表还是链表,都不喜欢设一个头结点,直到在昨天写一个链队列时,才发现其作用,下面说明下 链队结构与初始化函数相同 #define MAX 5 typedef struct qnode{ //定义链队中的结点...
  • 参考:https://www.cnblogs.com/youxin/p/3279391.html http://www.cnblogs.com/Seiyagoo/archive/2012/03/30/2426107.html
  • 头结点作用:1.规定当头节点的指针域为空,则本链表为空。 首元结点:就是本链表的第一个结点(真正存放数据的第一个结点) 结点:构成1.数据域 2.指针域(结点指针指向下一个/上一个结点地址,而不是本结点地址...
  • 数据结构: 链表中哨兵(头结点)的作用 单链表的实现中,常有 带头结点 和 不带头结点 两种实现方式. 笔者在做算法与数据结构题目时,非常喜欢使用带头结点的实现方式.可以简化一些边界的处理. 哨兵节点 哨兵节点,也是...
  • 头结点存在的意义

    2019-12-09 23:40:23
    数据结构中,在单链表的开始结点之前附设一个类型相同的结点,称之为头结点头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。 作用 1、防止单链表是空的...
  • 头指针、头结点、首元结点概念区别 来源 转自:https://blog.csdn.net/liangxingda/article/details/52755800 链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一...
  • } } 如何设置头结点以及头结点的好处 在链表的建立时,如果使用头结点,可以使第一个结点在的操作一般化,也就是第一个结点和后面的结点的操作方法一样, 假如不建立头结点,那在链表的第一个节点前插入一个结点...
  • 数据结构中,在单链表的开始结点之前附设一个类型相同的结点,称之为头结点头结点的数据域可以不存储任何信息,头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。 作用 1、防止单链表是空的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,776
精华内容 16,710
关键字:

头结点的作用