SList.h

#ifndef _SLIST_H_

#define _SLIST_H_

#include#include#include// 1、无头单向非循环链表增删查改实现

typedef int SLTDataType;

typedef struct SListNode

{

SLTDataType _data;

struct SListNode* _next;

}SListNode;

typedef struct SList

{

SListNode* _head;

}SList;

void SListInit(SList* plist);

void SListDestory(SList* plist);

SListNode* BuySListNode(SLTDataType x);

void SListPushFront(SList* plist, SLTDataType x);

void SListPopFront(SList* plist);

SListNode* SListFind(SList* plist, SLTDataType x);

// 在pos的后面进行插入

void SListInsertAfter(SListNode* pos, SLTDataType x);

// 在pos的前面进行插入

void SListEraseAfter(SListNode* pos);

void SListRemove(SList* plist, SLTDataType x);

void SListPrint(SList* plist);

#endif/*_SLIST_H_*/

SList.c

#include"SList.h"

void SListInit(SList* plist)

{

plist->_head = NULL;

}

void SListDestory(SList* plist)//销毁

{

if (plist->_head!= NULL)

{

SListNode* pt = plist->_head;

while (pt!= NULL)

{

SListNode* t = pt;

pt = pt->_next;

free(t);

}

plist->_head = NULL;

}

}

SListNode* BuySListNode(SLTDataType x)//创建结点

{

SListNode* pt;

pt = (SListNode*)malloc(sizeof(SListNode));

if (pt == NULL)

{

printf("创建结点失败\n");

return NULL;

}

pt->_data = x;

pt->_next = NULL;

return pt;

}

void SListPushFront(SList* plist, SLTDataType x)//头插

{

SListNode* node = BuySListNode(x);

if (node != NULL)

{

node->_next = plist->_head;

plist->_head = node;

}

}

void SListPopFront(SList* plist)//头删

{

if (plist->_head != NULL)

{

SListNode* pt = plist->_head;

plist->_head = pt->_next;

free(pt);

}

}

SListNode* SListFind(SList* plist, SLTDataType x)//查询指定值

{

SListNode* pt = plist->_head;

while (pt!= NULL)

{

if (pt->_data == x)

return pt;

else

pt = pt->_next;

}

return NULL;

}

void SListInsertAfter(SListNode* pos, SLTDataType x)//后插

{

SListNode* node = BuySListNode(x);

node->_next = pos->_next;

pos->_next = node;

}

void SListEraseAfter(SListNode* pos)//删除pos+1位置结点

{

SListNode* pt = pos->_next;

pos->_next = pos->_next->_next;

free(pt);

}

void SListRemove(SList* plist, SLTDataType x)//删除值为x的结点

{

while (plist->_head != NULL&&plist->_head->_data == x)

{

SListPopFront(plist);

}

if (plist->_head == NULL)

return;

SListNode* ph = plist->_head;

SListNode* pt = ph->_next;

while (pt != NULL)

{

if (pt->_data == x)

{

pt = pt->_next;

SListEraseAfter(ph);

ph->_next = pt;

continue;

}

pt = pt->_next;

ph = ph->_next;

}

}

void SListPrint(SList* plist)

{

SListNode* pt = plist->_head;

while (pt != NULL)

{

printf("%d ", pt->_data);

pt = pt->_next;

}

printf("\n");

}

void SListReverse(SList* plist)//链表置逆

{

SListNode* head = plist->_head;

SListNode* ph = plist->_head;

SListNode* pt = ph->_next;

while (pt != NULL)

{

ph->_next = pt->_next;

pt->_next = head;

head = pt;

pt = ph->_next;

}

plist->_head = head;

}

SListNode* FindCommonNode(SListNode* p1, SListNode* p2)//找第一个公共结点

{

int len1 = 0, len2 = 0;

SListNode *pt1 = p1, *pt2 = p2;

int i;

while (pt1 != NULL)

{

len1++;

pt1 = pt1->_next;

}

while (pt2 != NULL)

{

len2++;

pt2 = pt2->_next;

}

if (len1 > len2)

{

for (i = 0; i < len1 - len2; i++)

p1 = p1->_next;

}

else

{

for (i = 0; i < len2 - len1; i++)

p2 = p2->_next;

}

do

{

if (p1 == p2)

return p1;

p1 = p1->_next;

p2 = p2->_next;

} while (p1 != NULL);

return NULL;

}

int judgeLoop(SList* list)//判断是否成环

{

SListNode *p1 = list->_head;

SListNode *p2 = list->_head->_next;

while (p1 != NULL&&p2 != NULL)

{

if (p1 == p2)

return 1;

p1 = p1->_next;

if (p2->_next == NULL)

return 0;

p2 = p2->_next->_next;

}

return 0;

}

SListNode *FindEntrance(SList *phead)//找入环第一个结点

{

SListNode *slow = phead->_head;

SListNode *fast = phead->_head;

while (slow != NULL&&fast != NULL)

{

slow = slow->_next;

if (fast->_next == NULL)

return NULL;

fast = fast->_next->_next;

if (slow == fast)

{

fast = phead->_head;

while (slow != fast)

{

slow = slow->_next;

fast = fast->_next;

}

return slow;

}

}

return NULL;

}

