按照单链表的设计,稍加改动。和单向链表不一样的地方,头节点不指向NULL,而是指向自己head

循环链表的判满 1)判断next是不是头结点,2)判断size

/*

* CycleLinkList.h

*

* Created on: 2019年7月24日

* Author: Administrator

*/

#ifndef SRC_CYCLELINKLIST_H_

#define SRC_CYCLELINKLIST_H_

#define CIRCLELINKLIST_TRUE 1

#define CIRCLELINKLIST_FALSE 0

/**

* 1、循环链表,带头节点,初始化的时候,和单向链表不一样的地方,头节点不指向NULL,而是指向自己head

* 2、循环链表的判满 1)判断next是不是头结点,2)判断size

* */

//链表的小节点

typedef struct CIRCLELINKNODE {

struct CIRCLELINKNODE *next;

}CircleLinkNode;

//结构体

typedef struct CIRCLELINKLIST {

CircleLinkNode head;

int size;

}CircleLinkList;

//比较回调

typedef int(*COMPARENODE)(CircleLinkNode *, CircleLinkNode *);

typedef void(*PRINTNODE)(CircleLinkNode *);

//API

//创建一个循环链表

CircleLinkList *Init_CircleLinkList();

//插入

void Insert_CircleLinkList(CircleLinkList *clist, int pos, CircleLinkNode *data);

//获取第一个元素

CircleLinkNode *Front_CircleLinkList(CircleLinkList *clist);

//根据位置删除

void RemoveByPos_CircleLinkList(CircleLinkList *clist, int pos);

//根据值删除

void RemoveByValue_CircleLinkList(CircleLinkList *clist, CircleLinkNode *data, COMPARENODE compare);

//获得链表的长度

int Size_CircleLinkList(CircleLinkList *clist);

//判断是否为空

int IsEmpty_CircleLinkList(CircleLinkList *clist);

//查找

int Find_CircleLinkList(CircleLinkList *clist, CircleLinkNode *data, COMPARENODE compare);

//打印

void Print_CircleLinkList(CircleLinkList *clist, PRINTNODE print);

//释放内存

void FreeSpace_CircleLinkList(CircleLinkList *clist);

#endif /* SRC_CYCLELINKLIST_H_ */

/*

* CylceLinkList.c

*

* Created on: 2019年7月24日

* Author: Administrator

*/

#include "CycleLinkList.h"

#include

#include

#include

//创建一个循环链表

CircleLinkList *Init_CircleLinkList() {

CircleLinkList *clist = (CircleLinkList *)malloc(sizeof(CircleLinkNode));

clist->head.next = &(clist->head);

clist->size = 0;

return clist;

}

//插入

