头文件:

#ifndef _LINKLIST_H_
#define _LINKLIST_H_typedef void LinkList; //将数据的类型分离,相当于句柄//只是一个小节点 包含着位置信息!
typedef struct _tag_LinkListNode
{struct _tag_LinkListNode* next;
}LinkListNode;//生成一个链表
LinkList* LinkList_Create();
//删除一个链表
void LinkList_Destory(LinkList* list);
//清空一个链表
void LinkList_Clear(LinkList* list);
//链表长度
int LinkList_Length(LinkList* list);
//在某个位置插入一个节点
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
//获取某个位置的节点
LinkListNode* LinkList_Get(LinkList* list, int pos);
//删除某个位置的节点
LinkListNode* LinkList_Delete(LinkList* list, int pos);#endif

CPP文件:

#include "linkList.h"
#include <iostream>
using namespace std;//定义一个链表头
typedef struct _tag_LinkList
{LinkListNode header;    //定义一个头结点int length;}tagList;//生成一个链表
LinkList* LinkList_Create()
{tagList * ret = NULL;ret = (tagList *)malloc(sizeof(tagList));  //分配内存memset(ret, 0, sizeof(tagList));            //memset快速填充
 ret->header.next = NULL;              //头结点的Next指向NULLret->length = 0;return ret;
}
//删除一个链表
void LinkList_Destory(LinkList* list)
{//异常处理if (list != NULL){free(list);list = NULL;}return;
}
//清空一个链表
void LinkList_Clear(LinkList* list)
{tagList *tList = NULL;if(list == NULL){cout << "LinkList_Clear Err" << endl;return;}tList = (tagList *)list;tList->length = 0;tList->header.next = NULL;return;
}
//链表长度
int LinkList_Length(LinkList* list)
{tagList *tList = NULL;if(list == NULL){cout << "LinkList_Length Err" << endl;return -1;}tList = (tagList *)list;return tList->length;
}
//在某个位置插入一个节点//链表是单向的 POS位置保存在POS-1的NEXT域里面int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{int ret = 0;LinkListNode* current = NULL;      //定义辅助指针变量Current
 tagList* tList;if (list == NULL || node == NULL || pos <0){ret = -1;cout << "Insert Err" << endl;return ret;}tList = (tagList*)list;current = &(tList->header);            //Current首先指向头结点for(int i = 0; ((i < pos) && (current->next !=NULL)); i++){current = current->next;         //指向POS节点的前一个位置
    }//node的NEXT改变 将Current的NEXT域的信息存入node的NEXT域node->next = current->next;//Current的NEXT域指向node 从而实现插入current->next = node;tList->length++;return 0;
}
//获取某个位置的节点
LinkListNode* LinkList_Get(LinkList* list, int pos)
{int ret = 0;LinkListNode* current = NULL; //辅助节点指针变量LinkListNode* temp = NULL;tagList* tList;if (list == NULL || pos <0){ret = -1;cout << "Get Err" << endl;return NULL;}tList = (tagList*)list;current = &(tList->header);   //Current首先指向头结点for(int i = 0; ((i < pos) && (current->next !=NULL)); i++){current = current->next;}temp = current->next;//返回Current的Next域为POS位置信息return temp;
}//删除某个位置的节点
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{int ret = 0;LinkListNode* current = NULL;  LinkListNode* temp = NULL;   //定义中间指针变量
 tagList* tList;if (list == NULL || pos <0){ret = -1;cout << "Get Err" << endl;return NULL;}tList = (tagList*)list;current = &(tList->header);for(int i = 0; ((i < pos) && (current->next !=NULL)); i++){current = current->next;    //Current指向POS节点的前一个位置
    }//temp指针指向POS位置的节点temp = current->next;//将temp 也就是POS位置的NEXT域值赋给CurrentNext域 从而实现跳过删除current->next =temp->next;tList->length--;return temp;
}

测试函数:

#include <iostream>
#include "linkList.h"
using namespace std;typedef struct _Teacher
{LinkListNode node;   //必须在所需要的数据结构中添加LinkListNode类型的node!!int age;char name[64];
}Teacher;int main()
{int len = 0;int ret = 0;LinkList* list = NULL;Teacher t1, t2, t3, t4, t5;t1.age = 31; t2.age = 32;t3.age = 33;t4.age = 34;t5.age = 35;//创建list = LinkList_Create();if(list == NULL){return -1;}len = LinkList_Length(list);//逐条插入ret = LinkList_Insert(list, (LinkListNode*)(&t1), 0);ret = LinkList_Insert(list, (LinkListNode*)(&t2), 0);ret = LinkList_Insert(list, (LinkListNode*)(&t3), 0);ret = LinkList_Insert(list, (LinkListNode*)(&t4), 0);ret = LinkList_Insert(list, (LinkListNode*)(&t5), 0);for (int i = 0; i < LinkList_Length(list); i++){cout << "List的遍历" << endl;cout << "age:" << ((Teacher*)LinkList_Get(list, i))->age << endl;}cout << endl;//头删while(LinkList_Length(list) > 0){cout << "删除的元素:" << ((Teacher*)LinkList_Delete(list, 0))->age << endl;}system("pause");return 0;
}

