#include <iostream>using namespace std;int main()
{/*结点一般是在堆上申请空间的,申请的空间的地址在堆区上是“随机分配”的,即空间的地址是随机的,这也是为什么每一个结点的地址不一定相互连续*/typedef int SListType;typedef struct SListNode{SListType data;struct SListNode *next;//这里必须要用struct,而不能用 typedef,因为这是在函数体内部}SListNode;//以下实现的均为:单向不带头不循环链表//创建新结点:SListNode* BuySListNode(SListType x)//注意该函数的参数是单链表当中的数据域{SListNode *node = (SListNode *)malloc(sizeof(SListNode));node->data = x;node->next = NULL;return node;}//链表的尾插:void SListPushBack(SListNode **pplist, SListType x){SListNode *newnode = BuySListNode(x);//这里直接传入实际参数即可,无需连同类型一并传入if (*pplist == NULL){*pplist = newnode;//传二级指针的目的便是为了空链表的地址能够 真正的 指向 newnode}else{SListNode *tmp = *pplist;//目的是对传入的参数不作修改while (tmp->next != NULL)//这里不要忘掉在pplist的后面加上->next,因为null永远在尾结点的下一个位置{tmp = tmp->next;}tmp->next = newnode;//将新结点链接到原有链表之后/*pplist->data = x;  //这二者的实现已经在创建新结点的函数中被实现过,无需重复实现pplist->next = NULL;*/}        }//链表的头插:void SListPushFront(SListNode **pplist, SListType x){SListNode *newnode = BuySListNode(x);/*if (*pplist == NULL)//不同于链表的尾插,链表的头插无需对传入的链表是否为空链表进行判断{*pplist = newnode;}else{SListNode *tmp = *pplist;*pplist = newnode;*pplist->next = tmp;}*/newnode->next = *pplist;//这里的 newnode 即为该链表的头结点指针*pplist = newnode;}//链表的尾删:void SListPopBack(SListNode **pplist){SListNode *cur = *pplist,*tmp = NULL;if (*pplist == NULL)//这里如果不分情况讨论的话,则会对内存空间造成二次free,从而出错{cout << "该链表为空,无需进行尾删操作" << endl;return;}else if ((*pplist)->next == NULL)//注意这里存在的优先级问题,-> 的优先级大于 *{/*这里讨论传入的链表长度为1的原因是:在下面的链表长度 > 1 的代码实现中,程序不会进入while循环,所以tmp的值为随机值,就会引发报错*/free(*pplist) = NULL;*pplist = NULL;}else{while (cur->next != NULL){tmp = cur;cur = cur->next;}tmp->next = NULL;free(cur);cur = NULL;}//链表的头删:void SListNodePopFront(SListNode **pplist){SListNode *tmp = (*pplist)->next;//不要忽略了这里 * 与 -> 的优先级free(*pplist);*pplist = tmp;}//查找链表的结点:SListNode *SListFind(SListNode *pplist, SListType x){SListNode *cur = *pplist;while (cur->next != NULL){if (cur->data == x){return cur;}cur = cur->next;}return NULL; //不要忽略了在链表中没有找到的情况}//对链表中的其中一个结点进行后插void SListInsertAfter(SListNode *pos, SListType x)//因为有pos的地址,所以这里无需传入整个链表的地址{//法一:/*SListNode *tmp = pos->next;pos->next = BuySListNode(x);pos->next->next = tmp;*///法二:就要注意下面代码的先后顺序问题SListNode *newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;            }//对链表中的其中一个结点进行前插:/*注意:只要用到BuySLListNode()函数的地方,就得创建一个指针变量去存放这个新结点的地址*/void SListPushFront(SlistNode **pplist,SListNode *pos, SListType x)//此时就要传入整个链表的地址,因为这是前插,需要对链表进行遍历{SlistNode *newnode = BuySListNode(x);if (pos == *pplist){//此时相当于头插SListPushFront(pos, x);}else{SListNode *cur = *pplist, *tmp = NULL;while (cur != pos) //因为有 while 循环条件的限制,所以要对传入链表的长度分情况讨论{tmp = cur;cur = cur->next;}tmp->next = newnode;newnode->next = pos;}}//对某结点进行后删void SListPopBack(SListNode **pplist , SListNode *pos){if (pos->next == NULL)//此时无需进行删除,因为这是给定结点的后删{return;}else{pos->next = pos->next->next;free(pos->next);}}//销毁链表(也需要逐个去释放结点)void SListDestroy(SListNode **pplist){SListNode *cur = *pplist;while (cur != NULL){SListNode *tmp = cur->next;//使用一个临时变量去存储下一个结点的地址free(cur);cur = tmp;}*pplist = NULL;}}
}

【数据结构】单向不带头结点 非循环链表的 增,删,查,改 的实现相关推荐

  1. (不带头结点的)单链表增删查改,逆置单链表(两种方法),求两个单链表的第一个公共结点,合并两个单链表,单循环链表中判断第一个入环点,约瑟夫环

    补充了每个算法的基本思想,并且画了思路图,源代码都经过调试成功 1.SlistNode.c文件 (1) (不带头结点的)单链表增删查改 #include "SlistNode.h" ...

  2. 假设以带头结点的循环链表表示队列_数据结构·链表(C实现)

    1.前言 <数据结构>是每个程序猿都应该掌握的"必修课",是一门研究"计算机如何存储.数组数据方式"的学科.它虽不及其他招式花哨.但却总能在关键时刻 ...

  3. 数据结构——带头结点双向循环链表

    相比较与单链表,双向循环链表每个结点多了一个prev指针域,用于指向该结点的前驱,并且链表的头尾结点也用指针域相连.所以对于带头结点的双向循环链表的判空条件为head->next=head;除此 ...

  4. 假设以带头结点的循环链表表示队列_JavaScript数据结构之链表--设计

    上一篇文章中介绍了几种常见链表的含义,今天介绍下如何写出正确的链表代码. 如何表示链表 我们一般设计的链表有两个类.Node 类用来表示节点,LinkedList 类提供了一些辅助方法,比如说结点的增 ...

  5. 假设以带头结点的循环链表表示队列_[leetcode链表系列]2 删除链表中的节点

    复习链表的插入 链表的一个节点是由数据域和指针域构成,指针域的地址值为下个元素的地址.那么我们需要插入或者删除一个元素怎么处理呢? 先查看原始链表结构,准备将结点x插入链表中. 此时我们需要先保存n节 ...

  6. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)

    文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...

  7. 数据结构 严薇敏 顺序表的实现(增 删 改)及其使用方法详解

    时间复杂度 数据结构 时间复杂度和空间复杂度 目录 1.线性表 2.顺序表 2.1概念及结构 2.2 接口实现 SeqList.h SeqList.c 2.2.1初始化链表以及销毁链表的实现 初始化顺 ...

  8. 假设以带头结点的循环链表表示队列_关于反转链表,看这一篇就够了!

    本期例题:LeetCode 206 - Reverse Linked List[1](Easy) 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL ...

  9. 假设以带头结点的循环链表表示队列_真香!20张图揭开「队列」的迷雾,一目了然...

    https://mp.weixin.qq.com/s/GYQrxBOasKpvF4uZsMdOSw​mp.weixin.qq.com 队列的概念 首先我们联想一下链表,在单链表中,我们只能对他的链表表 ...

