单链表基本操作的实现,初始化,头插,尾插,判空,获取个数,查找,删除,获取前置和后置位,清空,销毁

目录

一.单链表的设计

二.单链表的实现

三.单链表的总结


一.单链表的设计

1.单链表的结构定义:

typedef struct Node{int data;//数据域struct Node* next;//后继指针}Node,*List;

2.单链表的设计示意图:

3.注意,单链表的最后一个节点的next域为NULL;

4.为什么要有一个头节点?(简单方便,不用传二级指针);

二.单链表的实现

//初始化
void InitList(List plist)
{assert(plist != NULL);if (plist == NULL)return;//plist->data;//头节点的数据域不使用plist->next = NULL;
}//考试重点
//头插
bool Insert_head(List plist, int val)
{assert(plist != NULL);if (plist == NULL)return false;//动态申请一个节点Node* p = (Node *)malloc(sizeof(Node));assert(p != NULL);//将数据val放入到新节点p->data = val;//插入新节点p->next = plist->next;plist->next = p;return true;
}//考试重点
//尾插
bool Insert_tail(List plist, int val)
{assert(plist != NULL);if (plist == NULL)return false;//申请节点Node* p = (Node*)malloc(sizeof(Node));assert(p != NULL);//将数据val放入到新节点p->data = val;//找尾巴Node* q;for(q=plist;q->next!=NULL;q=q->next){;}//插入新节点p->next = q->next;//p->next=NULL;q->next = p;return true;
}//插入数据,在plist链表的pos位置插入val;
bool Insert(List plist, int pos, int val)
{assert(plist != NULL);if (plist == NULL)return false;if (pos<0 || pos>GetLength(plist)){return false;}Node* p = (Node*)malloc(sizeof(Node));assert(p != NULL);p->data = val;//找到位置Node* q;int i;for (q = plist, i = 0; i < pos; i++, q = q->next){;}// 插入p->next = q->next;q->next = p;return true;
}//判空
bool IsEmpty(List plist)
{assert(plist != NULL);if (plist == NULL)return false;return plist->next == NULL;
}//获取数据节点的个数
int GetLength(List plist)
{assert(plist != NULL);if (plist == NULL)return 0;int count = 0;for (Node* p = plist->next; p!= NULL; p = p->next){count++;}return count;}//在plist中查找第一个key值,找到返回节点地址,没有找到返回NULL;
Node* Search(List plist, int key)
{assert(plist != NULL);if (plist == NULL)return NULL;for (Node* p = plist->next; p != NULL; p = p -> next){if (p->data == key){return p;}}return NULL;
}//删除pos位置的值
bool DelPos(List plist, int pos)
{assert(plist != NULL);if (plist == NULL)return false;if (pos < 0 || pos >= GetLength(plist)){return false;}Node* p;int i;for (p = plist, i = 0; i < pos; i++, p = p->next){;}//删除p后面的节点Node* q = p->next;p->next = q->next;free(q);return true;
}//考试重点
//删除第一个val的值
bool DelVal(List plist, int val)
{Node* p = GetPrio(plist, val);if (p == NULL)return false;Node* q = p->next;//删除qp->next = q->next;//p->next=p->next->next;//释放qfree(q);return true;
}//返回key的前驱地址,如果不存在返回NULL;
Node* GetPrio(List plist, int key)
{for (Node* p = plist; p->next != NULL; p = p->next){if (p->next->data == key)return p;}return NULL;
}//返回key的后继地址,如果不存在返回NULL;
Node* GetNext(List plist, int key)
{assert(plist != NULL);if (plist == NULL)return NULL;Node* p = Search(plist, key);if (p == NULL)return NULL;return p->next;
}//输出
void Show(List plist)
{//注意,头节点不能访问datafor (Node* p = plist->next; p != NULL; p = p->next){printf("%d ", p->data);}printf("\n");
}//清空数据
void Clear(List plist)
{Destroy(plist);
}void Destroy(List plist)
{//总是删除第一个数据节点Node* p;while (plist->next != NULL){p = plist->next;plist->next = p->next;free(p);//error//plist->next = plist->next->next;//free(plist->next);}
}

三.单链表的总结

1.单链表的特点:
头插,头删 时间复杂度是O(1)
尾插,尾删 时间复杂度是O(n)

2.P初始化成什么?

如果我们要修改表的结构(或者说依赖于前驱,比如插入,删除):遍历:

for(Node *p=plist;p->next!=NULL;p=p->next)

如果我们不修改表的结构(或者说不依赖于前驱, 比如求长度,打印,查找) :遍历:

for (Node* p = plist->next; p != NULL; p = p->next)

3.注意考点:头插,尾插,按值删除;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/160015.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0006Java安卓程序设计-ssm基于Android的校园二手商品交易平台

文章目录 **摘** **要****目** **录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 随着毕业季的来临以及当代大学生的消费力购买力的不断增强&#xff0c;我们的寝室中囤积了很多二手商品&#xff0c;有很多是…

智能电表和互感器一起安装有什么效果?

智能电表和互感器的普及&#xff0c;为用电管理提供了更为精确和便捷的方式。那么&#xff0c;当智能电表和互感器一起安装时&#xff0c;会产生怎样的"化学反应"呢&#xff1f;下面&#xff0c;小编就来为大家详细的讲解下智能电表和互感器一起安装的作用吧&#xf…

服务上千家企业,矩阵通2.0重磅上线,全链路管理新媒体矩阵

自上线以来 矩阵通已服务了上千家企业级客户 覆盖汽车、家居、媒体、金融、教育等多个行业 矩阵通1.0时代 我们以“数据”为基座打造出10功能 帮助企业轻松管理新媒体矩阵 实现账号管理、数据分析、竞对监测、 人员考核、风险监管等需求 而现在 矩阵通2.0重磅上线 新增…

Keras人工智能神经网络 Regressor 回归 神经网络搭建

前期分享了使用tensorflow来进行神经网络的回归&#xff0c;tensorflow构建神经网络 本期我们来使用Keras来搭建一个简单的神经网络 Keras神经网络可以用来模拟回归问题 (regression)&#xff0c;例如给下面一组数据&#xff0c;用一条线来对数据进行拟合&#xff0c;并可以预…

ActiveMQ是什么?-九五小庞

MQ是消息中间件&#xff0c;是一种在分布式系统中应用程序借以传递消息的媒介&#xff0c;常用的有ActiveMQ&#xff0c;RabbitMQ&#xff0c;kafka。ActiveMQ是Apache下的开源项目&#xff0c;完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。特点&#xff1a;1、支持多种语言…

机器学习快速入门教程 Scikit-Learn实现

机器学习是什么? 机器学习是一帮计算机科学家想让计算机像人一样思考所研发出来的计算机理论。他们曾经说过,人和计算机其实本没有差别,同样都是一大批互相连接的信息传递和存储元素所组成的系统。所以有了这样的想法,加上他们得天独厚的数学功底,机器学习的前身也就孕育而生…

Linux学习笔记之二(环境变量)

Linux learning note 1、环境变量1.1、修好PATH环境变量 1、环境变量 环境变量(environment variables)即系统运行的一些环境参数。主要的环境变量有以下这些&#xff1a; PATH&#xff1a;决定了系统查找可执行文件的目录范围。HOME&#xff1a;指定当前用户的主目录路径。U…

python 数据挖掘库orange3 介绍

orange3 是一个非常适合初学者的data mining library. 它让使用者通过拖拽内置的组件来形成工作流。让你不需要写任何代码就可以体验到数据挖掘和可视化的魅力。 它的桌面如下&#xff0c;这里我创建了 3 个节点&#xff0c;分别是数据集、小提琴图&#xff0c;散点图 其中 …

C++笔记之vector的成员函数swap()和data()

C笔记之vector的成员函数swap()和data() 标准C中的std::vector类确实有swap()和data()这两个成员函数。下面是它们的简要描述&#xff1a; swap(): std::vector的swap()成员函数用于交换两个向量的内容&#xff0c;实现了高效的交换操作&#xff0c;不需要复制向量的元素。这…

儿童听力损伤了,家长怎么办?

很多家长对儿童听力损伤问题存在较大误区&#xff0c;认为儿童除了先天性耳聋以外不会有听力问题。家长总认为孩子上课或做事不专心是因为注意力不集中、多动等问题所致&#xff0c;大部分家长没有意识到孩子可能出现了听力损伤问题。 儿童听力损伤主要是指因各种原因导致双耳不…

数据结构(超详细讲解!!)第二十节 数组

1.定义 1.概念 相同类型的数据元素的集合。 记作&#xff1a;A(A0,A1,…,Am-1) 二维数组可看作是每个数据元素都是相同类型的一维数组的一维数组。多维数组依此类推。 二维数组是数据元素为线性表的线性表。 A(A0&#xff0c;A1&#xff0c;……&#xff0c;An-1) 其中…

JumpServer开源堡垒机与万里安全数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经与万里安全数据库软件GreatDB完成兼容性认证。针对产品的功能、性能、兼容性方面&#xff0c;经过双方共同测试&#xff0c;万里安全数据库软件&#xff08;简称&#xff1a;…