单链表

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

  1. 单向、双向
  2. 带头、不带头
  3. 循环、非循环

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:

  1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图的邻接表等等。另外这种结构在学校的考试中出现很多。
  2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向 循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而 简单了

实现不带头单链表以及相关操作

头文件

#pragma oncetypedef int SLDateType;//一个结点
typedef struct SLNode{SLDateType value;struct SLNode *next;
}   SListNode;//不带头动态链表
typedef struct SList{SListNode *first;
}SList;//初始化
void SListInit(SList *list);
//销毁
void SListDestroy(SList *list);
//增
//头插
void SListPushFront(SList *list, SLDateType value);
//尾插
void SListPushBack(SList *list, SLDateType value);//删
//头删
void SListPopFront(SList *list);
//尾删
void SListPopBack(SList *list);//打印
void SListPrint(const SList *list);//改
void SListUpdata(SListNode *node, SLDateType value);//查
//去查找链表中遇到的第一个value,如果没找到,返回NULL
SListNode *SListFind(const SList *list, SLDateType value);//打印
void SListPrint(const SList *list);void SListInsertBefore(SList *list, SListNode *pos, SLDateType value);
// 在pos的后面插入
void SListInsertAfter(SListNode *pos,SLDateType value);
// 删除pos位置的节点
void SListEraseAfter(SListNode *pos);
void ListRemove();

功能实现

