用C语言实现循环链表
2016-05-22 23:26
363 查看
将单项链表的尾节点指针指向此链表的头结点,即组成了循环链表。
具体实现代码如下【C语言,在vs开发工具下调试通过】
源码分三个文件,分别为CircleLinkList.h CircleLinkList.c main.c
CircleLinkList.h源码:
CircleLinkList.c源码:
main.c源码:
具体实现代码如下【C语言,在vs开发工具下调试通过】
源码分三个文件,分别为CircleLinkList.h CircleLinkList.c main.c
CircleLinkList.h源码:
#ifndef CIRCLELINKLIST #define CIRCLELINKLIST #include<stdio.h> #include<stdlib.h> //链表的小结点 typedef struct CIRCLELINKNODE{ struct CIRCLELINKNODE* next; }CircleLinkNode; //链表结构体 typedef struct CIRCLELINKLIST{ CircleLinkNode head; int size; }CircleLinkList; //编写针对链表结构体操作的API函数 #define CIRCLELINKLIST_TRUE 1 #define CIRCLELINKLIST_FALSE 0 //比较回调 typedef int(*COMPARENODE)(CircleLinkNode*, CircleLinkNode*); //打印回调 typedef void(*PRINTNODE)(CircleLinkNode*); //初始化函数 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
CircleLinkList.c源码:
#include"CircleLinkList.h" //初始化函数 CircleLinkList* Init_CircleLinkList(){ CircleLinkList* clist = (CircleLinkList*)malloc(sizeof(CircleLinkList)); 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 || 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 = pPrev->next; int i = 0; for (i = 0; i < clist->size; i++){ if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE){ pPrev->next = pCurrent->next; clist->size--; break; } pPrev = pCurrent; pCurrent = pPrev->next; } } //获得链表的长度 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 == &(clist->head)){ pCurrent = pCurrent->next; printf("------------------\n"); } print(pCurrent); pCurrent = pCurrent->next; } } //释放内存 void FreeSpace_CircleLinkList(CircleLinkList* clist){ if (clist == NULL){ return; } acf8 free(clist); } </0>
main.c源码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include"CircleLinkList.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; } return CIRCLELINKLIST_FALSE; } int main(void){ //创建循环链表 CircleLinkList* clist = Init_CircleLinkList(); //创建数据 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; p1.score = 50; p2.score = 50; p3.score = 60; p4.score = 65; p5.score = 70; //数据入链表 Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p1); Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p2); Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p3); Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p4); Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p5); //打印 Print_CircleLinkList(clist, MyPrint); Person pDel; strcpy(pDel.name,"ddd"); pDel.age = 40; pDel.score = 65; //根据值删除 RemoveByValue_CircleLinkList(clist, (CircleLinkNode*)&pDel, MyCompare); //打印 printf("--------------\n"); Print_CircleLinkList(clist, MyPrint); //释放内存 FreeSpace_CircleLinkList(clist); system("pause"); return 0; }
相关文章推荐
- C++第六次作业
- c++ 基础知识整理(二)
- c++ primer(第五版)学习笔记及习题答案代码版(第十章)泛型算法
- 请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
- c语言学习笔记13之二维数组1
- c++第6次作业
- GeekBand C++第二周学习感悟
- C/C++中一些不太注意到的小知识点--[锦集]
- c++-作业6
- B00008 C++实现的大整数计算(一)
- 作业:C++作业6
- C++第六次实验(数组操作)
- c++上机作业6
- c++中怎么求二维数组的长度
- c++上机实验6项目三
- C++作业6
- c++中:和::的用法
- 1012. 数字分类 (20)
- c++作业6
- 1011. A+B和C (15)