【C++】【五】循环链表
数据结构:具体的高效有序的管理内存的方法。
- 链表:数据结构的一种 节点:每一块内存 每一个节点可以是裸指针 也可以是结构体 ,结合企业链表的思路可以将类型强转,完成高效的访问。
main.cc
// 单向循环链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<stdlib.h>
#include <iostream>#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0typedef struct clinknode {struct clinknode* next;
}clinknode;typedef struct circlelinkist {clinknode head;int size;
}circlelinkist;typedef int(*COMPARE)(clinknode*, clinknode*);typedef void(*PRINTNODE)(clinknode*);circlelinkist* Init_circlelinkist() {circlelinkist* clist = (circlelinkist*)malloc(sizeof(circlelinkist));clist->head.next = &(clist->head);clist->size = 0;return clist;
}void Insert_circlelinkist(circlelinkist* clist, int pos, clinknode* data) {if (clist == NULL) {return;}if (data == NULL) {return;}if (pos<0 || pos>clist->size) {pos = clist->size;}//辅助指针变量clinknode* pcur = &(clist->head);for (int i = 0; i < pos; ++i) {pcur = pcur->next;}data->next = pcur->next;pcur->next = data;clist->size++;
}clinknode* Front_circlelinkist(circlelinkist* clist) {return clist->head.next;
}void RemoveByPos_circlelinkist(circlelinkist* clist, int pos) {if (clist == NULL) {return;}if (pos < 0 || pos >= clist->size) {return;}clinknode* pcur = &(clist->head);for (int i = 0; i < pos; ++i) {pcur = pcur->next;}clinknode* pnext = pcur->next;pcur->next = pnext->next;clist->size--;
}void RemoveByValue_circlelinkist(circlelinkist* clist, clinknode* data, COMPARE compare) {if (clist == NULL) {return;}if (data == NULL) {return;}clinknode* pper = &(clist->head);clinknode* pcur = &(clist->head);for (int i = 0; i < clist->size; ++i) {if (compare(pcur, data) == CIRCLELINKLIST_TRUE) {pper->next = pcur->next;break;}pper = pcur;pcur = pcur->next;}clist->size--;
}int Size_circlelinkist(circlelinkist* clist) {if (clist->size == 0) {return CIRCLELINKLIST_TRUE;}return CIRCLELINKLIST_FALSE;
}int IsEmpty_circlelinkist(circlelinkist* clist) {if (clist->size == 0) {return CIRCLELINKLIST_TRUE;}return CIRCLELINKLIST_FALSE;
}int Find_circlelinkist(circlelinkist* clist, clinknode* data, COMPARE compare) {if (clist == NULL) {return CIRCLELINKLIST_FALSE;}if (data == NULL) {return CIRCLELINKLIST_FALSE;}clinknode* pcur = clist->head.next;int flag = -1;for (int i = 0; i < clist->size; ++i) {if (compare(pcur, data) == CIRCLELINKLIST_TRUE) {flag = i;break;}pcur = pcur->next;}return flag;
}void Print_circlelinkist(circlelinkist* clist, PRINTNODE print) {if (clist == NULL) {return;}clinknode* pcur = clist->head.next;//for (int i = 0; i < clist->size * 3; ++i)for (int i = 0; i < clist->size; ++i) {/* if (pcur == &(clist->head)) {pcur = pcur->next;printf("========================\n");}*/print(pcur);pcur = pcur->next;}
}void Free_circlelinkist(circlelinkist* clist) {if (clist == NULL) {return;}
}typedef struct PERSON {clinknode node;char name[64];int age;
}person;void myprint(clinknode* data) {person* p = (person*)data;printf("name:%s, age:%d \n", p->name, p->age);
}int mycompare(clinknode* data1, clinknode* data2) {person* p1 = (person*)data1;person* p2 = (person*)data2;if (strcmp(p1->name,p2->name) == 0 && p1->age == p2->age) {return CIRCLELINKLIST_TRUE;}return CIRCLELINKLIST_FALSE;
}int main()
{circlelinkist* list = Init_circlelinkist();person p1, p2, p3, p4, p5;strcpy_s(p1.name, "aaa");strcpy_s(p2.name, "bbb");strcpy_s(p3.name, "ccc");strcpy_s(p4.name, "ddd");strcpy_s(p5.name, "eee");p1.age = 10;p2.age = 20;p3.age = 30;p4.age = 40;p5.age = 50;Insert_circlelinkist(list, 100, (clinknode*)&p1);Insert_circlelinkist(list, 100, (clinknode*)&p2);Insert_circlelinkist(list, 100, (clinknode*)&p3);Insert_circlelinkist(list, 100, (clinknode*)&p4);Insert_circlelinkist(list, 100, (clinknode*)&p5);Print_circlelinkist(list, myprint);printf("---------------------------\n");person pdel;strcpy_s(pdel.name, "ccc");pdel.age = 30;RemoveByValue_circlelinkist(list,(clinknode*)&pdel,mycompare);Print_circlelinkist(list, myprint);printf("---------------------------\n");Free_circlelinkist(list);system("pause");return 0;
}
相关文章:

