循环链表c语言实现 circlelinklist.h 和 circlelinklist.c
来源:互联网 发布:淘宝举证是什么意思 编辑:程序博客网 时间:2024/06/07 06:18
circlelinklist.h 文件
#ifndef _CIRCLE_LINK_LIST_H_#define _CIRCLE_LINK_LIST_H_#include <stdio.h>#include <stdlib.h>#include <string.h>//循环链表//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。//链表就是一个一个的表通过关系节点连接的//利用小节点定义一个链表头,其他的业务节点有业务自己定义后连接到表头上//实现上层调用和底层分离,不让调用用户知道数据结构typedef void List;typedef void ListNode;#ifndef bool#define bool int#define true 1#define false 0#endif//定义小节点是有联系的 ,小节点的链表typedef struct _tag_CircleLinkListConnectedNode{ struct _tag_CircleLinkListConnectedNode* next;}CircleLinkListConnectedNode;//定义链表typedef struct _tag_CircleLinkList{ CircleLinkListConnectedNode head; //小节点 CircleLinkListConnectedNode* slider; //游标 int length; //小节点的个数就相当于业务节点的个数}CircleLinkList;List* CircleLinkList_Create();bool CircleLinkList_Destory(List* list);bool CircleLinkList_Clear(List* list);int CircleLinkList_GetLength(List* list);bool CircleLinkList_InsertOneNode(List* list , ListNode* listnode, int pos);ListNode* CircleLinkList_GetOneNode(List* list, int pos);ListNode* CircleLinkList_DeleteOneNode(List* list,int pos);bool CircleLinkList_DeleteAllNode(List* list);ListNode* CircleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode);ListNode* CircleLinkList_ResetSlider(List* list);ListNode* CircleLinkList_GetCurrentSlider(List* list);ListNode* CircleLinkList_SliderMoveToNext(List* list);#endif
circlelinklist.c 文件
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "circlelinklist.h"//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。//链表就是一个一个的表通过关系节点连接的List* CircleLinkList_Create(){ List* ret = NULL; CircleLinkList* temp_circlelist = NULL; temp_circlelist = (CircleLinkList*)malloc(sizeof(CircleLinkList)); if (temp_circlelist == NULL) { return NULL; } temp_circlelist->head.next =NULL; temp_circlelist->length = 0; temp_circlelist->slider = NULL; ret = (CircleLinkList*)temp_circlelist; return ret;}bool CircleLinkList_Destory(List* list){ CircleLinkList* temp_circlelist = NULL; if (list == NULL) { return false; } temp_circlelist = (CircleLinkList*)list; free(temp_circlelist); temp_circlelist = NULL; return true;}bool CircleLinkList_Clear(List* list){ CircleLinkList* temp_circlelist = NULL; if (list == NULL) { return false; } temp_circlelist = (CircleLinkList*)list; //长度清零,头部指向空,游标指向空 temp_circlelist->length = 0; temp_circlelist->head.next = NULL; temp_circlelist->slider = NULL; return true;}int CircleLinkList_GetLength(List* list){ int ret = 0; CircleLinkList* temp_circlelist = NULL; if (list == NULL) { return -1; } temp_circlelist = (CircleLinkList*)list; ret = temp_circlelist->length; return ret;}bool CircleLinkList_InsertOneNode(List* list , ListNode* listnode, int pos){ CircleLinkList* temp_circlelist = NULL; CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL; CircleLinkListConnectedNode* pcurrent = NULL; int i = 0; CircleLinkListConnectedNode* lastnode = NULL; if (list == NULL || listnode == NULL || pos < 0) { return false; } temp_circlelist = (CircleLinkList*)list; temp_circlelistconnected_node = (CircleLinkListConnectedNode*)listnode; //链表的首地址与小节点的地址相同 pcurrent = (CircleLinkListConnectedNode*)temp_circlelist; //pcurrent =(CircleListNode*) &(temp_circlelist->head); //辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。 for (i = 0; (i < pos && pcurrent->next != NULL); i ++) { pcurrent = pcurrent->next; } //插入节点 temp_circlelistconnected_node->next = pcurrent->next; pcurrent->next = temp_circlelistconnected_node; //第一次插入节点,游标指向插入的第一个节点 即 0 位置 if (temp_circlelist->length == 0) { temp_circlelist->slider = temp_circlelistconnected_node; } //长度加1 temp_circlelist->length++; //辅助指针没有调,头插法,插到0位置 if (pcurrent == (CircleLinkListConnectedNode*)temp_circlelist) { //得到最后一个节点 lastnode = (CircleLinkListConnectedNode*)CircleLinkList_GetOneNode((List*)temp_circlelist,temp_circlelist->length - 1); //最后一个节点的next域指向当前插入 lastnode->next = pcurrent->next; //lastnode->next = temp_circlelist_node; } return true;}ListNode* CircleLinkList_GetOneNode(List* list, int pos){ CircleLinkList* temp_circlelist = NULL; CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL; CircleLinkListConnectedNode* pcurrent = NULL; int i = 0; ListNode* ret = NULL; if (list == NULL || pos < 0) { return NULL; } temp_circlelist = (CircleLinkList*)list; //不要判断长度了,循环的嘛 if (temp_circlelist->length <= 0 ) { return NULL; } //链表的首地址与小节点的地址相同 pcurrent = (CircleLinkListConnectedNode*)temp_circlelist; //pcurrent =(CircleListNode*) &(temp_circlelist->head); //辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。 for (i = 0; (i < pos && pcurrent->next != NULL); i ++) { pcurrent = pcurrent->next; } temp_circlelistconnected_node = (CircleLinkListConnectedNode*)(pcurrent->next); ret = (ListNode*)temp_circlelistconnected_node; return ret;}ListNode* CircleLinkList_DeleteOneNode(List* list,int pos){ CircleLinkList* temp_circlelist = NULL; CircleLinkListConnectedNode* temp_circlelistconnected_node_delete = NULL; CircleLinkListConnectedNode* pcurrent = NULL; CircleLinkListConnectedNode* lastnode = NULL; int i = 0; ListNode* ret = NULL; if (list == NULL || pos < 0) { return NULL; } temp_circlelist = (CircleLinkList*)list; //链表的首地址与小节点的地址相同 pcurrent = (CircleLinkListConnectedNode*)temp_circlelist; //pcurrent =(CircleListNode*) &(temp_circlelist->head); if (temp_circlelist->length <= 0 || pos >= temp_circlelist->length) { return NULL; } //辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。 for (i = 0; (i < pos && pcurrent->next != NULL); i ++) { pcurrent = pcurrent->next; } temp_circlelistconnected_node_delete = pcurrent->next; pcurrent->next = temp_circlelistconnected_node_delete->next; //pcurrent->next = pcurrent->next->next; //如果从0位置删除 if (pcurrent == (CircleLinkListConnectedNode*)temp_circlelist) { //得到最后一个节点 lastnode = (CircleLinkListConnectedNode*)CircleLinkList_GetOneNode((List*)temp_circlelist,temp_circlelist->length - 1); //最后一个节点的next域指向当前插入 if (lastnode != NULL) { lastnode->next = pcurrent->next; //lastnode->next = temp_circlelist_node_delete->next; //lastnode->next = temp_circlelist->head.next; } } //长度减1 temp_circlelist->length--; //如果删除的是游标指向的位置则游标下移 if (temp_circlelist->slider == temp_circlelistconnected_node_delete) { temp_circlelist->slider = temp_circlelistconnected_node_delete->next; } //长度为0就清空 if (temp_circlelist->length == 0) { temp_circlelist->head.next = NULL; temp_circlelist->slider = NULL; } ret = (ListNode*)temp_circlelistconnected_node_delete; return ret;}bool CircleLinkList_DeleteAllNode(List* list){ CircleLinkList* temp_circlelist = NULL; if (list == NULL) { return false; } temp_circlelist = (CircleLinkList*)list; while (temp_circlelist->length > 0 ) { CircleLinkList_DeleteOneNode((List*)temp_circlelist,0); } return true;}ListNode* CircleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode){ CircleLinkList* temp_circlelist = NULL; CircleLinkListConnectedNode* temp_circlelistconnected_node_delete = NULL; CircleLinkListConnectedNode* pcurrent = NULL; CircleLinkListConnectedNode* retnode = NULL; int i = 0; ListNode* ret = NULL; if (list == NULL || listnode == NULL) { return NULL; } temp_circlelist = (CircleLinkList*)list; temp_circlelistconnected_node_delete = (CircleLinkListConnectedNode*)listnode; pcurrent = (CircleLinkListConnectedNode*)temp_circlelist; for (i = 0; i < temp_circlelist->length; i ++) { pcurrent = pcurrent->next; if (pcurrent == temp_circlelistconnected_node_delete) { retnode = pcurrent; break; } } if (retnode == NULL) { return NULL; } CircleLinkList_DeleteOneNode((List*)temp_circlelist,i); ret =(ListNode*)retnode; return ret;}//重置游标ListNode* CircleLinkList_ResetSlider(List* list){ CircleLinkList* temp_circlelist = NULL; CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL; ListNode* ret = NULL; if (list == NULL) { return NULL; } temp_circlelist = (CircleLinkList*)list; temp_circlelist->slider = temp_circlelist->head.next; temp_circlelistconnected_node = temp_circlelist->slider; ret = (ListNode* )temp_circlelistconnected_node; return ret;}//返回当前游标,ListNode* CircleLinkList_GetCurrentSlider(List* list){ CircleLinkList* temp_circlelist = NULL; CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL; ListNode* ret = NULL; if (list == NULL) { return NULL; } temp_circlelist = (CircleLinkList*)list; temp_circlelistconnected_node = temp_circlelist->slider; ret = (ListNode* )temp_circlelistconnected_node; return ret;}//游标下移,并返回游标下移之前的节点ListNode* CircleLinkList_SliderMoveToNext(List* list){ CircleLinkList* temp_circlelist = NULL; CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL; ListNode* ret = NULL; if (list == NULL) { return NULL; } temp_circlelist = (CircleLinkList*)list; if (temp_circlelist->slider == NULL) { return NULL; } //得到当前游标指向的节点 temp_circlelistconnected_node = temp_circlelist->slider; //游标下移,指向下一个节点 temp_circlelist->slider = temp_circlelistconnected_node->next; //返回当初得到的节点 ret = (ListNode*)temp_circlelistconnected_node; return ret;}/***********************以下为测试代码************************//*typedef struct _tag_Teacher{ CircleLinkListConnectedNode node; int age ; char name[];}Teacher;void main(){ List* list = NULL; Teacher t1,t2,t3,t4,t5; int kk = 0; Teacher* teacher = NULL; t1.age = 21;t2.age = 22;t3.age = 23;t4.age = 24;t5.age = 25; list = CircleLinkList_Create(); if (list == NULL) { printf("创建list失败"); } //尾插法 CircleLinkList_InsertOneNode(list,(ListNode*)&t1,CircleLinkList_GetLength(list)); CircleLinkList_InsertOneNode(list,(ListNode*)&t2,CircleLinkList_GetLength(list)); CircleLinkList_InsertOneNode(list,(ListNode*)&t3,CircleLinkList_GetLength(list)); CircleLinkList_InsertOneNode(list,(ListNode*)&t4,CircleLinkList_GetLength(list)); CircleLinkList_InsertOneNode(list,(ListNode*)&t5,CircleLinkList_GetLength(list)); //打印2边,能输出2遍,没有越界,证明是循环链表 for (kk = 0; kk < 2*CircleLinkList_GetLength(list); kk ++) { teacher = (Teacher* )CircleLinkList_GetOneNode(list,kk); printf("老师%d的年龄是%d",kk,teacher->age); printf("\n"); } CircleLinkList_DeleteOneNodeByNodePointer(list,(ListNode*)&t5); printf("链表长度%d \n",CircleLinkList_GetLength(list)); for (kk = 0; kk < 2*CircleLinkList_GetLength(list); kk ++) { teacher = (Teacher* )CircleLinkList_GetOneNode(list,kk); printf("老师%d的年龄是%d",kk,teacher->age); printf("\n"); } printf("链表长度%d \n",CircleLinkList_GetLength(list)); CircleLinkList_DeleteAllNode(list); printf("链表长度%d \n",CircleLinkList_GetLength(list)); CircleLinkList_Destory(list); system("pause");}*/
可能会调用其它头文件或源文件,如果调用,请翻看我的其它博客,对其头文件或源文件的实现。
good luck !
阅读全文
1 0
- 循环链表c语言实现 circlelinklist.h 和 circlelinklist.c
- C语言实现双向循环链表
- 循环链表C语言实现
- C语言实现双向循环链表
- C语言实现双向循环链表
- C语言实现双向循环链表
- C语言循环链表实现
- C语言双向循环链表实现
- 用C语言实现循环链表
- 单向循环链表C语言实现
- 循环链表的C语言实现
- C语言实现双向循环链表
- c语言实现单向循环链表
- c语言实现双向循环链表
- 单向循环链表C语言实现
- 链表线性表的c语言实现方式 seqlist.h 和 seqlist.c
- 链表的链性表的c语言实现方式 linklist.h 和 linklist.c
- 单向链表装载用户自定义数据的c语言实现 linklistpackagenode.h 和 linklistpackagenode.c
- docker配置远程连接
- maven构建第一个项目
- Codeforces Gym 101158 F. Three Kingdoms of Bourdelot
- (1) near "limit": syntax error (sqlite报错)
- 从编译角度看java域和方法
- 循环链表c语言实现 circlelinklist.h 和 circlelinklist.c
- 火车出站
- 循环从终端输入整数,在循环体中求出奇数的个数以及偶数的个数,当输入值为0时循环退出
- 【codeforces 747A】Display Size
- 浅谈ARP协议
- JVM处理兼容具体措施的分析
- Qt 多线程之间的通信 实例 emit
- 计算二进制数中1的个数
- python之decode、encode及codecs模块