void Insert_CircleLinkList(CircleLinkList *clist, int pos, CircleLinkNode *data) {

if(clist == NULL){

return;

}

if(data == 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++;

}

//获取第一个元素

CircleLinkNode *Front_CircleLinkList(CircleLinkList *clist) {

return clist->head.next;

}

//根据位置删除

void RemoveByPos_CircleLinkList(CircleLinkList *clist, int pos) {

if(clist == NULL){

return;

}

if(pos < 0 || pos>= clist->size){

return;

}

//根据pos 找节点

//辅助指针变量

CircleLinkNode *pCurrent = &(clist->head);

for(int i = 0; i < pos; i++){

pCurrent = pCurrent->next;

}

//缓存当前节点的下一个节点

CircleLinkNode *pNext = pCurrent->next;

pCurrent->next = pNext->next;

clist->size--;

}

//根据值删除

void RemoveByValue_CircleLinkList(CircleLinkList *clist, CircleLinkNode *data, COMPARENODE compare) {

if(clist == NULL){

return;

}

if(data == NULL){

return;

}

//这是循环链表

CircleLinkNode *pPrev = &(clist->head);//找到相等打的元素值时,存储要删除的元素的前驱节点

CircleLinkNode *pCurrent = clist->head.next;//用来记录 要删除的元素的结点

for(int i = 0; i < clist->size; i++){

if(compare(pCurrent, data) == CIRCLELINKLIST_TRUE){//找点操作

pPrev->next = pCurrent->next;//删除操作

break;

}

pPrev = pCurrent;//比较指针后移

pCurrent = pCurrent->next;//游标指针后移

}

free(pCurrent);

clist->size--;

}

//获得链表的长度

int Size_CircleLinkList(CircleLinkList *clist) {

return clist->size;

}

//判断是否为空

int IsEmpty_CircleLinkList(CircleLinkList *clist) {

if(clist->size == 0){

return CIRCLELINKLIST_TRUE;

}

return CIRCLELINKLIST_FALSE;

}

//查找

int Find_CircleLinkList(CircleLinkList *clist, CircleLinkNode *data, COMPARENODE compare) {

if(clist == NULL){

return -1;

}

if(data == NULL){

return -1;

}

CircleLinkNode *pCurrent = clist->head.next;

int flag = -1;

for(int i = 0; i < clist->size; i++){

if(compare(pCurrent, data) == CIRCLELINKLIST_TRUE){

flag = i;

break;

}

pCurrent = pCurrent->next;

}

return flag;

}

//打印

void Print_CircleLinkList(CircleLinkList *clist, PRINTNODE print) {

if(clist == NULL){

return;

}

//辅助指针变量

CircleLinkNode *pCurrent = clist->head.next;

for(int i = 0; i < clist->size; i++){

if(pCurrent == pCurrent->next){

pCurrent = pCurrent->next;

}

print(pCurrent);

pCurrent = pCurrent->next;

}

}

//释放内存

void FreeSpace_CircleLinkList(CircleLinkList *clist) {

if(clist == NULL){

return;

}

free(clist);

}

/*

* main.c

*

* Created on: 2019年7月24日

* Author: Administrator

*/

#include "CycleLinkList.h"

#include

#include

#include

typedef struct PERSON{

CircleLinkNode node;

char name[64];

int age;

int score;

}Person;

void MyPrint(CircleLinkNode *data){

Person *p = (Person *)data;

printf("name: %s , age: %d, score: %d \n", p->name, p->age, p->score);

}

int MyCompare(CircleLinkNode *data1, CircleLinkNode *data2){

Person *p1 = (Person *)data1;

Person *p2 = (Person *)data2;

if(strcmp(p1->name, p2->name) == 0 && p1->age == p2->age && p1->score == p2->score){

return CIRCLELINKLIST_TRUE;

}

}

int main(){

printf("循环链表 \n");

//创建循环链表

CircleLinkList *clist = Init_CircleLinkList();

//创建数据

Person p1, p2, p3, p4, p5;

strcpy(p1.name, "Jarvis");

strcpy(p2.name, "Marvis");

strcpy(p3.name, "Harvis");

strcpy(p4.name, "Larvis");

strcpy(p5.name, "Karvis");

p1.age = 21;

p2.age = 22;

p3.age = 23;

p4.age = 24;

p5.age = 25;

p1.score = 91;

p2.score = 92;

p3.score = 93;

p4.score = 94;

p5.score = 95;

Insert_CircleLinkList(clist, 0, (CircleLinkNode *)&p1);

Insert_CircleLinkList(clist, 1, (CircleLinkNode *)&p2);

Insert_CircleLinkList(clist, 2, (CircleLinkNode *)&p3);

Insert_CircleLinkList(clist, 3, (CircleLinkNode *)&p4);

Insert_CircleLinkList(clist, 4, (CircleLinkNode *)&p5);

//打印

Print_CircleLinkList(clist, MyPrint);

//删除

Person pDel;

strcpy(pDel.name, "Marvis");

pDel.age = 22;

pDel.score = 92;

RemoveByValue_CircleLinkList(clist, (CircleLinkNode *)&pDel, MyCompare);

//打印

printf("删除后打印 \n");

Print_CircleLinkList(clist, MyPrint);

//释放内存

FreeSpace_CircleLinkList(clist);

system("pause");

return 0;

}

循环链表

name: Jarvis , age: 21, score: 91

name: Marvis , age: 22, score: 92

name: Harvis , age: 23, score: 93

name: Larvis , age: 24, score: 94

name: Karvis , age: 25, score: 95

删除后打印

name: Jarvis , age: 21, score: 91

name: Harvis , age: 23, score: 93

name: Larvis , age: 24, score: 94

name: Karvis , age: 25, score: 95

建立循环链表c语言,循环链表C语言实现相关推荐

  1. 约瑟夫环问题(C语言循环链表)

    1.约瑟夫环问题(C语言循环链表) 我相信大家都可以画出这个图,知道大体的解题的思想,但是却不知道代码该怎么下手,因此,下面我直接上代码,代码中该注释的地方我都进行了注释,希望到大家有帮助: #inc ...

  2. 构建循环链表c语言,循环链表一

    1.        循环链表概念 对于单链表以及双向链表,其就像一个小巷,无论怎么样最终都能从一端走到另一端,然而循环链表则像一个有传送门的小巷,因为循环链表当你以为你走到结尾的时候,其实你又回到了开 ...

  3. C语言二叉树实验报告流程图,二叉树的建立与遍历实验报告(c语言编写,附源代码).doc...

    二叉树的建立与遍历实验报告(c语言编写,附源代码).doc 第 1 页,共 9 页二叉树的建立与遍历实验报告级 班 年 月 日 姓名 学号_ 1实验题目建立一棵二叉树,并对其进行遍历(先序.中序.后序 ...

  4. 二叉树建立及中序遍历C++语言实现

    二叉树建立及中序遍历C++语言实现: #include<stdio.h> #include<stdlib.h> typedef struct node{//二叉树结点数据结构定 ...

  5. 一个c语言程序有两个源文件,建立多个源文件的C语言程序.pdf

    建立多个源文件的C语言程序 建立多个源文件的C语言程序 输入.调试并执行一个C++程序 1. 建立多个源文件的C语言程序 一个C语言程序不一定只包含一个文件,它可以由多个文 件组成,比如它可以包含多 ...

  6. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  7. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  8. java 与c 运行效率_Java语言与C语言代码运行效率的比较

    <Java语言与C语言代码运行效率的比较>由会员分享,可在线阅读,更多相关<Java语言与C语言代码运行效率的比较(2页珍藏版)>请在人人文库网上搜索. 1.Java语言与C语 ...

  9. 【C语言】C语言实现面向对象编程之封装

    00. 目录 文章目录 00. 目录 01. 前言 02. 简单程序示例 03. 程序示例优化 04. 总结 05. 参考 01. 前言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种 ...

最新文章

  1. mysql一主两从_MySQL 网络延迟参数设置建议
  2. PHP - .htaccess设置显示PHP错误 (转)
  3. c++枚举类型(二) c++11 枚举类
  4. springboot listener_Springboot 全套面试提升宝典,为金三银四冲刺
  5. 2021 ICPC Asia Jinan Regional Contest-J Determinant(取模高斯消元)
  6. HDU 2196 Computer 树形DP
  7. dw中html5快捷键,DW快捷键大全
  8. 那些年-SAP固定资产导入AS91 OASV
  9. 在页面引入项目路径 ${webRoot}
  10. 电子科技大学关于佛系青年的社会实践调查
  11. js红宝石书第四版--P446有点不严谨的地方的指出
  12. windows xp系统账号密码忘记解决办法
  13. ACLSCO链路介绍
  14. 【Linux】将用户添加到root组中
  15. IDL语法基础(01)
  16. C# 调用 C++生成的Dll
  17. 史上最全python字符串操作指南 #华为云·寻找黑马程序员#
  18. 分享关于饿了么的需求文档
  19. cf服务器优化,穿越火线走过12年存在服务器何时能得到优化?
  20. PHP中与and、||与or的区别 | php中and 和 出坑指南

热门文章

  1. iis服务器添加ssl证书,Windows 服务器 IIS 7.0和8.0添加SSL证书教程【图解】
  2. 一文详解边缘设备上的计算机视觉
  3. HTC A510C屏幕失灵补丁
  4. optimize求解非线性方程组求解
  5. ccie 与 java,Java
  6. fastreport返回是否打印成功_我国首次完成太空“3D打印”,都打印了什么?
  7. html标签和style的使用及Emmet插件0719
  8. Java进阶:生化危机java中文版下载
  9. 蓝桥杯c语言试题及答案 高职,2012.C语言‘蓝桥杯“预赛.真题.高职
  10. 城市级智慧停车解决方案白皮书