最新文章

  1. 别瞎操心了!机器人根本不会抢你的饭碗
  2. 限制域用户多点登录--脚本
  3. oracle和mysql查询_Oracle和MySQL分组查询GROUP BY
  4. boost::phoenix模块使用 istreambuf_iterator 测试 lambda 函数对象
  5. js for in 获得遍历数组索引和对象属性
  6. 漫画:如何给女朋友解释什么是策略模式?
  7. 如何在xcode中使用storyboard
  8. Python智能对话机器人实现
  9. 清华大学中文语音识别数据 THCHS30
  10. python deap_遗传算法库DEAP的示例代码的学习和分析
  11. 如何提高软件测试效率
  12. c语言课程设计作业,c语言课程设计心得体会
  13. 伸缩盒header固定content变更,footer固定
  14. mysql proxies priv_Mysql 5.7.18 利用MySQL proxies_priv实现类似用户组管理
  15. i3 10100f和i5 10400f 哪个好
  16. OSPF虚链接的基本配置
  17. 同指数幂相减公式_指数幂的指数幂的运算法则
  18. python图像处理opencv笔记(二):视频基本操作
  19. 易方达e钱包汇添富现金宝-竞品分析
  20. HTTP/2.0 中英文对照

热门文章

  1. Java--通过JDBC元数据获取表结构(ResultSetMetaData元数据的使用)
  2. Python学习笔记——爬虫之动态HTML处理和机器图像识别
  3. matlab一个图三种颜色,MATLAB:生成给定三种颜色的色彩图
  4. warning:ISO C90 forbids mixed declarations and code
  5. MATLAB实现LZW编码与解码
  6. 关于会声会影X3的安装和使用
  7. C#检测U盘是否插入
  8. 中国机械式停车设备深度调研与投资战略报告(2021版)
  9. 网络ping不通,试试这8招
  10. 留言提交成功页面html,织梦自定义表单自动获取用户IP、提交时间、留言页面的方法...