c语言单向循环链表实现增删,C语言单向非循环链表增删查改实现
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语言单向非循环链表增删查改实现相关推荐
- C语言实现链表【一】(无头单向非循环链表)
无头单向非循环链表 看到这个标题,是不是有小伙伴已经懵了呢? 只学过链表,怎么还有个无头和有头呢?怎么还有个循环和非循环呢?怎么还有个单向和双向呢?一连串的疑问... 其实这些都是链表的表示形式,只不 ...
- C语言学生成绩管理系统——检查学号姓名,双向循环链表
设计一个学生管理系统,存储学生的基本信息和成绩.我是用C语言写的,最近在学习C++,回过头看,C++的特性可以减少很多冗余的代码. 功能 增删查改以及排序,数据可保存到磁盘,每次初始化的时候读取文件信 ...
- c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...
对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便.我在<C语言实现双向非循环链表(不带头结点)的节点插入>中详细实现了在不带头结点的情况下的插入.这次我们将会来在使用头结点尾 ...
- C语言实现顺序表(增删查改等数据管理)
顺序表seqlist 小伙伴们,提到顺序表会想到什么呢? 数组?还是链表? 其实,数组和链表都是属于线性表,而链表在逻辑上是线性的,并非物理存储上也为线性:而数组无论在逻辑上还是物理存储上均为线性 所 ...
- 【数据结构】顺序表的增删查改 (C语言实现)
文章目录 一.线性表 二.顺序表 1.什么是顺序表 2.顺序表的分类 三.动态顺序表的实现 1.结构的定义 2.顺序表的初始化 3.检查容量 4.在头部插入数据 5.在尾部插入数据 6.在指定位置插入 ...
- 【数据结构】单链表的增删查改(C语言实现)
文章目录 前言 一.链表 1.链表的概念及结构 2.链表的分类 3.最常用的两种链表 二.单链表的实现 1.结构的定义 2.创建新节点 3.在头部插入数据 4.在尾部插入数据 5.查找数据 6.在po ...
- 【C++ 语言】vector 容器 ( 容器分类 | vector 声明 | vector 初始化 | vector 容器元素增删查改 )
文章目录 序列式容器 vector 简介 vector ( 向量 ) 头文件 vector ( 向量 ) 声明及初始化 vector ( 向量 ) 添加元素 vector ( 向量 ) 查询元素 ve ...
- C语言实现支持增删查改的通讯录
通讯录的实现: 正文开始@Assassin 目录: 通讯录的实现: 1. 创建基本信息结构体: 2. 创建通讯录结构体: 3. 初始化通讯录: 4. 添加联系人信息: 5. 查找联系人信息: 6. 删 ...
- C语言实现双向非循环链表(不带头结点)的基本操作
双向链表也叫双链表,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任何一个节点开始,都可以很方便的访问它的前驱结点和后继节点.别人常常来构造双向循环链表,今天我们特立 ...
最新文章
- bitcoin全节点部署及bitcoind bitcoin-cli命令使用解释
- 【技术综述】视频分类/行为识别研究综述,从数据集到方法
- “sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
- boost::neighbor_bfs_visitor用法的测试程序
- 13_Android的生命周期
- 全国计算机等级考试题库二级C操作题100套(第97套)
- Overview of HEVC之5 帧间预测
- 蓝桥杯 传球游戏 动态规划
- 原生js将数组分割成固定个数一组的小数组
- 【POJ3070】斐波那契数列f[n]的后四位,n达1e+9(矩阵快速幂模版题)
- Matlab——噪声的检测和处理实验
- 超详细的springBoot学习教程
- QTreeView样式
- Java练习题——运算符
- MySQL主从配置(Django实现主从配置读写分离)
- window.open打开txt文件
- matlab的setup阶跃曲线图,matlab 绘制系统的单位阶跃响应曲线 并编写程序求峰值时间 超调量 | 学步园...
- Python_pandas读取数据
- android按键静音键功能实现
- ES6最通俗易懂的超重点保姆级笔记!女朋友看了都流泪的学习秘籍!没有一句废话,全部都是满满干货!