main.c

#include"SList.h"

int main()

{

SList test;

SListInit(&test);

SListPushFront(&test, 1);

SListPushFront(&test, 5);

SListPushFront(&test, 3);

SListNode* pt = test._head->_next->_next;

SListInsertAfter(pt, 5);

SListInsertAfter(pt, 5);

SListInsertAfter(pt, 6);

SListPrint(&test);

SListRemove(&test, 5);

SListPrint(&test);

system("pause");

return 0;

}

c语言单向循环链表实现增删,C语言单向非循环链表增删查改实现相关推荐

  1. C语言实现链表【一】(无头单向非循环链表)

    无头单向非循环链表 看到这个标题,是不是有小伙伴已经懵了呢? 只学过链表,怎么还有个无头和有头呢?怎么还有个循环和非循环呢?怎么还有个单向和双向呢?一连串的疑问... 其实这些都是链表的表示形式,只不 ...

  2. C语言学生成绩管理系统——检查学号姓名,双向循环链表

    设计一个学生管理系统,存储学生的基本信息和成绩.我是用C语言写的,最近在学习C++,回过头看,C++的特性可以减少很多冗余的代码. 功能 增删查改以及排序,数据可保存到磁盘,每次初始化的时候读取文件信 ...

  3. c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...

    对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾 ...

  4. C语言实现顺序表(增删查改等数据管理)

    顺序表seqlist 小伙伴们,提到顺序表会想到什么呢? 数组?还是链表? 其实,数组和链表都是属于线性表,而链表在逻辑上是线性的,并非物理存储上也为线性:而数组无论在逻辑上还是物理存储上均为线性 所 ...

  5. 【数据结构】顺序表的增删查改 (C语言实现)

    文章目录 一.线性表 二.顺序表 1.什么是顺序表 2.顺序表的分类 三.动态顺序表的实现 1.结构的定义 2.顺序表的初始化 3.检查容量 4.在头部插入数据 5.在尾部插入数据 6.在指定位置插入 ...

  6. 【数据结构】单链表的增删查改(C语言实现)

    文章目录 前言 一.链表 1.链表的概念及结构 2.链表的分类 3.最常用的两种链表 二.单链表的实现 1.结构的定义 2.创建新节点 3.在头部插入数据 4.在尾部插入数据 5.查找数据 6.在po ...

  7. 【C++ 语言】vector 容器 ( 容器分类 | vector 声明 | vector 初始化 | vector 容器元素增删查改 )

    文章目录 序列式容器 vector 简介 vector ( 向量 ) 头文件 vector ( 向量 ) 声明及初始化 vector ( 向量 ) 添加元素 vector ( 向量 ) 查询元素 ve ...

  8. C语言实现支持增删查改的通讯录

    通讯录的实现: 正文开始@Assassin 目录: 通讯录的实现: 1. 创建基本信息结构体: 2. 创建通讯录结构体: 3. 初始化通讯录: 4. 添加联系人信息: 5. 查找联系人信息: 6. 删 ...

  9. C语言实现双向非循环链表(不带头结点)的基本操作

    双向链表也叫双链表,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任何一个节点开始,都可以很方便的访问它的前驱结点和后继节点.别人常常来构造双向循环链表,今天我们特立 ...

最新文章

  1. bitcoin全节点部署及bitcoind bitcoin-cli命令使用解释
  2. 【技术综述】视频分类/行为识别研究综述,从数据集到方法
  3. “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
  4. boost::neighbor_bfs_visitor用法的测试程序
  5. 13_Android的生命周期
  6. 全国计算机等级考试题库二级C操作题100套(第97套)
  7. Overview of HEVC之5 帧间预测
  8. 蓝桥杯 传球游戏 动态规划
  9. 原生js将数组分割成固定个数一组的小数组
  10. 【POJ3070】斐波那契数列f[n]的后四位,n达1e+9(矩阵快速幂模版题)
  11. Matlab——噪声的检测和处理实验
  12. 超详细的springBoot学习教程
  13. QTreeView样式
  14. Java练习题——运算符
  15. MySQL主从配置(Django实现主从配置读写分离)
  16. window.open打开txt文件
  17. matlab的setup阶跃曲线图,matlab 绘制系统的单位阶跃响应曲线 并编写程序求峰值时间 超调量 | 学步园...
  18. Python_pandas读取数据
  19. android按键静音键功能实现
  20. ES6最通俗易懂的超重点保姆级笔记!女朋友看了都流泪的学习秘籍!没有一句废话,全部都是满满干货!

热门文章

  1. setsockopt()改善程序的健壮性
  2. C语言和设计模式(适配器模式)
  3. linux怎么退出telnet端口,CentOS下怎么退出telnet
  4. 路由删除命令_清除思科路由器配置信息的两种方法
  5. 安装两个mysql3308_在同一台机器上安装两个版本的MySQL
  6. Linux系统常用命令,指令详解及案例
  7. sql server 查看表、视图、触发器、存储过程等组成sql查询语句
  8. 消息通知系统模型设计
  9. Django学习1---安装Django,创建、启动项目
  10. Hadoop Hive概念学习系列之HiveQL编译基础(十)