LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H#include<stdio.h>
#include<stdlib.h>
//链表结点
typedef struct LINKNODE {struct LINKNODE *next;
}LinkNode;//链表
typedef struct LINKLIST{LinkNode head;   //放在第一个,防止有偏移量.//不是指针,所以不需要单独分配内存int size;
}LinkList;
//比较函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);
//遍历函数指针
typedef void(*PRINTNODE)(LinkNode*);#define COMPARENODE_TRUE 1
#define COMPARENODE_FALSE 0//初始化链表
LinkList* Init_LinkList();//插入
void InsertByPos_LinkList(LinkList *list, int pos,LinkNode *data);//删除
void RemoveByPos_LinkList(LinkList *list, int pos);//查找
int FindByValue_LinkList(LinkList *list, LinkNode *data,COMPARENODE compare);//返回链表大小
int GetSize_LinkList(LinkList *list);//打印
void Print_LinkList(LinkList *list,PRINTNODE print);//释放链表内存
void FreeSpace_LinkList(LinkList *list);#endif

LinkList.c

#include"LinkList.h"
//初始化链表
LinkList* Init_LinkList()
{LinkList* list = (LinkList*)malloc(sizeof(LinkList));list->head.next = NULL;list->size = 0;return list;
}//插入
void InsertByPos_LinkList(LinkList *list, int pos, LinkNode *data)
{if (list == NULL){return;}if (data == NULL){return;}if (pos<0 || pos>=list->size){pos = list->size;}//查找插入位置LinkNode* pCurrent = &(list->head);for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}//插入新结点data->next = pCurrent->next;pCurrent->next = data;list->size++;
}
//删除
void RemoveByPos_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;}//删除结点pCurrent->next = pCurrent->next->next;list->size--;}//查找
int FindByValue_LinkList(LinkList *list, LinkNode *data, COMPARENODE compare)
{if (list == NULL){return -1;}if (data == NULL){return -1;}//辅助指针变量LinkNode* pCurrent = list->head.next;int index=0;int flag = -1;while (pCurrent != NULL){if (compare(pCurrent, data) == 0){flag = index;break;}pCurrent= pCurrent->next;index++;}return flag;
}//返回链表大小
int GetSize_LinkList(LinkList *list)
{return list->size;
}//打印
void Print_LinkList(LinkList *list, PRINTNODE print)
{if (list == NULL){return;}//辅助指针变量LinkNode* pCurrent = list->head.next;while (pCurrent != NULL){print(pCurrent);pCurrent = pCurrent->next;}}//释放链表内存
void FreeSpace_LinkList(LinkList *list)
{if (list == NULL){return;}free(list);
}

LinkLIstme.c

#include"LinkList.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
LinkList* Init_LinkList()
{LinkList *list = (LinkList *)malloc(sizeof(LinkList));list->size = 0;list->head.next = NULL;
}void InsertByPos_LinkList(LinkList *list, int pos, LinkNode *data)
{if (list == NULL){return;}if (pos<0 || pos>list->size){pos = list->size;}//辅助指针变量LinkNode* pCurrent = &(list->head);//查找插入结点的前一个结点for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}data->next = pCurrent->next;pCurrent->next = data;list->size++;
}void RemoveByPos_LinkList(LinkList *list, int pos)
{if (list == NULL){return;}if (pos<0 || pos>list->size){pos = list->size;}//辅助指针变量LinkNode* pCurrent = &(list->head);//查找删除结点的前一个结点for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}pCurrent->next = pCurrent->next->next;list->size--;
}int FindByValue_LinkList(LinkList *list, LinkNode *data, COMPARENODE compare)
{if (list == NULL){return;}int flag;int i = 0;//辅助指针变量LinkNode* pCurrent = &(list->head);//查找删除结点的前一个结点for (i = 0; i < list->size; i++){while (compare(pCurrent, data) == 0){flag = COMPARENODE_TRUE;break;}pCurrent = pCurrent->next;}return i;
}int GetSize_LinkList(LinkList *list)
{return list->size;
}//不会
void Print_LinkList(LinkList *list, PRINTNODE print)
{}void FreeSpace_LinkList(LinkList *list)
{free(list);
}

企业链表.c

#include"LinkList.h"
#include<string.h>
#include<stdio.h>
#include<stdlib.h>typedef struct PERSON {LinkNode node;char name[64];int age;
}Person;void MyPrint(LinkNode * data)
{Person* p = (Person*)data;printf("Name:%s age:%d \n", p->name, p->age);
}int MyCompare(LinkNode *node1, LinkNode *node2)
{Person* p1 = (Person*)node1;Person* p2 = (Person*)node2;if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age){return 0;}return -1;
}
int main()
{Person p1, p2, p3, p4, p5;strcpy(p1.name, "aaa");strcpy(p2.name, "bbb");strcpy(p3.name, "ccc");strcpy(p4.name, "ddd");strcpy(p5.name, "eee");p1.age = 10;p2.age = 20;p3.age = 30;p4.age = 40;p5.age = 50;LinkList *list = Init_LinkList();InsertByPos_LinkList(list, 0, (LinkNode *)&p1);InsertByPos_LinkList(list, 0, (LinkNode *)&p2);InsertByPos_LinkList(list, 0, (LinkNode *)&p3);InsertByPos_LinkList(list, 0, (LinkNode *)&p4);InsertByPos_LinkList(list, 0, (LinkNode *)&p5);//打印Print_LinkList(list, MyPrint);Person findP;strcpy(findP.name, "bbb");findP.age = 20;int pos = FindByValue_LinkList(list, (LinkNode*)&findP, MyCompare);printf("位置:%d\n", pos);//释放链表内存FreeSpace_LinkList(list);system("pause");return 0;
}
/运行结果/
/*
Name:eee age:50
Name:ddd age:40
Name:ccc age:30
Name:bbb age:20
Name:aaa age:10
位置:3
请按任意键继续. . .
*/

