<= pos) )//链表不为空是合法的,长度正常{CircleListNode* current = (CircleListNode*)sList;CircleListNode* first = sList->header.next;// 标记第一个元素CircleListNode* last = (CircleListNode*)CircleList_Get(sList,sList->length - 1);// 由get函数得到最后一个元素for(i=0;inext;//第一个元素所在下标}ret = current->next;current->next = ret->next;sList->length--;if(first == ret)// 判断删除元素是否是原来表头,first指针与原来ret指针是否是同一个{sList->header.next = ret->next;// 将表头指向retlast->next = ret->next;// 指针移动到原来的第二个元素}if(sList->length == 0)// 如果链表空了则前面操作没有意义{sList->header.next = NULL;// 复原}}return ret;}
main.c
#include #include #include"CircleList.h"//自己创建的文件,而不是系统文件用双引号struct Value{CircleListNode header;// 定义域int v;// 真正保存数据的域}int main(int argc,char *argv[]){int i = 0;CircleList*list = CircleList_Create();struct Value v1;struct Value v2;struct Value v3;struct Value v4;struct Value v5;struct Value v6;struct Value v7;struct Value v8;v1.v = 1 ;v2.v = 2 ;v3.v = 3 ;v4.v = 4 ;v5.v = 5 ;v6.v = 6 ;v7.v = 7 ;v8.v = 8 ;// 尾插法,插入到最后一个元素后面CircleList_Insert(list,( CircleListNode*)&V1, CircleList_Length(list));CircleList_Insert(list,( CircleListNode*)&V2, CircleList_Length(list)); CircleList_Insert(list,( CircleListNode*)&V3, CircleList_Length(list)); CircleList_Insert(list,( CircleListNode*)&V4, CircleList_Length(list)); CircleList_Insert(list,( CircleListNode*)&V5,5);CircleList_Delete(list,0);// 证明是循环链表,删除第一个元素,循环两遍for(i=0;i < 2*CircleList_Length(list);i++){struct Value* pv = (struct Value*) CircleList_Get(list,i)printf("%d\n",pv->v);}printf("\n");while( CircleList_Length(list) > 0)// 循环链表还有元素从头开始删{struct Value* pv = (struct Value*) CircleList_Delete(list,0);printf("%d\n",pv->v);}CircleList_Destory(list); return 0;}
文章插图
为了体现循环链表的威力,引入游标:在循环链表中定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中所有元素 。
文章插图
加了游标新操作.h文件????
#ifndef _CIRCLELIST_H_#define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNote;struct _tag_CircleListNode{CircleListNode* next;}CircleList* CircleList_Creat(int capacity);void CircleList_Destory(CircleList* list);void CircleList_Clear(CircleList* list);int CircleList_Length(CircleList* list);int CircleList_Insert(CircleList* list,CircleListNode* node,int pos);CircleListNode* CircleList_Get(CircleList* list,int pos);CircleListNode* CircleList_Delete(CircleList* list,int pos);// 加入游标新操作// 获取当前游标指向的数据元素,可以删除链表里某个数据元素,不需要先得到所要删除的数据下标CircleListNode* CircleList_DeleteNode(CircleList* list,CircleListNode* node);// 将游标重置指向链表中的第一个元素CircleListNode* CircleList_Resert(CircleList* list);// 将游标移动到链表的下一个数据元素CircleListNode* CircleList_Current(CircleList* list);// 直接删除链表中某个数据元素CircleListNode* CircleList_Next(CircleList* list);#endif
文章插图
加了游标新操作CircleList.h文件????
#include #include #include "CircleList.h"#define AVAILABLE -1//空闲位置的宏//静态链表结构体定义typedef struct _tag_CircleList{CircleListNode header;//链表头CircleListNode* sLidrer;// 定义游标int length;}TCircleList;CircleList* CircleList_Create()//o(1){TCircleList* ret = (TCircleList*)malloc(sizeof(TCircleList));if(ret != NULL)//指针不为0时可以继续赋值操作{ret->length = 0;ret->header.next = NULL;ret->slider= NULL;// 在循环链表创建的时候,没有元素,游标定义为空}return ret;}void CircleList_Destory(CircleList* list){free(list);}void CircleList_Clear(CircleList* list) //o(1){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 if(sList != NULL)//链表不为空是合法的,可以继续清空操作{sList->length = 0;sList->header.next= NULL;//第一个元素下标没有了sList->slider= NULL;// 循环链表重置为复原状态 。游标也重置为空}}int CircleList_Length(CircleList* list)//o(1){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 int ret = -1;//定义一个返回值if(sList !=NULL)//链表不为空是合法的,可以继续清空操作{ret = sList->length;}return ret;}// 插入时,如果表头是空的指向NULL,元素是空的,进行单链表元素插入时,现将插入元素// 尾结点与NULL相连,再把插入元素数据与前结点相连,再把该节点next与自己相连,去除原来NULL,构成循环链表int CircleList_Insert(CircleList* list,CircleListNode* node,int pos)//o(n)n是插入元素的位置·{TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 int ret =(sList !=NULL)&& (pos >=0) && (node != NULL);//单链表方法完成判断int i=0;if(ret)//在数组中找空闲位置index{CircleListNode* current = (CircleListNode*)sList;for(i = 0;(inext != NULL); i++){current = current->next;}node->next = current->next;current->next = node;if(sList->length == 0)// 插入的元素是第一个,length的值为0{slider->slider = node;// 游标指向插入的第一个结点node->next =node;// 游标默认初始位置为0,新元素node的next指针指向自己}sList->length++ ;}return ret;}CircleListNode* CircleList_Get(CircleList* list,int pos)// o(n){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 CircleListNode* ret = NULL;//定义一个返回值int i = 0;if((sList != NULL) &&(0
- 数据结构系列--栈与递归
- 数据结构系列--栈的实践
- 数据结构 C++实现 基于不同策略的英文单词的词频统计和检索系统
- JS中各种循环遍历方式:for-in,for-of,forEach
- 很有用的AngularJS 介绍
- 低碳循环饮食法,碳水循环饮食法怎么吃
- 莫高窟暂停开放
- 变形金刚4什么时候上映
- 7 我教女朋友学编程html系列—Html无序列表、自定义列表、有序列表及常用
- 代码展示 C#系列---①三层架构中各层次之间的调用