数据结构三循环链表
来源:互联网 发布:林忆莲歌词知乎 编辑:程序博客网 时间:2024/06/05 22:50
今天记录下循环链表,其实循环链表也就是将单链表中最后一个数据元素的next指针指向第一个元素。
这里有一个概念需要说明下:
游标:在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素
如图
这里介绍静态链表的常用操作:
l 创建循环链表
l 销毁循环链表
l 清空循环链表
l 获取表长度
l 把node插入pos位置
l 获取pos位置的元素
l 删除pos位置的元素
l 删除表中与node相同的元素(删除第一个匹配成功的)
l 重置游标
l 返回游标所指向的结点
l 游标后移
代码总分为三个文件:
CircleList.h : 放置功能函数的声明,以及表的声明,表结点的定义
CircleList.c : 放置功能函数的定义,以及表的定义
Main.c : 主函数,使用功能函数完成各种需求,不过一般用作测试
整体结构图为:
这里详细说下插入操作和删除操作:
插入操作:
如图
插入元素方法:
判断表和插入位置是否合法
由表头开始通过next域移动pos次后,当前元素的next域为要插入的位置
将新元素插入(和单链表插入方法相同)
表长度加1
判断是否为头插(就是头结点和首元素中间插入)
如果是头插的话,把尾结点的next域指向第一个元素(也就是头节点所指向的首元素)
如果之前表为空表,则游标指向插入的结点
删除操作:
如图
删除元素方法:
判断表和插入位置是否合法
由表头开始通过next域移动pos次后,当前元素的next指向的元素为要删除的元素
删除元素(和单链表删除元素相同)
表长度减1
判断是否删除的为首元素
如果删除的是首元素的话,把表尾结点的next域指向首元素
如果删除后表为空,则重置头结点的next域和游标
如果删除的结点正好游标也指向它,则游标后移
OK! 上代码:CircleList.h
- #ifndef _CIRCLELIST_H_
- #define _CIRCLELIST_H_
-
- typedef void CircleList;
- typedef struct _tag_CircleListNode CircleListNode;
-
- struct _tag_CircleListNode
- {
- CircleListNode* next;
- };
-
- 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
CircleList.c
Main.c
- #include <stdio.h>
- #include <stdlib.h>
- #include "CircleList.h"
-
- typedef struct _tag_Value
- {
- CircleListNode header;
- int v;
- }Value;
-
- int main(void)
- {
- int i = 0;
-
- CircleList* list = CircleList_Create();
-
- Value v1,v2,v3,v4,v5,v6,v7,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++)
- {
- Value* p = (Value*)CircleList_Get(list, i);
-
- printf("%d ", p->v);
- }
- printf("\n");
-
- while(CircleList_Length(list) > 0)
- {
- Value* p = (Value*)CircleList_Delete(list, 0);
-
- printf("%d ", p->v);
- }
- printf("\n");
-
- 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, CircleList_Length(list));
- CircleList_Insert(list, (CircleListNode*)&v6, CircleList_Length(list));
- CircleList_Insert(list, (CircleListNode*)&v7, CircleList_Length(list));
- CircleList_Insert(list, (CircleListNode*)&v8, CircleList_Length(list));
-
- for(i=0; i<CircleList_Length(list); i++)
- {
- Value* p = (Value*)CircleList_Next(list);
-
- printf("%d ", p->v);
- }
- printf("\n");
-
- CircleList_Reset(list);
-
- while(CircleList_Length(list) > 0)
- {
- Value* pV = NULL;
-
- for(i=1; i<3; i++)
- {
- CircleList_Next(list);
- }
-
- pV = (Value*)CircleList_Current(list);
- printf("%d\n", pV->v);
-
- CircleList_DeleteNode(list, (CircleListNode*)pV);
- }
-
- CircleList_Destroy(list);
-
- return 0;
- }