一:实现机制

Linux链表实现思想就是:结点里面只创建一个next指针,用指针将各个结点相连接 打印和查找的时候,再进行类型的转换。
循环链表在Linux链表的基础上改动,最后结点的next指向的是开始头结点,而Linux链表最后结点的next指向的是NULL;循环链表在在初始化时,头结点指向它本身(clist->head.next=&(clist->head);)

二:代码

1 CircleLinkList.h

/*
CircleLinkList.h
实现机制为linux链表(企业链表)
*/
#ifndef  _CIRCLELINKLIST_H_
#define _CIRCLELINKLIST_H_
#include <stdio.h>
#include <stdlib.h>#define CIRCLELINKLIST_TRUE 0
#define CIRCLELINKLIST_FALSE -1//创建小节点
typedef struct CIRCLELINKNODE{struct CIRCLELINKNODE *next;
}CircleLinkNode; //链表
typedef struct CIRCLELINKLIST{CircleLinkNode head;//head头结点,是结构体 int size;//链表数据个数
}CircleLinkList; //值删除回调函数
typedef int (*COMPARE)(CircleLinkNode *data1,CircleLinkNode *data2); //打印回调函数
typedef void (*PRINT)(CircleLinkNode *data);//初始化
CircleLinkList *_Init_List();
//插入
void _Insert_List(CircleLinkList *clist,int pos,CircleLinkNode *data);
//按照位置删除
void _DeleteByPos_List(CircleLinkList *clist,int pos);
//按照值删除
void _DeleteByValue_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare);
//返回第一个数据
CircleLinkNode *_Front_List(CircleLinkList *clist);
//获得链表长度
int _Size_List(CircleLinkList *clist);
//打印
void _Print_List(CircleLinkList *clist,PRINT my_Print);
//查找
int _Find_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare);
//释放内存
void _Free_List(CircleLinkList *clist);
#endif

2 CircleLinkList.c