运行结果:

数据结构-链表4-企业链表相关推荐

  1. 【C++】【四】企业链表

    // 企业链表.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // 链表改进版 企业常用#include <iostream> #inclu ...

  2. JS数据结构与算法_链表

    上一篇:JS数据结构与算法_栈&队列 下一篇:JS数据结构与算法_集合&字典 写在前面 说明:JS数据结构与算法 系列文章的代码和示例均可在此找到 上一篇博客发布以后,仅几天的时间竟然 ...

  3. SDUT_2118 数据结构实验之链表三:链表的逆置

    点击打开链接 数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem De ...

  4. JS版数据结构第三篇(链表)

    链表分为单链表,双链表,以及环形链表,我将分三个模块分别介绍,并有相应的题目对应讲解. 单链表 定义 还是按照老规矩先看一下百度百科对单链表的定义 根据以上文字我们可以得出 单链表是一种链式的数据结构 ...

  5. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

  6. php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))...

    php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...

  7. java双链表基本方法_Java数据结构之双端链表原理与实现方法

    本文实例讲述了Java数据结构之双端链表原理与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.什么时双端链表: 链表中保持这对最后一个连点引用的链表 2.从头部插入 要对链表进行判断,如果 ...

  8. java链表实现_数据结构——基于java的链表实现(真正理解链表这种数据结构)...

    一.链表介绍 1.什么是链表? 链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.如下图所示,在数据结构中,a1里面的指针存储着a2的地址,这样一个 ...

  9. 数据结构(三)--链表

    数据结构(三)–链表 文章目录 数据结构(三)--链表 介绍 单链表 代码实现 翻转链表 取出倒数第n个有效节点 介绍 链表又分: 单链表 双链表 单链表 头节点不存储数据,所有操作临时引用指向hea ...

  10. java数据接口之链表_Java数据结构和算法之链表

    三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LI ...

最新文章

  1. PVN3D: 基于Deep Point-wise 3D关键点投票的6D姿态估计网络(香港科技大学提出)
  2. 面试之JSP九大内置对象和JSP四大作用域
  3. Oracle 修改数据库基本参数
  4. whitepages 爬取_运营笔记:是时候了解蜘蛛爬取原理了!揭秘收录难题!
  5. Android OpenGL ES 开发教程(24):Depth Buffer
  6. GBase数据库-数据转换函数
  7. 常用数字信号处理方法在matlab上的实现(目录和先导)
  8. 企业微信 web 项目工业级蜕变
  9. 论文介绍 -- Rethinking the Evaluation of Video Summaries
  10. 部分mp4视频在ios手机端上无法播放问题
  11. 关于IAP支付,谷歌和苹果订阅商品——最白话,手把手教你做系列。
  12. JavaScript execCommand函数
  13. SLAM总结(一)- SLAM原理概述与简介
  14. Packet Tracer命令大全
  15. 存在正文时不允许未命名的原型参数_用Swift开发macOS程序, 六、原型、格式与开发说明...
  16. 好用的开源轻量级DHCP和DNS服务软件“Dual DHCP DNS Server”
  17. 微信小程序云开发---发送邮件功能
  18. 模式识别学习笔记——第2章—2.4 两类错误率、Neyman-Pearson决策与ROC曲线
  19. 利息积数的计算方法及应用
  20. Linux写文件断电保存,硬盘写到一半时断电,文件系统里会发生什么?

热门文章

  1. Java 线程状态流转
  2. cocos creator 方法数组_基于 Cocos 游戏引擎的音视频研发探索
  3. hive mysql命令,Hive数据库常用命令
  4. linux+mysql+导出备份_Linux系统MySQL备份的导入导出的具体分析
  5. 中学计算机教育特点,中学信息技术考点:信息的概念和基本特征
  6. 计算机应用技术工作项目是,论计算机应用技术在工程项目管理中的应用(原稿)...
  7. 温度 数值模拟 matlab,西安交通大学——温度场数值模拟(matlab)
  8. HTML+CSS+JS实现 ❤️绘制卡丁车动漫特效❤️
  9. java在线查看pdf文件,java 实现所有文件的在线查看(其他类型转pdf后用pdf.js显示)...
  10. python写的贪吃蛇小游戏_Python贪吃蛇小游戏