按照单链表的设计,稍加改动。和单向链表不一样的地方,头节点不指向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 <stdio.h>
#include <stdlib.h>
#include <string.h> //创建一个循环链表
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 <stdio.h>
#include <stdlib.h>
#include <string.h> 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语言实现的更多相关文章

  1. 一种神奇的双向循环链表C语言实现

    最近在看ucore操作系统的实验指导.里面提要一个双向循环链表的数据结构,挺有意思的. 其实这个数据结构本身并不复杂.在普通链表的基础上加一个前向指针,我们就得到了双向链表,再把头尾节点连起来就是双向 ...

  2. 单向循环链表C语言实现

    我们都知道,单向链表最后指向为NULL,也就是为空,那单向循环链表就是不指向为NULL了,指向头节点,所以下面这个程序运行结果就是,你将会看到遍历链表的时候就是一个死循环,因为它不指向为NULL,也是 ...

  3. 带头结点的双向循环链表----------C语言

    /***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...

  4. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  5. 双向循环链表(C语言描述)(四)

    下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...

  6. 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表

    1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() ...

  7. C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!

    循环链表   把链表的两头连接,使其成为了一个环状链表,通常称为循环链表. 和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,链表就能成环儿,下图所示.   需要注意的是,虽然循环链表成环 ...

  8. 【C语言教程】“双向循环链表”学习总结和C语言代码实现!

    双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...

  9. c语言编程之双向循环链表

    双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...

随机推荐

  1. 利用Mocking Framework 单元测试Entity Framework

    一.前言 在实际编写程序时,往往需要与数据库打交道,在单元测试中直接使用数据库又显得太重,如果可以方便的编写一些测试数据,这样更易于检测功能.如何模拟数据库行为便是本篇的主题.微软有教程说明Moq E ...

  2. JS基础_其他进制的数字(了解)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. php重定向的三种方法分享

    一.用HTTP头信息  也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,例如: 声明返回信息的类型(" ...

  4. 哈希表(Hash table)

  5. 101、Service 之间如何通信?(Swarm08)

    参考https://www.cnblogs.com/CloudMan6/p/7967419.html   微服务架构的应用由若干 service 构成.比如有运行 httpd 的 web 前端,有提供 ...

  6. MySQL太慢?试试这些诊断思路和工具

    MySQL 慢怎么办 如果遇到 MySQL 慢的话,你的第一印象是什么,MySQL 数据库如果性能不行,你是如何处理的? 我咨询了一些同行, 得到了以下反馈: 第一反应是再试一次 第二个反应是优化一下 ...

  7. 【electronjs入门教程 】electronjs 介绍

    官网地址:https://electronjs.org/ 官网文档地址:https://electronjs.org/docs/ electronjs使用 JavaScript, HTML 和 CSS ...

  8. Oracle创建表和创建序列和修改,增加sql字段

    一.创建表 create table y_parts_classify( pt_id number(10) not null, pt_name varchar2(1000), update_time ...

  9. CRM项目讲解和django知识点回顾

    今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...

  10. ES数据架构与关系数据库Mysql

    ES数据架构的主要概念(与关系数据库Mysql对比) MySQL ElasticSearch Database Index Table Type Row Document Column Field S ...