/*
CircleLinkList.c
*/
#include "CircleLinkList.h"//初始化
CircleLinkList *_Init_List(){CircleLinkList *clist=(CircleLinkList *)malloc(sizeof(CircleLinkList));clist->head.next=&(clist->head);clist->size=0;return clist;
}
//插入
void _Insert_List(CircleLinkList *clist,int pos,CircleLinkNode *data){if(clist==NULL){return ;}if(pos<0||pos>clist->size){pos=clist->size;//默认往尾部插 }CircleLinkNode *pCurrent=&(clist->head);for(int i=0;i<pos;i++){//寻找前一结点 pCurrent=pCurrent->next; }//插入数据data->next=pCurrent->next;pCurrent->next=data;clist->size++;
}//打印
void _Print_List(CircleLinkList *clist,PRINT my_Print){if(clist==NULL){return ;}CircleLinkNode *pCurrent=(clist->head.next);for(int i=0;i<clist->size;i++){if(pCurrent==&(clist->head)){//如果打印多次,跳过头指针 pCurrent=pCurrent->next; }//打印my_Print(pCurrent);pCurrent=pCurrent->next; }
}
//按照位置删除
void _DeleteByPos_List(CircleLinkList *clist,int pos){if(clist==NULL){return ;}if(pos<0||pos>=clist->size){return ;}CircleLinkNode *pCurrent=&(clist->head);for(int i=0;i<pos;i++){//寻找前一结点 pCurrent=pCurrent->next; }//将这个要删除结点缓存CircleLinkNode *DelNode= pCurrent->next;pCurrent->next=DelNode->next;//释放删除结点空间,/*if(DelNode!=NULL){free(DelNode);DelNode=NULL;} */clist->size--;
}
//按照值删除
void _DeleteByValue_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare){if(clist==NULL){return ;}if(data==NULL){return ;}CircleLinkNode *PreCurrent= &(clist->head);//数据的前一个 CircleLinkNode *pCurrent=PreCurrent->next;//查找到相对应的数据 for(int i=0;i<clist->size;i++){if(my_Compare(pCurrent,data)==CIRCLELINKLIST_TRUE){//匹配成功 PreCurrent->next=pCurrent->next;clist->size--;break;}//没有匹配到,定义前后指针注意//PreCurrent->next= pCurrent;//pCurrent->next=PreCurrent->next; PreCurrent=pCurrent;pCurrent=PreCurrent->next;}}
//返回第一个数据
CircleLinkNode *_Front_List(CircleLinkList *clist){return clist->head.next;
}
//获得链表长度
int _Size_List(CircleLinkList *clist){return clist->size;
}
//查找
int _Find_List(CircleLinkList *clist,CircleLinkNode *data,COMPARE my_Compare){if(clist==NULL){return -1;}if(data==NULL){return -1;}CircleLinkNode *pCurrent=(clist->head.next);int pos=-1;for(int i=0;i<clist->size;i++){if(my_Compare(pCurrent,data)==CIRCLELINKLIST_TRUE){//找到了 pos=i;break;}pCurrent=pCurrent->next;}return pos;
}
//释放内存
void _Free_List(CircleLinkList *clist){if(clist!=NULL){free(clist);clist=NULL;}
}

3 main.c

/*
main.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "CircleLinkList.h"typedef struct PERSON{CircleLinkNode node;char name[64];int age;
}Person;//打印回调
void my_Print(CircleLinkNode *data){Person *p=(Person*)data;printf("name:%s  age:%d\n",p->name,p->age);
} //比较回调
int my_Compare(CircleLinkNode *data1,CircleLinkNode *data2){Person *p1=(Person*)data1;Person *p2=(Person*)data2;//判断if(strcmp(p1->name,p2->name)==CIRCLELINKLIST_TRUE&&p1->age==p2->age) {return CIRCLELINKLIST_TRUE;}else{return CIRCLELINKLIST_FALSE;}
}
int main(void){ //初始化CircleLinkList *clist=_Init_List();//创建数据Person p1,p2,p3,p4;strcpy(p1.name,"AAA"); strcpy(p2.name,"BBB"); strcpy(p3.name,"CCC"); strcpy(p4.name,"DDD"); p1.age=20; p2.age=30;p3.age=40;p4.age=50;//插入_Insert_List(clist,0,(CircleLinkNode*)&p1);_Insert_List(clist,1,(CircleLinkNode*)&p2);_Insert_List(clist,2,(CircleLinkNode*)&p3);_Insert_List(clist,3,(CircleLinkNode*)&p4);//打印_Print_List(clist,my_Print);//查找Person p6;strcpy(p6.name,"BBB"); p6.age=60;int pos=_Find_List(clist,(CircleLinkNode*)&p6,my_Compare);//p6换为p2就可以找到 if(pos==-1){printf("p2 not found\n");}else{printf("p2 found pos=%d\n",pos);}//按照值删除printf("*********value delete***********\n");_DeleteByValue_List(clist,(CircleLinkNode*)&p2,my_Compare);_Print_List(clist,my_Print);//按照位置删除printf("*********pos delete***********\n");_DeleteByPos_List(clist,1);_Print_List(clist,my_Print);printf("List length:%d\n",_Size_List(clist));//释放内存_Free_List(clist);return 0;
}

三:结果显示

1.编译环境

centos 3.10.0-862.el7.x86_64
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)

2.编译命令

gcc main.c CircleLinkList.c -std=c99
./a.out

3.结果显示

数据结构一:链表(循环链表)相关推荐

  1. 数据结构之 链表( 单链表, 双链表,循环链表)

    前篇.链表的概括 1.链表(Linked list)说明 是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按 ...

  2. 假设以带头结点的循环链表表示队列_JavaScript数据结构之链表--设计

    上一篇文章中介绍了几种常见链表的含义,今天介绍下如何写出正确的链表代码. 如何表示链表 我们一般设计的链表有两个类.Node 类用来表示节点,LinkedList 类提供了一些辅助方法,比如说结点的增 ...

  3. linux内核数据结构之链表

    1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该代码来自linux内核,在li ...

  4. Python数据结构之链表(linked list)

    Python数据结构之链表 一.链表的基本知识 最近在leetcode刷题时遇到了几道关于链表的题,于是恶补了一下关于链表的知识.什么是链表?熟悉python语法的同学肯定都知道list,但是这并不是 ...

  5. 6-4 链表拼接 (20分)_数据结构之链表

    在面试过程中,数据结构和算法基本上算是研发类岗位必考的部分,而链表基本上又是数据结构中相对容易掌握.而且容易出题的部分,因此我们先整理一下链表部分的经典题目. (声明:以下所有程序都是用java编写) ...

  6. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

  7. 数据结构之链表 - 动图演示

    微信搜索[NO编程],关注这个与众不同的公众号. 个人网站:www.newobject.cc 版权声明:本文为原创文章,转载请注明出处. 链表简介 链表是很常见的数据结构,由一个个节点组成,每个节点中 ...

  8. 数据结构之链表(java语言实现)

    链表的底层储存结构: 相对于数组这一需要连续.足够大空间的数据结构,链表只需要利用"指针"将一组零碎的空间(在链表中称之为节点)串联起来,这样就可以避免在创建数组时一次性申请过大的 ...

  9. C语言数据结构单链表链表

    数据结构–单链表 学习了顺序表,我们发现顺序表在向里面存放数据的时候很麻烦,比如我们要使用头插法存放一个数据到顺序表的时候,我们要将整个表都向后挪一位,这个操作就让人很难受.那么有没有一种结构可以让我 ...

  10. 链表的基本概念以及java实现单链表-循环链表-双向链表

    前言 线性结构是非常简单且常用的数据结构,而线性表则是一种非常典型的线性结构. 线性表定义 线性表的数据结构 链表 单链表 单链表的定义 单链表的插入和删除 单链表的遍历,清空,判空,获取指定结点 循 ...

最新文章

  1. boxFilter 滤波器实现
  2. 《计算机组成原理》课程设计报告——TEC-2实验系统——微程序设计
  3. 刷新SqlServer所有视图【存储过程】
  4. SQL Server 2008安装和配置过程
  5. [LeetCode] Inorder Successor in BST 二叉搜索树中的中序后继节点
  6. JavaScript 框架之战结束:React 是最终赢家?
  7. 再获全球顶会ASPLOS认可:阿里云神龙凭什么打破物理机神话
  8. 如何通过Keras来掌握深度学习
  9. php二级域名 同步登录,php网站单点登录--卷一(跨二级域名)
  10. C_Learning(3)
  11. Android-怎么配置ADT配置了没有安卓图标怎么办
  12. 如何用ESP32+LVGL实现给路由器加装屏幕
  13. edius裁剪快捷键_EDIUS 快捷键大全 edius常用快捷键大全
  14. Python开发之路(1)— 使用Pyaudio进行录音和播音
  15. 股票---- 资金在线-个股资金流向与大单分析系统
  16. C# 开发的 webBrowser打开网页出现脚本错误解决
  17. 高一计算机课的总结,高中《信息技术》期末教学总结范文
  18. 媒体文件格式分析FMP4
  19. 目标检测-ROI Pooling介绍
  20. 一周快讯:乐视网市值蒸发349亿,钱宝网张小雷被逮

热门文章

  1. BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
  2. BZOJ 3329 Xorequ (数位DP、矩阵乘法)
  3. java条码大小_java – 自定义条形码输入中缺少条形码高度
  4. 老男孩python全栈开发视频教程_老男孩Python全栈开发(92天全)视频教程 自学笔记16...
  5. mysql主从同步简单原理_MYSQL简单主从复制原理及实现
  6. java web 图书管理系统_图书管理系统,源代码 Java初级小项目
  7. # 起床困难综合症(二进制枚举+按位求贡献)
  8. 拓普微智能TFT液晶显示模块
  9. Maven(九)Eclipse创建Web项目(简单方式)
  10. Linux运维工程师必学必备的8项IT技能