单向循环链表实例
来源:互联网 发布:武汉破获一起新型网络 编辑:程序博客网 时间:2024/06/04 17:46
游标:循环链表中的“当前”指针,这个指针称为游标,可以通过游标访问链表中的所有元素:
增加:
获取游标所指的数据元素重置游标移动至下一个元素直接指定删除的节点
刚开始游标为空,当插入多个节点后,游标指向第一次插入的那个节点。
实例如下:
//circlelist.h
#ifndef __CIRCLELIST_H__#define __CIRCLELIST_H__typedef struct circlelistnode{ struct circlelistnode *next; int item;}CircleListNode;typedef struct circlelist{ CircleListNode header; int length;}CircleList;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);#endif //__CIRCLELIST_H__
//circlelist.c文件
#include <stdlib.h>#include "circlelist.h"//创建CircleList *CircleList_Create(){ CircleList *ret = NULL; ret = malloc(sizeof(CircleList)); if(ret != NULL) { ret->length = 0; ret->header.next = NULL; } return ret;}//销毁void CircleList_Destroy(CircleList *list){ free(list);}//清空void CircleList_Clear(CircleList *list){ if( list != NULL ) { list->length = 0; list->header.next = NULL; }}//求长度int CircleList_Length(CircleList *list){ int ret = -1; if( list != NULL ) { ret = list->length; } return ret;}//插入int CircleList_Insert(CircleList *list, CircleListNode *node, int pos){ int ret = (list!=NULL) && (node != NULL) && (pos>=0); if( ret ) { int i; CircleListNode *cur = (CircleListNode *)list; for(i=0; i<pos; i++) //让cur遍历 { cur = cur->next; } node->next = cur->next; cur->next = node; if( list->length == 0 ) //只有一个节点的时候 { node->next = node; //自己指向自己 } list->length++; if(cur == (CircleListNode *)list) //实现每次都可以插到第0个位置; 条件是判断是否有一个节点 { CircleListNode *last = CircleList_Get(list, list->length-1); //获得最后一个节点. last->next = node; //让最后一个节点指向刚排好链表的第0个节点 } } return ret;}//获得CircleListNode *CircleList_Get(CircleList *list, int pos){ CircleListNode *ret = NULL; if(list != NULL && pos>=0) { int i; CircleListNode *cur = (CircleListNode *)list; for( i=0; i<pos; i++ ) { cur= cur->next; } ret = cur->next; } return ret;}//删除CircleListNode *CircleList_Delete(CircleList *list,int pos){ CircleListNode *ret = NULL; if(list!=NULL && pos>=0) { int i; CircleListNode *cur = (CircleListNode *)list; CircleListNode *first = list->header.next; CircleListNode *last = CircleList_Get(list,list->length-1); for(i=0; i<pos; i++) { cur = cur->next; } ret = cur->next; //删除的位置赋给了ret cur->next = ret->next; list->length--; if( first == ret ) //删除的是第一个位置 { list->header.next = ret->next; last->next = ret->next; } if( list->length == 0) { list->header.next = NULL; } } return ret;}
//main.c文件
#include <stdio.h>#include <stdlib.h>#include "circlelist.h"int main( void ){ int i; CircleList *list = CircleList_Create(); CircleListNode n1 = {.next=NULL, .item=1}; CircleListNode n2 = {.next=NULL, .item=2}; CircleListNode n3 = {.next=NULL, .item=3}; CircleListNode n4 = {.next=NULL, .item=4}; CircleListNode n5 = {.next=NULL, .item=5}; CircleList_Insert(list, &n1, 0); CircleList_Insert(list, &n2, 0); CircleList_Insert(list, &n3, 0); CircleList_Insert(list, &n4, 0); CircleList_Insert(list, &n5, 7); //当把5插入到第7个位置的时候他会循环回去 printf("length= %d\n", CircleList_Length(list)); for (i=0; i<CircleList_Length(list); i++) { printf("%d ", CircleList_Get(list, i)->item); //获得,并打印出来 } printf("\n"); while (CircleList_Length(list) > 0) { printf("%d ", CircleList_Delete(list, 0)->item); //一一删除 } printf("\n"); CircleList_Destroy(list); return 0;}
//Makefile
CC = gcc -gmain : circlelist.o main.o $(CC) $^ -o $@.PHANY:main cleanclean: rm -rf *.o main
案例二:
用单向循环链表来实现一个小游戏,题目是一圈人数123,当数到3的那个人退出,打印出退出的先后顺序,这里我们的人数为8
案例如下;
在头文件中加上
//加一个游标slidertypedef struct criclelist { CircleListNode header; CircleListNode *slider; int length;}CircleList;CircleListNode *CircleList_Reset(CircleList *list);CircleListNode *CircleList_Next(CircleList *list);CircleListNode *CircleList_Current(CircleList *list);CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node);
在circlelist.c文件中加上:
//重新组合CircleListNode *CircleList_Reset(CircleList *list){ CircleListNode *ret = NULL; if ( list != NULL ) { list->slider = list->header.next; ret = list->slider; } return ret;}//返回指向下一个的指针CircleListNode *CircleList_Next(CircleList *list){ CircleListNode *ret = NULL; if ( list!=NULL && list->slider!=NULL ) { ret = list->slider; list->slider = ret->next; } return ret;}//CircleListNode *CircleList_Current(CircleList *list){ CircleListNode *ret = NULL; if ( list != NULL ) ret = list->slider; return ret;}//删除数到3的那个节点CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node){ CircleListNode *ret = NULL; if ( list!=NULL && node!=NULL ) { int i; CircleListNode *cur = (CircleListNode*)list; for (i=0; i<list->length; i++ ) { if ( cur->next == node) { ret = cur->next; break; } cur = cur->next; } if ( ret != NULL) { CircleList_Delete(list, i); } } return ret;}
在主函数换为:
#include <stdio.h>#include <stdlib.h>#include "circlelist.h"int main( void ){//创建 CircleList *list = CircleList_Create(); CircleListNode n1 = {.next=NULL, .item=1}; CircleListNode n2 = {.next=NULL, .item=2}; CircleListNode n3 = {.next=NULL, .item=3}; CircleListNode n4 = {.next=NULL, .item=4}; CircleListNode n5 = {.next=NULL, .item=5}; CircleListNode n6 = {.next=NULL, .item=6}; CircleListNode n7 = {.next=NULL, .item=7}; CircleListNode n8 = {.next=NULL, .item=8};//插入 CircleList_Insert(list, &n1, CircleList_Length(list)); CircleList_Insert(list, &n2, CircleList_Length(list)); CircleList_Insert(list, &n3, CircleList_Length(list)); CircleList_Insert(list, &n4, CircleList_Length(list)); CircleList_Insert(list, &n5, CircleList_Length(list)); CircleList_Insert(list, &n6, CircleList_Length(list)); CircleList_Insert(list, &n7, CircleList_Length(list)); CircleList_Insert(list, &n8, CircleList_Length(list)); while( CircleList_Length(list) > 0) { int i; for(i=1; i<3; i++) { CircleList_Next(list); } CircleListNode *node = CircleList_Current(list); printf("%d ",node->item); CircleList_DeleteNode(list,node); } printf("\n"); CircleList_Destroy(list); return 0;}
0 1
- 单向循环链表实例
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 循环单向链表
- 单向循环链表
- 循环单向链表
- 单向链表循环
- 循环单向链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 约瑟夫问题(单向循环链表应用实例)
- 单向链表实例
- Java中的内存泄漏分析说明
- Spring3.0学习札记一Spring IOC控制反转(3)
- C++对象生命周期(未完)
- escape、encodeURI、encodeURIComponent不编码的字符
- MongoDB大文件存储流程
- 单向循环链表实例
- 阻塞睡眠实现机制
- Android输入法的关闭打开
- 什么是框架(包括前端框架和后端框架)
- WIFI视频实时预览功能的实现
- 用数组实现队列(C语言版)
- Summary for software designer exam for May 23rd 2015
- uC/OS-II 函数之任务相关函数
- hdu5305 线上朋友和线下朋友(dfs暴力)