IntelliJ IDEA 设置项目编码
2019独角兽企业重金招聘Python工程师标准>>> IntelliJ IDEA-> Editor->File Encodings 转载于:https://my.oschina.net/bigxuan/blog/804345

util.sh 脚本
#!/bin/bash for i in zzzhadoop101 zzzhadoop102 zzzhadoop103 doecho " $i "ssh $i /opt/module/jdk1.8.0_144/bin/jps donebin目录是在环境变量里的,所以在哪都可以执行 /home/zzz/bin目录下touch util.sh [zzzhadoop101 bin]$ touch …

bzoj3467: Crash和陶陶的游戏
就一篇题解: BZOJ3467 : Crash和陶陶的游戏 - weixin_34248487的博客 - CSDN博客 1.离线,建出Atrie树;B树的倍增哈希数组,节点按照到根路径字典序排序 2.处理A节点对应前缀对应B中的极长可以匹配的区间。在父亲节点区间内二分即可…

载入图像并且显示
#include <opencv2/opencv.hpp> using namespace cv;void main( ) { const char *fileName "1.jpg";Mat srcImage imread("1.jpg");imshow(fileName,srcImage);waitKey(0); }

alter system switch logfile与alter system archive log current的区别
以前知道 ALTER SYSTEM SWITCH LOGFILE对单实例数据库或RAC中的当前实例执行日志切换, ALTER SYSTEM ARCHIVE LOG CURRENT会对数据库中的所有实例执行日志切换, 所以在RAC环境上大多时间一般使用后者,而今天遇到了不管执行多少次ALTER SYSTEM…