转载于:https://www.cnblogs.com/Lxk0825/p/9519919.html

链式链表的C风格实现相关推荐

  1. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

  2. 线性表的链式表示——单链表

    单链表 定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.每个链表的结点,除存放元素自身的信息之外,还需要存放一个指向其后继结点的指针.即单链表的结构分为两部分, ...

  3. 链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构

    一.前言 链式存储作为一种重要的数据存储方式有着极强的数据组织能力.灵活型和动态性,在众多数据结构中应用非常广泛.所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数 ...

  4. 【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )

    文章目录 1. 链 简介 ( 1 ) Chains ( 链 ) 简介 2. 创建 链 及 分析 生成的代码 ( 1 ) 创建水平链 ( 2 ) 链创建后的代码及样式 ( 3 ) 链创建后 生成的 代码 ...

  5. 二叉树的链式存储结构--二叉链表

    1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...

  6. 链表list(链式存储结构实现)_数据结构知否知否系列之 — 线性表的顺序与链式存储篇(8000 多字长文)...

    从不浪费时间的人,没有工夫抱怨时间不够. -- 杰弗逊 线性表是由 n 个数据元素组成的有限序列,也是最基本.最简单.最常用的一种数据结构. 作者简介:五月君,Nodejs Developer,热爱技 ...

  7. STL链式存储结构——————list链表

    c++的STL(标准模版库)提供了链表类的操作,称为list(表),是双向链表实现的 链式存储结构在实现插入.删除操作时不需要移动大量的数据元素.所以,链式存储结构适用于经常需要进行插入和删除操作的线 ...

  8. java链式结构_(Java)单链表Java语言链式结构实现(数据结构四)

    1.迭代器接口实现 package com.zhaochao; public interface Iterator { boolean hasNext(); E next(); boolean del ...

  9. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

最新文章

  1. 轻松练:如何从900万张图片中对600类照片进行分类|技术头条
  2. 关于crontab命令的学习
  3. 如果你想成为年入 50w+ 的架构师,我建议你先看看这个...
  4. php购物系统论文答辩老师评价,答辩指导教师的评语大全
  5. web.xml中load-on-startup的作用
  6. IHS Infonetics:网络运营商进军SDN
  7. 复合火焰探测传感器_暨南大学:基于垂直碳纳米片阵列的火焰合成碳泡沫的复合传感器...
  8. linux下搜狗输入法无法输入中文解决方法
  9. Quartz 之入门示例
  10. C++设计模式-外观模式
  11. 在VUE框架的WEB网页端播放海康威视RTSP视频流完全方案
  12. 新浪微博 redis mysql_新浪微博:史上最大的Redis集群
  13. java 函数 throw_java为什么有些异常throw出去需要在函数头用throws声明,一些就不用。...
  14. Python 代码实现ArcGis 标注Label转注记Annotation
  15. 找不到 xxx 的DNS地址,现在正在诊断问题
  16. 中国网:防火墙之父发声
  17. Redis及可视化工具安装
  18. oracle 结果集已耗尽_java.sql.SQLException: 结果集已耗尽,该怎么解决
  19. 时序分析基础(1)----寄存器时序分析模型
  20. 比较两组数据的差异用什么图更直观_你真的懂如何展示数据吗?

热门文章

  1. 关于软件公司如何进行知识分享的一些讨论
  2. 使用kubectl查看Kubernetes集群里的node节点信息
  3. Docker container与宿主进程相互隔离的实现原理
  4. MongoDB最简单的入门教程之五-通过Restful API访问MongoDB
  5. 计算机导论的重点,计算机导论重点题目精华版
  6. token干什么用_浅谈Token理解运用
  7. 英伟达显卡bios修改工具_终于可以吃鸡了!英伟达入门级图灵显卡1650S开卖,性能提升25%...
  8. python学习-知识点进阶使用(end、while else、range、iter、list的多种遍历方式)
  9. linux开发操作系统,Linux 操作系统应用与开发
  10. 计算机技能鉴定几月考,计算机等级考试和职业技能鉴定考核大纲(二级Office).docx...