单链表:头结点和头指针的实现方式
链式存储是什么样的结构?
链式存储结构的特点使用任意的存储单元存储线性表的数据元素,存储单元可以使连续的也可以是不连续的,因此,为了表示每个数据元素和下一个元素的关系,除了存储本身的信息之外,还需要存储下一个元素的位置信息,将两部分信息组成的存储映像叫结点。它包括两个域,即数据域和指针域。
单链表有两种:带头结点的单链表,带头指针的单链表。
带头结点的单链表
结点的定义
定义结点时,头结点的数据域用于记录链表的长度。
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);}
}
单链表:头结点和头指针的实现方式相关推荐
- 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。
今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...
- 数据结构中的头结点和头指针
数据结构中的头结点和头指针 (1)头指针: 头指针指链表指向第一个结点的指针,头指针具有标识作用,若链表有头结点,那么头指针即为指向头结点的指针. (2)头结点:头结点是为了方便而设置,它放在链表中第 ...
- 头结点和头指针的区别
地址: 头指针和头结点的区别:头指针: 头结点: 地址: https://blog.csdn.net/u013593035/article/details/45953605?ops_request_m ...
- 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点
/*实验2 1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点 (low和high的值是多少可自由设计).并且要在程序中验证其功能实现. (可在实验1的第3题的基 ...
- 狸猫换太子--删除无头单链表中结点
狸猫换太子–删除无头单链表中结点 @(算法学习) 学习自<编程之美>. 很有意思的一种做法. 给定一个没有头指针的单链表,一个指针指向次单链表中的一个中间结点,删除此结点. 分析:这种根本 ...
- 数据结构:单链表——带头结点与不带头结点步骤详解
单链表:带头结点与不带头结点详解 在本人的另一篇文章中,通过java实现了带头结点和不带头结点的单链表,有兴趣的小伙伴可以去看下数据结构(一):链表(Linked List) 这两天回顾下链表的知识, ...
- 单链表———带头结点跟不带头结点的区别
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.单链表:带头结点跟不带头结点 二.使用步骤 总结 前言 数据结构中单链表的创建 带头结点跟不带头结点的区别 一.单 ...
- 软考题目之头结点、头指针和首元节点
遇到一个让人迷惑的题目. 以下关于线性表采用链式存储时删除节点运算的描述,正确的是() A.带头结点的线性链表删除结点时,不需要更改头指针. B.带头结点的线性链表删除第一个结点时,需要更改头指针. ...
- 单链表——指定结点的前插和后插
后插 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> typedef struct ...
最新文章
- Grails GORM查询总结
- Android Scroller与computeScroll方法的调用关系
- Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记
- 南开大学2014年高等代数部分试题解答
- linux下调试core的命令
- 设计一个处理两种类型地址的地址簿程序_编译器设计-符号表-中间代码生成
- CentOS更换网卡设置
- SOA_环境安装系列1_Oracle SOA Suite11g安装总括(案例)
- Kalman Filter
- 03:数据结构 栈、队列、链表与数组
- JDDroppableView
- 【TensorFlow】TensorFlow函数精讲之tf.train.exponential_decay()
- 关于复利2.0 3.0
- 20190827:(leetcode习题)合并两个有序链表
- html简单登录页面代码
- 传输层协议和应用层协议及它们之间的关系(端口)
- 2020年408真题_2020年港澳台联考真题——地理!
- 前后端分离之图片上传服务端处理方法(亲测通过)
- 深度学习平台、CPU和GPU使用
- 雷达扫描定位 android,Android仿微信雷达扫描
热门文章
- vs2017开发Node.js控制台程序
- R语言 、Excel哪个更能胜任数据分析?
- Android Pie提供了自适应供电、神经网络API 1.1等新特性
- 小菜学设计模式——高内聚、低耦合
- 某程序员对比美团和阿里的卷文化区别:美团重过程,死抠没用细节;阿里更自由,注重结果!...
- MyBatis千万级数据查询解决方案,避免OOM
- 说时间不够用,CTO怒了!让我学习:GTD时间管理,番茄工作法,三八理论
- Redis+Nginx+设计模式+Spring全家桶+Dubbo阿里P8技术精选文档
- Logstash 实践: 分布式系统的日志监控
- 边缘计算的三种模式:MEC、微云和雾计算