LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>//链表结点
typedef struct LINKNODE {void* data;  //无类型指针,指向任何类型的数据struct LINKLIST* next;
}LinkNode;//链表
typedef struct LINKLIST {LinkNode* head;int size;//不需要容量
}LinkList;//打印函数指针
typedef void(*PRINTLINKNODE)(void*);//初始化链表
LinkList* Init_LinkList();//指定位置插入
void Insert_LinkList(LinkList *list,int pos,void* data);//删除指定位置的值
void Remove_LinkList(LinkList *list, int pos);//获得链表的长度
int Size_LinkList(LinkList *list);//查找
int Find_linkList(LinkList *list, void* data);//返回第一个结点
void* GetFront_LinkList(LinkList *list);//打印链表结点
void Print_LinkList(LinkList *list, PRINTLINKNODE print);//释放链表内存
void Free_LinkList(LinkList *list);#endif

LinkList.c

#include"LinkList.h"//初始化链表
LinkList* Init_LinkList()
{LinkList* list = (LinkList*)malloc(sizeof(LinkList));list->size = 0;//头结点 是不保存数据信息的list->head = (LinkNode*)malloc(sizeof(LinkNode));list->head->data = NULL;list->head->next = NULL;return list;
}//指定位置插入
void Insert_LinkList(LinkList *list, int pos, void* data)
{if (list == NULL){return;}if (data == NULL){return;}//友好处理if (pos<0 || pos>list->size){pos = list->size;}//创建新的结点LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));newnode->data = data;newnode ->next= NULL;//找结点//辅助指针变量LinkNode *pCurrent = list->head;for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}//新结点插入newnode->next = pCurrent->next;pCurrent->next = newnode;list->size++;
}//删除指定位置的值
void Remove_LinkList(LinkList *list, int pos) {if (list == NULL){return;}if (pos < 0 || pos >= list->size){return;}//查找删除结点的前一个结点LinkNode *pCurrent = list->head;for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}//缓存删除的结点LinkNode* pDel = pCurrent->next;pCurrent->next = pDel->next;//释放删除结点的内存free(pDel);list->size--;}//获得链表的长度
int Size_LinkList(LinkList *list)
{return list->size;
}//查找
int Find_linkList(LinkList *list, void* data)
{if (list == NULL){return -1;}if (data == NULL){return -1;}//遍历查找LinkNode* pCurrent = list->head->next;//指向第一个有效数字int i = 0;while (pCurrent!=NULL){if (pCurrent->data == data){break;}i++;pCurrent = pCurrent->next;}return i;}//返回第一个结点
void* GetFront_LinkList(LinkList *list)
{LinkNode* node = list->head->next;return node->data;
}//打印链表结点
void Print_LinkList(LinkList *list, PRINTLINKNODE print)
{if (list == NULL){return;}//辅助指针变量LinkNode *pCurrent = list->head->next;while (pCurrent != NULL){print(pCurrent->data);  //注意顺序pCurrent = pCurrent->next;}
}//释放链表内存
void Free_LinkList(LinkList *list)
{if (list == NULL){return;}//辅助指针变量LinkNode* pCurrent = list->head;while (pCurrent->next != NULL){//先缓存下一个结点,再删除LinkNode* pNext = pCurrent->next;free(pCurrent);pCurrent = pNext;}//释放链表内存list->size = 0;free(list);
}

单项链表.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"LinkList.h"typedef struct PERSON {char name[64];int age;int score;} Person;
void MyPrint(void* data) {Person* p = (Person*)data;printf("Name:%s Age %d Score %d\n",p->name, p->age, p->score);
}int main()
{//创建链表LinkList* list = Init_LinkList();//创建数据Person p1 = { "aaa", 18, 100 };Person p2 = { "bbb", 19, 99 };Person p3 = { "ccc", 8, 45 };Person p4 = { "ddd", 27, 22 };Person p5 = { "eee", 34, 12 };//数据插入链表Insert_LinkList(list, 0, &p1);Insert_LinkList(list, 0, &p2);Insert_LinkList(list, 0, &p3);Insert_LinkList(list, 0, &p4);Insert_LinkList(list, 0, &p5);//打印Print_LinkList(list,MyPrint);//删除p2Remove_LinkList(list, 3);//打印printf("删除第四个后打印结果:\n");Print_LinkList(list, MyPrint);//返回第一个结点printf("-------------查找结果返回第一个结点--------------\n");Person* p = (Person*)GetFront_LinkList(list);printf("Name:%s Age %d Score %d\n", p->name, p->age, p->score);//销毁列表Free_LinkList(list);system("pause");return 0;
}
///打印结果///
/*
Name:eee Age 34 Score 12
Name:ddd Age 27 Score 22
Name:ccc Age 8 Score 45
Name:bbb Age 19 Score 99
Name:aaa Age 18 Score 100
删除第四个后打印结果:
Name:eee Age 34 Score 12
Name:ddd Age 27 Score 22
Name:ccc Age 8 Score 45
Name:aaa Age 18 Score 100
-------------查找结果返回第一个结点--------------
Name:eee Age 34 Score 12
请按任意键继续. . .
*/

运行结果截图:

数据结构-链表2-链式存储相关推荐

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

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

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

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

  3. 数据结构学习笔记——链式存储结构实现栈(链栈)

    目录 一.链栈的定义 二.链栈的初始化 三.判断链栈是否为空栈 四.进栈(插入操作) 五.出栈(删除操作) 六.读取链栈的栈顶元素 七.链栈的建立 八.链栈的遍历输出 链式存储结构实现栈完整代码 一个 ...

  4. 数据结构 树的链式存储(二叉表示法)

    //树的链式存储--二叉表示法 #include<stdio.h> #include<stdlib.h> #include<string.h>typedef str ...

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

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

  6. 数据结构与算法——链式存储(链表)的插入及删除

    持续分享嵌入式技术,操作系统,算法,c语言/python等,欢迎小友关注支持 上篇文章我们讲述了链表的基本概念及一些查找遍历的方法,本篇我们主要将一下链表的插入删除操作,以及采用堆栈方式如何创建链表. ...

  7. php之二叉树,数据结构之二叉树——链式存储结构(php代码实现)

    /** * ClearBiTree() 清空二叉树 * CreateBiTree() 创建二叉树 * BiTreeEmpty() 判断二叉树是否为空 * BiTreeDepth() 返回二叉树的深度 ...

  8. 数据结构二叉树的链式存储

    typedef struct BiTNode{int data;struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;//定义一棵空树 BiTree r ...

  9. 数据结构-第二章(5)-链式存储结构

    数据结构 ⚡️数据结构-第一章 ⚡️抽象数据类型案例 ⚡️数据结构-第二章(1)-线性结构 ⚡️数据结构-第二章(2)-线性表的顺序表示和实现 ⚡️数据结构-第二章(3)-顺序表(含代码) ⚡️数据结 ...

  10. 数据结构之线性表——(二、链式存储结构)[c语言]

    数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...

最新文章

  1. FreeRTOS 低功耗之 tickless 模式
  2. RestartOnCrash一个监控进程的小工具,可用于监控iis/apache/mysql等程序
  3. [转]如何写一份交互说明文档
  4. 二叉树中获取从根节点到某个节点的路径
  5. 阿里云2017财年:营收66.63亿 同比增长121%
  6. opencv codebook背景减除
  7. vc模拟 tabletpc_KB895953-TCServer.exe TabletPC崩溃/内存泄漏HotFix
  8. 网站跳出率高怎么解决?
  9. 【oracle19c静默安装RAC】
  10. 【蓝桥】算法训练 Beaver‘s Calculator(贪心)
  11. 不要高估你和任何一个人的关系
  12. 尚硅谷-SpringSecurity
  13. Tita OKRs-E 使OKR成为您企业DNA一部分
  14. 结缘OpenStack:运营商NFV部署加速 要开源也要保障
  15. GD32F303课程【3】中断控制器和外部中断
  16. BUUCTF Web [GXYCTF2019]Ping Ping Ping [极客大挑战 2019]LoveSQL [极客大挑战 2019]Knife [极客大挑战 2019]Http
  17. C语言程序设计入门16——初识字符输入输出3:简单字符加密
  18. Swift 优雅的网络请求Moya
  19. 20200509视频面试
  20. 基于TIA西门子博途的触摸屏HMI脚本入门学习(一)

热门文章

  1. Linux学习Vim使用及账号用户管理
  2. 控制台出现Failed to bind properties under ‘spring.datasource‘ to javax.sql.DataSource
  3. ga tsp matlab,遗传算法(GA)求解TSP问题MATLAB程序
  4. 计算机公共基础知识论文,计算机等级考试二级公共基础知识汇总.doc
  5. android 蓝牙sco stream_voice_call,android TTS输出总是要 A2DP_android_开发99编程知识库
  6. android退出app代码,Android应用退出代码各种方式
  7. java语言中json转换,JSON字符串和JAVA语言对象的相互转换教程
  8. 图之遍历--广度优先遍历
  9. 猜拳游戏html,JavaScript中实现猜拳小游戏
  10. java将属性练成字符串,Java中通过属性字符串名取属性内容