当前位置: 首页 > news >正文

数据结构单链表的实现(C语言)

目录

  • 1.实现的接口和功能
  • 2.代码块

1.实现的接口和功能

//打印链表
void SLTPrint(SLTNode** phead);
//头插
void PushFont(SLTNode** phead, SLTDataType x);
//尾插
void PushBack(SLTNode** phead, SLTDataType x);
//头删
void PopFont(SLTNode** phead);
//尾删
void PopBack(SLTNode** phead);
//删除链表
void Destory(SLTNode** phead);
//创建一个结点
SLTNode* Create(SLTDataType x);
//查找x的结点
SLTNode* Find(SLTNode** phead,SLTDataType x);
//查找指定结点并删除
void FindDele(SLTNode** phead, SLTDataType x);
//删除指定结点的下一个结点
void Delenext(SLTNode** phead, SLTDataType* pos);
//删除指定结点的上一个结点
void DeleAfter(SLTNode** phead, SLTDataType* pos);

2.代码块

声明代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLTDataType;
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;
//打印链表
void SLTPrint(SLTNode** phead);
//头插
void PushFont(SLTNode** phead, SLTDataType x);
//尾插
void PushBack(SLTNode** phead, SLTDataType x);
//头删
void PopFont(SLTNode** phead);
//尾删
void PopBack(SLTNode** phead);
//删除链表
void Destory(SLTNode** phead);
//创建一个结点
SLTNode* Create(SLTDataType x);
//查找x的结点
SLTNode* Find(SLTNode** phead,SLTDataType x);
//查找指定结点并删除
void FindDele(SLTNode** phead, SLTDataType x);
//删除指定结点的下一个结点
void Delenext(SLTNode** phead, SLTDataType* pos);
//删除指定结点的上一个结点
void DeleAfter(SLTNode** phead, SLTDataType* pos);

实现代码:

#include"SList.h"
SLTNode* Create(SLTDataType x)
{SLTNode* list = (SLTNode*)malloc(sizeof(SLTNode));if (list == NULL){perror("malloc fail\n");}list->next = NULL;list->data = x;return list;
}
void SLTPrint(SLTNode** phead)
{assert(*phead);SLTNode* list = *phead;while (list){printf("%d ", list->data);list = list->next;}printf("\n");
}
void PushFont(SLTNode** phead, SLTDataType x)
{SLTNode* p = Create(x);if (*phead == NULL){*phead = p;}else{p->next = *phead;*phead = p;}}
void PushBack(SLTNode** phead, SLTDataType x)
{SLTNode* p = Create(x);if (*phead == NULL){*phead = p;}SLTNode* prev = NULL;SLTNode* ps = *phead;while (ps){prev = ps;ps = ps->next;}prev->next = p;}
void PopFont(SLTNode** phead)
{assert(*phead);SLTNode* p = (*phead)->next;free(*phead);*phead = p;
}
void PopBack(SLTNode** phead)
{assert(*phead);if ((*phead)->next == NULL){free(*phead);*phead = NULL;}SLTNode* p = *phead;SLTNode* prev = NULL;while (p->next){prev = p;p = p->next;}free(p);prev->next = NULL;
}
SLTNode* Find(SLTNode** phead, SLTDataType x)
{assert(*phead);SLTNode* p = *phead;while (p->data!=x){p = p->next;}if (p->data == x)return p;elsereturn NULL;
}
void FindDele(SLTNode** phead, SLTDataType x)
{assert(*phead);SLTNode* p = *phead; SLTNode* prev = NULL;while (p!=NULL&&p->data!=x){  prev = p;p = p->next;}if (p->data == x){prev->next = p->next;free(p);}}
void Destory(SLTNode** phead)
{assert(*phead);SLTNode* later = NULL;SLTNode *p= *phead;while (p){later = p->next;free(p);p = later;}
}
void Delenext(SLTNode** phead, SLTDataType* pos)
{assert(phead);SLTNode* p = *phead;while (p != pos){p = p->next;}if (p->next == NULL){return;}SLTNode* ps = p->next;p->next = p->next->next;free(ps);
}
void DeleAfter(SLTNode** phead, SLTDataType* pos)
{assert(phead);assert(&phead);if ((*phead)->next == NULL){return;}SLTNode* p = *phead;SLTNode* prev = NULL;while (p->next!= pos){prev = p;p = p->next;}if (prev == NULL){*phead = p->next;return;}prev->next = p->next;free(p);
}

测试用例代码:

#include"SList.h"
int main()
{SLTNode* list = NULL;PushFont(&list,1);PushFont(&list, 2);PushFont(&list, 3);PushBack(&list,4);PushBack(&list, 5);PushBack(&list, 6);SLTPrint(&list);PopFont(&list);PopBack(&list);SLTPrint(&list);FindDele(&list, 5);SLTNode*p= Find(&list,4);SLTNode* ps = Find(&list, 1);Delenext(&list,p);SLTPrint(&list);DeleAfter(&list, ps);SLTPrint(&list);Destory(&list);return 0;
}

结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

相关文章:

  • 【kubernetes】Debian使用Kubeadm部署Kubernetes失败:Connection Refused
  • 【Linux】权限
  • 京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜
  • 039-第三代软件开发-PDF阅读器
  • 21.12 Python 实现网站服务器
  • Kali安装docker
  • ES6中的class类
  • k8s replicaSet,deployment 学习笔记
  • Prometheus接入AlterManager配置钉钉告警(基于K8S环境部署)
  • Vue Router:让你的应用路由起来!
  • 磁盘调度算法之先来先服务(FCFS),最短寻找时间优先(SSTF),扫描算法(SCAN,电梯算法),LOOK调度算法
  • 前端页面如何自适应--4种方法
  • Python类的常用特殊方法
  • DoLa:对比层解码提高大型语言模型的事实性
  • toluaframework中C#怎么调用Lua的方法以及无GC方法
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Angular 响应式表单 基础例子
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Javascript Math对象和Date对象常用方法详解
  • Java的Interrupt与线程中断
  • java中具有继承关系的类及其对象初始化顺序
  • php的插入排序,通过双层for循环
  • PHP面试之三:MySQL数据库
  • Python进阶细节
  • React16时代,该用什么姿势写 React ?
  • vue学习系列(二)vue-cli
  • 搞机器学习要哪些技能
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 每天10道Java面试题,跟我走,offer有!
  • 如何胜任知名企业的商业数据分析师?
  • 如何使用 JavaScript 解析 URL
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 手机端车牌号码键盘的vue组件
  • 用Canvas画一棵二叉树
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 智能网联汽车信息安全
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (09)Hive——CTE 公共表达式
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (poj1.2.1)1970(筛选法模拟)
  • (搬运以学习)flask 上下文的实现
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (循环依赖问题)学习spring的第九天
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .gitignore
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。