博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
循环链表的实现与操作(C语言实现)
阅读量:5243 次
发布时间:2019-06-14

本文共 6425 字,大约阅读时间需要 21 分钟。

循环链表是还有一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。
循环链表的操作
1,循环链表的新操作
2, 获取当前游标指向的数据元素
3, 将游标重置指向链表中的第一个数据元素

4,将游标移动指向到链表中的下一个数据元素

5,直接指定删除链表中的某个数据元素

CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);

CircleListNode* CircleList_Reset(CircleList* list);
CircleListNode* CircleList_Current(CircleList* list);
CircleListNode* CircleList_Next(CircleList* list);

头文件:

#ifndef _CIRCLE_H_#define _CIRCLE_H_//採用数据封装的方式。防止在主函数改动当中的属性值(有点点像面向对象中的私有属性)typedef void CircleList;typedef struct CircleListNode   //声明指针域{	CircleListNode * next;}CircleListNode;CircleList * CircleList_Create();void CircleList_DesTroy(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_Reset(CircleList* list);CircleListNode* CircleList_Current(CircleList* list);CircleListNode* CircleList_Next(CircleList* list) ;#endif
源文件:

// 循环链表.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include 
#include
#include "CircleList.h"typedef struct //定义头结点{ CircleListNode header; CircleListNode* sLider; //游标 int len;}TCircleList;struct Value //定义数据结构体类型{ CircleListNode header; //指针域 int v; //数据域};int _tmain(int argc, _TCHAR* 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)); //插入到 5 的位置,前面的顺序为 1->2->3->4 // 下标: 0 1 2 3 // 4 5 ... //故而插入到 5 的位置时 打印的结果应为 : 1,5,2,3,4。后面的结果也验证了其正确性 CircleList_Insert(list, (CircleListNode*)&v5, 5); for(i=0; i
v); } while( CircleList_Length(list) > 0 ) { struct Value* pv = (struct Value*)CircleList_Delete(list, 0); printf("删除了:%d\n", pv->v); } CircleList_DesTroy(list); system("pause"); return 0;}//创建CircleList * CircleList_Create(){ TCircleList* list = (TCircleList*)malloc(sizeof(TCircleList)); if(NULL != list) { list->sLider = NULL; list->header.next = NULL; list->len = 0; } return list;}//销毁void CircleList_DesTroy(CircleList * list){ free(list);}//清空void CircleList_Clear(CircleList* list){ TCircleList * sList = (TCircleList*)list; if(NULL != sList) { sList->len = 0; sList->header.next = NULL; sList->sLider = NULL; }}//获得长度int CircleList_Length(CircleList* list){ TCircleList * sList = (TCircleList*)list; int len = -1; if(NULL != sList) { len = sList->len; } return len;}//插入  int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)  {  TCircleList * sList = (TCircleList*)list;  int i = 0;  int ret = 0;  sList->len;  if((NULL != sList) && (pos>=0) && (NULL != node))  {      CircleListNode * current = (CircleListNode*)sList;      for ( i=0; i
next != NULL; i++)      {      current = current->next;      }            node->next = current->next;             current->next = node;      if(sList->len == 0)      {      sList->sLider = node;            }      ++(sList->len);      if( current == (CircleListNode*)sList )      {      CircleListNode* last = CircleList_Get(sList, sList->len - 1);                  last->next = current->next;      }      ret = 1;              }  return ret;  }  //获得结点CircleListNode* CircleList_Get(CircleList* list, int pos){ TCircleList * sList = (TCircleList*)list; CircleListNode * resNode = NULL; int i = 0; if((NULL != sList) && (pos>=0)) { CircleListNode * current = (CircleListNode*)sList; for( i=0; i
next为真正的第一个结点 current = current->next; } resNode = current->next; } return resNode;}//删除CircleListNode* CircleList_Delete(CircleList* list, int pos){ TCircleList * sList = (TCircleList*)list; int i = 0; CircleListNode * resnode = NULL; CircleListNode* first = sList->header.next; CircleListNode* last = (CircleListNode*)CircleList_Get(list,sList->len-1); if((NULL != sList) && (pos >= 0) && (pos < sList->len)) { CircleListNode * current = (CircleListNode*)sList; for ( i=0; i
next为真正的第一个结点 current = current->next; } resnode = current->next; current->next = resnode->next; if(first == resnode) { sList->header.next = first->next; last->next = first->next; } if(sList->sLider == resnode) { sList->sLider = resnode->next; } if(sList->len == 0) { sList->header.next = NULL; sList->sLider = NULL; } } sList->len--; return resnode;}//依据结点来删除CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node){ TCircleList * sList = (TCircleList*)list; CircleListNode* resnode = NULL; int i = 0; if(NULL != sList) { CircleListNode* current = (CircleListNode*)sList; for ( i=0; i
len; i++) { if(node == current->next) { resnode = current->next; break; } current = current->next; } if(NULL != resnode) { CircleList_Delete(sList,i); } } return resnode;}//将游标重置回第一个元素CircleListNode* CircleList_Reset(CircleList* list) { TCircleList* sList = (TCircleList*)list; CircleListNode* ret = NULL; if( sList != NULL ) { sList->sLider= sList->header.next; ret = sList->sLider; } return ret;}//获得当前游标下的结点CircleListNode* CircleList_Current(CircleList* list) { TCircleList* sList = (TCircleList*)list; CircleListNode* ret = NULL; sList->len; sList->header; sList->sLider; if( sList != NULL ) { ret = sList->sLider; } return ret;}//将游标移到下一个结点并获得当前移动前的结点CircleListNode* CircleList_Next(CircleList* list) { TCircleList* sList = (TCircleList*)list; CircleListNode* ret = NULL; if( (sList != NULL) && (sList->sLider != NULL) ) { ret = sList->sLider; sList->sLider = ret->next; } return ret;}
执行结果:

15234删除了:1删除了:5删除了:2删除了:3删除了:4请按随意键继续. . .
如有错误,望不吝指出。

转载于:https://www.cnblogs.com/ldxsuanfa/p/9963086.html

你可能感兴趣的文章
Weblogic部署web项目
查看>>
浅谈Java中的hashcode方法
查看>>
excel怎么制作三维圆环图表
查看>>
Java 中的悲观锁和乐观锁的实现
查看>>
React 16.3.0 发布,构建用户界面的 JavaScript 库
查看>>
【20101110-01】NET+AE开发中常见几种非托管对象的释放【转帖】.
查看>>
uva11183 最小树形图模板题
查看>>
bfs+dfs乱搞+类似拓扑排序——cf1182D
查看>>
CSS 响应式布局实用技巧
查看>>
(原创)由XPS生成AXI Lite 从设备IP模板我们能学到的东西
查看>>
前端进度报告(2018.5.17)
查看>>
CSS样式基础总结
查看>>
.ftl文件 是什么文件 Freemarker
查看>>
PHP扩展开发及内核应用
查看>>
case when 用法
查看>>
Java操作Memcached
查看>>
Django之Django debug toolbar调试工具
查看>>
vue+websocket+express+mongodb实战项目(实时聊天)
查看>>
python3 练习题100例 (六)
查看>>
Luogu 3939 数颜色
查看>>