#include"SList.h"
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>
#include<stdio.h>//初始化
void SListInit(SList *list){assert(list != NULL);list->first = NULL;
}//申请新结点
SListNode* BuyNode(SLDateType value){SListNode *node = (SListNode*)malloc(sizeof(SListNode));assert(node);node->value = value;node->next = NULL;return node;
}
//头插
void SListPushFront(SList *list, SLDateType value){SListNode *node = (SListNode*)malloc(sizeof(SListNode));assert(node);node->value = value;node->next = list->first;list->first = node;
}//头删
void SListPopFront(SList *list){assert(list != NULL);       //链表存在assert(list->first != NULL);  //链表不为空,里面有结点SListNode *old_first = list->first;list->first = list->first->next;free(old_first);
}
//尾插
void SListPushBack(SList *list, SLDateType value){assert(list != NULL);if (list->first == NULL){ //链表中没有结点的情况就跟头插的情况是一样的SListPushFront(list, value);return;}//链表中有结点的情况SListNode *cur;for (cur = list->first; cur->next != NULL; cur = cur->next);//cur就是最后一个结点SListNode *node = BuyNode(value);cur->next = node;
}//尾删
void SListPopBack(SList *list){assert(list != NULL);assert(list->first != NULL);//只有一个结点if (list->first->next == NULL){SListPopFront(list);return;}SListNode *cur = list->first;while (cur->next->next != NULL){cur = cur->next;}free(cur->next);cur->next = NULL;
}//销毁
void SListDestroy(SList *list){assert(list != NULL);SListNode *cur = list->first;SListNode *next;while (cur!=NULL){next = cur->next;free(cur);cur = cur->next;}list->first = NULL;
}//打印
void SListPrint(const SList *list){for (SListNode *cur = list->first; cur != NULL; cur = cur->next){printf("%d--->", cur->value);}printf("\n");
}//改
void SListUpdata(SListNode *node, SLDateType value){node->value = value;
}//去查找链表中遇到的第一个value,如果没找到,返回NULL
SListNode *SListFind(const SList *list, SLDateType value){for (SListNode *cur = list->first; cur != NULL; cur = cur->next){if (cur->value == value){return cur;}}return NULL;
}//pos 一定是链表中有效结点
//向后面插入
void SListInsertAfter(SListNode *pos, SLDateType value){SListNode *node = BuyNode(value); //申请结点node->next = pos->next;pos->next = node;
}// 删除pos后面位置的节点
void SListEraseAfter(SListNode *pos){SListNode *next = pos->next;pos->next = next->next;free(next);}//向pos前面插入
void SListInsertBefore(SList *list, SListNode *pos, SLDateType value){SListNode *cur;SListNode *node = BuyNode(value);for (cur = list->first; cur->next != pos; cur = cur->next);node->next = pos;cur->next = node;
}

测试用例

#include"SList.h"
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>void TestList1(){SList list;SListInit(&list);assert(list.first == NULL);/*SListPushFront(&list, 1);SListPushFront(&list, 2);SListPushFront(&list, 3);//3 2 1*/SListPushBack(&list, 11);SListPushBack(&list, 12);SListPushBack(&list, 13);//3 2 1 11 12 13/*SListPopBack(&list);SListPopBack(&list);SListPopBack(&list);*/SListNode *n12 = SListFind(&list, 12);assert(n12 != NULL);SListPrint(&list);SListInsertAfter(n12, 103);SListPrint(&list);SListEraseAfter(n12);SListPrint(&list);SListInsertBefore(&list,n12, 101);SListPrint(&list);printf("大成功\n");
}int main()
{TestList1();system("pause");return 0;
}

再写单链表(不带头单链表)相关推荐

  1. 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现

    写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...

  2. 单链表(带头结点)的存储结构与基本操作(c语言)------亲测可用

    编程语言:c语言 编译环境:Dev-c++ 实现功能:实现功能:单链表(带头结点)结点结构体的定义,单链表(带头结点)初始化.求元素个数.插入元素.删除元素.取元素.打印所有元素.就地逆置.撤销的操作 ...

  3. C++ 单链表(带头结点)

    文章目录 总结归纳 代码实现 总结归纳 头结点可以没有,头指针必须有.访问整个链表,是用过遍历头指针来进行的. 这里没有特别的设置一个头指针,因为当指针指向整个链表 L 时,该指针的实现效果就是头指针 ...

  4. 带头单链表Java实现

    目录 带头单链表 一.概念 二.要点总结 三.代码实现 1. 类结构 2. 带头单链表的遍历 3. 插入结点 3. 1. 头插法 3.2. 指定索引处插入结点 3.3 尾插法 4. 删除结点 4.1. ...

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

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

  6. Java设计链表(不带头结点的单链表)

    设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...

  7. C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

    http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...

  8. 头插法建立单链表(带头结点和不带头结点)

    头插法建立单链表(带头结点) #include <stdio.h> #include <stdlib.h> typedef struct LNode{        //定义单 ...

  9. 试写一算法,对单链表进行逆置

    NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行. 环境: vscode 题目: 试写一算法,对单链表进行逆置 分析: 单链表的逆置需要设置两个指针,第一个进行遍历单链表:第二个进 ...

最新文章

  1. 电脑硬件配置——组装查询软件
  2. 脑与认知科学2 脑神经电生理学上
  3. SEO:影响网站排名的一些问题
  4. Python二分查找的三种思路
  5. 数据存储方案-闭包表
  6. ICCV2017 论文解读:基于图像检索的行人重识别 | PaperDaily #13
  7. 离线转义 reactjs JSX
  8. ios开发 多人语音聊天_手游语音市场的现状、机遇与挑战
  9. 跨浏览器开发:CSS代码的金科玉律
  10. RFileWriteStream 写入汉字
  11. [mybatis]typeHandlers日期类型的处理
  12. 【德国】德累斯顿工业大学 机器学习和图像分析研究助理/博士生 招生
  13. 专业英语笔记(Line Feed and Type Conversion)
  14. 击鼓传花:对比 muduo 与 libevent2 的事件处理效率
  15. java如何实现进程间的通信?
  16. 熠新科技亮相2019中国光纤传感学术会议暨产业化论坛
  17. 微信小程序 集成腾讯云IM做的聊天室
  18. 好听又好看!歌曲视频制作,手把手教你制作音乐视频
  19. SAP ABAP ZBA_R001 查询用户下的角色,事务代码
  20. 计算机有哪些值得参加的比赛

热门文章

  1. 000 快速排序算法
  2. edger多组差异性分析_简单使用DESeq2/EdgeR做差异分析
  3. mysql 包 过程 job_mysql job实例全过程
  4. 基于java的网上花店销售系统_基于web的花店销售系统的设计与实现
  5. new失败跟踪函数_WinDbg预览时间线:调试器中的时间线可以允许用户记录跟踪
  6. 周期均方根和有效值的区别_黑猪肉和白猪肉有啥区别?
  7. 可消费消息数量_17 个方面,综合对比 主流消息队列
  8. @select 怎么写存储过程_MySQL4:存储过程和函数
  9. 10位IT领袖给应届毕业生的10条忠告
  10. 靶场练习第二十天~vulnhub靶场之Funbox: Scriptkiddie