链式存储是什么样的结构?
链式存储结构的特点使用任意的存储单元存储线性表的数据元素,存储单元可以使连续的也可以是不连续的,因此,为了表示每个数据元素和下一个元素的关系,除了存储本身的信息之外,还需要存储下一个元素的位置信息,将两部分信息组成的存储映像叫结点。它包括两个域,即数据域和指针域。

单链表有两种:带头结点的单链表,带头指针的单链表。

带头结点的单链表

结点的定义

定义结点时,头结点的数据域用于记录链表的长度。

typedef struct Node
{union              //用联合体的方式,既能记录长度也能存储数据{int length;ElemType data;};struct Node *next; //用于存储下一结点地址的指针;}HSNode, *HLinkList;

链表和顺序表一样,也有对应的增删改查等操作,而且相对于顺序表来说更加简单,不用移动大量的数据。

带头结点链表的各项基本操作

初始化

void InitHLinkList(HLinkList head);
{if(head==nullptr)exit(0);      //只要有指针,就要对其进行判空head->length=0;head->next=nullptr;
}

插入

插入分为三种:按位置插入,头插法,尾插法。以下只给出按位置插入的方法。

bool InsertHLinkListPos(HLinkList head, ElemType value, int pos)//接收头结点,插入的值,插入的位置三个参数
{if(head==nullptr)exit(0); if (pos < 0 || pos > Length(head))   //判断插入位置是否合法{printf("Insert Fail: Pos is error\n");return false;}HLinkList p=head;   //申请一个p指针和head指向相同while(pos){p=p->next;pos--}HLinkList new_node = (HLinkList)malloc(sizeof(HSNode));//申请一个要插入的结点if (new_node == nullptr){printf("Insert Fail: Apply Node Fail\n");return false;}new_node->data = value; new_node->next = p->next;p->next = new_node;head->length++;return true;
}

当要插入的位置为第一个或者最后一位时,直接将pos改动即可。

删除

按位置删

bool DeleteHLinkListPos(HLinkList head, int pos)
{if (head == nullptr) exit(0);if (pos < 0 || pos >= Length(head)) return false;HLinkList p = head;while (pos){pos--;p = p->next;}HLinkList q = p->next;p->next = q->next;free(q);head->length--;return true; }

按数值删

bool DeleteHLinkListValue(HLinkList head, ElemType value){if (head == nullptr) exit(0);HLinkList p = head;HLinkList q = p->next;while (q != nullptr){if (q->data == value){p->next = q->next;free(q);}else{p = q;}q = p->next;}
}

带头指针的单链表

结点的定义

typedef struct SNode
{ElemType data; // 元素struct Node *next; // 下一个结点的地址
}SNode, *LinkList;

带头结点链表的各项基本操作

初始化

void InitLinkList(LinkList *phead)
{if (phead == nullptr) exit(0);*phead = nullptr; }

插入

插入分为三种:按位置插入,头插法,尾插法。以下只给出头插的方法。

static LinkList ApplyNode(ElemType value, LinkList next) //申请新结点
{LinkList new_node = (LinkList)malloc(sizeof(SNode));if (new_node == nullptr) return nullptr;new_node->data = value;                   //存入新结点数据new_node->next = next;return new_node;
}bool InsertLinkListHead(LinkList *phead, ElemType value)
{if (phead == nullptr) exit(0);LinkList new_node = ApplyNode(value, *phead);//申请一个新结点指向原来的头结点if (new_node == nullptr) return false;*phead = new_node;                          //将头指针指向新结点return true;
}int Length(LinkList *phead)      //计算长度
{if (phead == nullptr) exit(0);LinkList p = *phead;int num = 0;while (p != nullptr){p = p->next;num++;}return num;
}

删除

删除分为头删法,尾删法,按位置插入等,现给出按位置删除的方法。

bool DeleteLinkListPos(LinkList *phead, int pos){if (phead == nullptr) exit(0);if (pos < 0 || pos >= Length(phead)) return false;if (pos == 0) return DeleteLinkListHead(phead);LinkList p = *phead;while (pos > 1){p = p->next;pos--;}LinkList q = p->next;p->next = q->next;free(q);return true;
}

销毁

void DestroyLinkList(LinkList *phead)
{if (phead == nullptr) exit(0);while (!Empty(phead)){DeleteLinkListHead(phead);}
}

单链表:头结点和头指针的实现方式相关推荐

  1. 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。

    今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...

  2. 数据结构中的头结点和头指针

    数据结构中的头结点和头指针 (1)头指针: 头指针指链表指向第一个结点的指针,头指针具有标识作用,若链表有头结点,那么头指针即为指向头结点的指针. (2)头结点:头结点是为了方便而设置,它放在链表中第 ...

  3. 头结点和头指针的区别

    地址: 头指针和头结点的区别:头指针: 头结点: 地址: https://blog.csdn.net/u013593035/article/details/45953605?ops_request_m ...

  4. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点

    /*实验2 1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点 (low和high的值是多少可自由设计).并且要在程序中验证其功能实现. (可在实验1的第3题的基 ...

  5. 狸猫换太子--删除无头单链表中结点

    狸猫换太子–删除无头单链表中结点 @(算法学习) 学习自<编程之美>. 很有意思的一种做法. 给定一个没有头指针的单链表,一个指针指向次单链表中的一个中间结点,删除此结点. 分析:这种根本 ...

  6. 数据结构:单链表——带头结点与不带头结点步骤详解

    单链表:带头结点与不带头结点详解 在本人的另一篇文章中,通过java实现了带头结点和不带头结点的单链表,有兴趣的小伙伴可以去看下数据结构(一):链表(Linked List) 这两天回顾下链表的知识, ...

  7. 单链表———带头结点跟不带头结点的区别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.单链表:带头结点跟不带头结点 二.使用步骤 总结 前言 数据结构中单链表的创建 带头结点跟不带头结点的区别 一.单 ...

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

    遇到一个让人迷惑的题目. 以下关于线性表采用链式存储时删除节点运算的描述,正确的是() A.带头结点的线性链表删除结点时,不需要更改头指针. B.带头结点的线性链表删除第一个结点时,需要更改头指针. ...

  9. 单链表——指定结点的前插和后插

    后插 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> typedef struct ...

最新文章

  1. Grails GORM查询总结
  2. Android Scroller与computeScroll方法的调用关系
  3. Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记
  4. 南开大学2014年高等代数部分试题解答
  5. linux下调试core的命令
  6. 设计一个处理两种类型地址的地址簿程序_编译器设计-符号表-中间代码生成
  7. CentOS更换网卡设置
  8. SOA_环境安装系列1_Oracle SOA Suite11g安装总括(案例)
  9. Kalman Filter
  10. 03:数据结构 栈、队列、链表与数组
  11. JDDroppableView
  12. 【TensorFlow】TensorFlow函数精讲之tf.train.exponential_decay()
  13. 关于复利2.0 3.0
  14. 20190827:(leetcode习题)合并两个有序链表
  15. html简单登录页面代码
  16. 传输层协议和应用层协议及它们之间的关系(端口)
  17. 2020年408真题_2020年港澳台联考真题——地理!
  18. 前后端分离之图片上传服务端处理方法(亲测通过)
  19. 深度学习平台、CPU和GPU使用
  20. 雷达扫描定位 android,Android仿微信雷达扫描

热门文章

  1. vs2017开发Node.js控制台程序
  2. R语言 、Excel哪个更能胜任数据分析?
  3. Android Pie提供了自适应供电、神经网络API 1.1等新特性
  4. 小菜学设计模式——高内聚、低耦合
  5. 某程序员对比美团和阿里的卷文化区别:美团重过程,死抠没用细节;阿里更自由,注重结果!...
  6. MyBatis千万级数据查询解决方案,避免OOM
  7. 说时间不够用,CTO怒了!让我学习:GTD时间管理,番茄工作法,三八理论
  8. Redis+Nginx+设计模式+Spring全家桶+Dubbo阿里P8技术精选文档
  9. Logstash 实践: 分布式系统的日志监控
  10. 边缘计算的三种模式:MEC、微云和雾计算