【C++】【六】约瑟夫问题
核心代码: int index 1;clinknode* pcur list->head.next;while (Size_circlelinkist(list)>1){if (index N) {mynum* temnum (mynum*)pcur;printf("%d ", temnum->val);clinknode* pnext pcur->next;RemoveByValue_circlelinkist(list…

第六章:内核数据结构
6.1链表链表表示一种存放和操作的可变数据元素的数据结构。链表与静态数组不同的是它包含的元素是动态创建并且插入链表的,在编译时不必知道具体需要多少个元素。另外链表中每个元素的创建时间各不相同,所以它们在内存中无需占用连续的空间。链表中每个元…

【C++】【七】栈的实现
栈的线性表实现 stack_liner_stack.h #ifndef STACK_LINER_H #define STACK_LINER_H #include <stdlib.h> #define MAX_SIZE 1024 #define stack_liner_false 0 #define stack_liner_true 1typedef struct STACK_LINER_H {void* data[MAX_SIZE];int size; }stack_liner…

推荐两款简单好用的图片放大jquery插件
一、zoomfiy.js 推荐可以从这里下载 使用说明: 使用该jquery 插件引入该插件的js:zoomfiy.js 或 min引入该插件的css:zoomfiy.css 或 min前后顺序都可js里加入 调用插件的函数 $(这里写要放大的图片).zoomify();如果有ajax 新生成的图片,要在ajax里再次调…

对图像的缩放与旋转
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" int main( ) {// 读取图像cv::Mat srcImage cv::imread("..\\images\\flower3.jpg");// 图像读取是否成功if( !srcImage.data ) return 1; // 对图像的缩放与旋…

工具库 --- Validator (JS正则)
工具库 --- Validator 今天写的是一个正则验证类 单例模式 工具库地址:github.com/WeForStudy/… npm地址:www.npmjs.com/package/slm… 单例模式 减少不必要的对象生存,减少资源的占用 由于只需要new一次,项目中其他项目共用一个…

【C++】【九】栈的应用
【C】【九】栈的应用 就近匹配原理及其步骤: 中缀转后缀:

linux中错误日志等级
info:仅是一些基本的讯息说明而已;notice:比 info 还需要被注意到的一些信息内容;warning 或 warn:警示讯息,可能有问题,但是还不至于影响到某个 daemon 作。err 或 error :一些重大…

Mat类简略结构
class CV_EXPORTS Mat { public:int flags; // 标志位 int dims ; // 数组的维数int rows,cols; uchar *data ; // 指向数据的指针int * refcount ; // 指针的引用计数器 阵列指向用户分配的数据时,当指针为 NULL };

数据结构之快速排序
首先快速排序:就是选择一个基数,然后从两端依次进行比较,若右边大于基数,则不进行交换,直到右边的数据小于基数,然后冲左边开始和基数比较,若左边的小于基数,则进行下一个比较&#…

【C++】【十】二叉树
树的基本概念: 树具有递归性,非线性 完全二叉树 :所有节点都在 举例: 递归遍历二叉树: #include <stdlib.h> #include <stdio.h> #include <iostream> #include<string.h>typedef struct B…

记一次网络共享打印机故障
刚开始去到办公室发现电脑之间的环境是XP跟WIN10查看共享主机发现没有监听139和445端口 然后在网卡属性把Microsoft网络客户端和Microsoft网络的文件和打印机共享删除重启 重新安装这两个客户端 发现虽然共享主机有监听端口 但是其他主机还是不能访问 最后检查发现主机之间的工…

Mat 类常用函数用法示例
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> int main( ) {cv::Mat Image1( 10, 8, CV_8UC1, cv::Scalar(5) );// 矩阵行列数获取std::cout << "Image1 row: " << I…

记录智能指针使用shared_ptr使用错误
shared_ptr为智能指针,今天一次在使用shared_ptr时,错误的将其初始化方式写为shared_ptr<T> test shared_ptr<T>(),随后导致崩溃 正确做法是shared_ptr<T> test make_shared<T>() 或shared_ptr<T> test shared_ptr<…

【C++】【十一】二叉树递归遍历与非递归遍历的实现及思路
非递归遍历实现思路: #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string.h>typedef struct LINKNODE {struct LINKNODE* next; }linknode;typedef struct LINKLIST {linknode head;int size; }stack_list;#…

定时调度模块:sched
定时调度模块:sched """A generally useful event scheduler class. 事件调度器类Each instance of this class manages its own queue. 类的每一个实例独立管理自己的队列 No multi-threading is implied; you are supposed to hack that yourself, or use a s…

Mat转换为IplImage 类型和CvMat 类型
cv::Mat img; CvMat cvMatImg img; IplImage IplImg img;转载:http://blog.csdn.net/zhuwei1988

大数据学习思路
学习大数据已经有一段时间了,抽空回顾一下自己学习的一些内容。下图主要为自己学习大数据的一个过程。 阶段一:Java基础 掌握JAVA基本语法、面向对象、集合、IO流、多线程、网络编程 阶段二:MySQL CRUD 阶段三…

【C++】【十二】排序实现及思路
掌握核心知识点: 1.插入排序在一下2种情况效率较高:1)数据基本有序 2)数据序列较少 希尔排序是在插入排序的基础上的改进。 2.快速排序 3.归并排序 4.堆排序:数据初始化为数据,根据完全二叉树&#…

Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...
2019独角兽企业重金招聘Python工程师标准>>> 1、如果安装了FTP,可以使用FTP上传rpm到服务器进行安装; 2、挂载光驱cdrom到mnt文件夹下,进入package文件夹rpm进行安装; 3、有源码包进行源码安装; 4、自求多福…

IplImage 类型和 CvMat 类型转换为 Mat 类型
IplImage *IplImg cvLoadImage("fruits.jpg"); Mat img(IplImg, true);转载:http://blog.csdn.net/zhuwei1988

麦当劳数字化转型中获得的6个数据科学经验
摘要 美国大数据公司Civis Analytics于2017年底与麦当劳北美市场营销和数据科学团队建立了数据技术合作伙伴关系,经过一年半的努力,近期在纽约广告周上共同展示了一些重要的学习成果。 麦当劳客户数据科学总监David Galinsky和麦当劳媒体科学经理Emma Hi…

操作系统(三)
学习记录(3) 线程 1.线程的优势在哪? 1.1 多线程之间会共享同一块地址空间和所有可用数据的能力,这是进程所不具备的。 1.2 线程要比进程更轻量级,由于线程更轻,所以它比进程更容易创建,也更容…

【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
近期公司的flannel网络很不稳定,花时间研究了下并且保证云端自动部署的网络能够正常work。 1.网络拓扑 拓扑如下:(点开看大图) 容器网卡通过docker0桥接到flannel0网卡,而每个host对应的flannel0网段为 10.1.x.[1-255…

图像读取、转为灰度图像、均值平滑、显示保存操作
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> int main( ) {// 读取图像源cv::Mat srcImage cv::imread("..\\images\\pool.jpg");if( srcImage…