linux单向循环链表,单向循环链表_Linux编程_Linux公社-Linux系统门户网站

# include# include# include"CircleLinkList.h"

/*创建循环链表*/CircleLinkList*createList()

{/*在堆上分配内存*/CircleLinkList* list = (CircleLinkList *)malloc(sizeof(CircleLinkList));/*初始化*/list->ptr = &list->header;

list->header.next =NULL;

list->slider.next =NULL;

list->length = 0;returnlist;

}/*获取链表长度*/

int length(CircleLinkList *list)

{return list->length;

}/*销毁链表*/

void destory(CircleLinkList *list)

{if (list !=NULL)

{free(list);

}

}/*清空链表*/

void clear(CircleLinkList *list)

{if (list !=NULL)

{

list->header.next =NULL;

list->slider.next =NULL;

}

}/*判断链表是否为空*/

int empty(CircleLinkList *list)

{if (list->length == 0)

{return 1;

}else{return 0;

}

}/*插入结点*/

void insert(CircleLinkList * list, int pos, Node *node)

{if (list ==NULL)

{

printf("链表为NULL\n");return;

}/*判断插入位置是否超过链表长度或小于0*/pos= pos < 0 ? 0: pos;

pos= pos > length(list) ?length(list) : pos;/*注意:如果在第一个位置插入,则需要遍历到最后一个元素,然后再把最后一个元素的指针域指向第一个*/

/*将业务节点转换为链表节点*/CircleNode* _node = (CircleNode *)node;/*判断是否第一次插入*/

if (length(list) == 0)

{

list->header.next =_node;

_node->next =_node;

list->length++;return;

}/*定义posNode结点*/CircleNode* posNode = list->header.next;/*判断是否在头部插入*/

if (pos == 0)

{/*将posNode移动到尾部*/

for (int i = 0; i < length(list)-1; i++)

{

posNode= posNode->next;

}/*将尾部指针指向新节点*/posNode->next =_node;/*将新节点指针指向头节点指向的节点*/_node->next = list->header.next;/*将头节点指向新节点*/list->header.next =_node;

}else{/*将posNode移动到pos位置上*/

for (int i = 0; i < pos-1; i++)

{

posNode= posNode->next;

}/*插入*/_node->next = posNode->next;

posNode->next =_node;

}

list->length++;

}/*删除结点*/Node* del(CircleLinkList * list, intpos)

{if (list ==NULL)

{

printf("链表为NULL\n");returnNULL;

}if (length(list) <= 0)

{

printf("链表已空\n");returnNULL;

}/*判断插入位置是否超过链表长度或小于0*/pos= pos < 0 ? 0: pos;

pos= pos > length(list) ?length(list) : pos;/*定义要删除的节点*/CircleNode* result =NULL;/*定义posNode结点*/CircleNode* posNode = list->header.next;/*判断是否删除头结点*/

if (pos == 0)

{/*移动posNode到pos位置*/

for (int i = 0; i < length(list) - 1; i++)

{

posNode= posNode->next;

}/*保存要删除的节点*/result= posNode->next;/*删除*/posNode->next = list->header.next->next;

list->header.next = list->header.next->next;

}else{/*定义缓存上一个结点*/CircleNode* previous =posNode;/*移动posNode到pos位置*/

for (int i = 0; i < pos; i++)

{

previous=posNode;

posNode= posNode->next;

}/*保存要删除的节点*/result=posNode;/*删除*/previous->next = posNode->next;

}

list->length--;returnresult;

}/*获取结点*/Node* get(CircleLinkList * list, intpos)

{if (list ==NULL)

{

printf("链表为NULL\n");returnNULL;

}/*判断插入位置是否超过链表长度或小于0*/pos= pos < 0 ? 0: pos;

pos= pos > length(list) ? pos%length(list) : pos;/*定义头结点*/CircleNode* header = list->header.next;/*定义pos结点*/CircleNode* posNode =header;/*移动posNode到指定位置*/

for (int i = 0; i < pos; i++)

{

posNode= posNode->next;

}returnposNode;

}/*将游标重置指向链表的第一个元素*/

void resetSlider(CircleLinkList *list)

{

list->slider.next = list->header.next;

}/*获取当前游标指向的数据元素*/Node* current(CircleLinkList *list)

{return list->slider.next;

}/*将游标指向到链表的下一个数据元素并返回当前游标的数据元素*/Node* next(CircleLinkList *list)

{

CircleNode* result = list->slider.next;

list->slider.next = list->slider.next->next;returnresult;

}/*删除游标,并将游标指向下一个数据元素*/Node* deleteNode(CircleLinkList *list)

{if (list ==NULL)

{

printf("链表为NULL\n");returnNULL;

}if (length(list) <= 0)

{

printf("链表已空\n");returnNULL;

}/*获取当前游标的数据结点*/Node* node =current(list);/*将当前游标下移*/next(list);/*定义要删除的节点*/CircleNode* result =NULL;/*定义posNode结点*/CircleNode* posNode = list->header.next;/*将业务节点转换为链表节点*/CircleNode* _node = (CircleNode *)node;/*判断是否删除头结点*/

if (_node == list->header.next)

{/*移动posNode到pos位置*/

for (int i = 0; i < length(list) - 1; i++)

{

posNode= posNode->next;

}/*保存要删除的节点*/result= posNode->next;/*删除*/posNode->next = list->header.next->next;

list->header.next = list->header.next->next;

}else{/*定义缓存上一个结点*/CircleNode* previous =posNode;/*移动posNode到pos位置*/

while (posNode !=_node)

{

previous=posNode;

posNode= posNode->next;

}/*保存要删除的节点*/result=posNode;/*删除*/previous->next = posNode->next;

}

list->length--;returnresult;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值