循環單鏈表
循環單鏈表的插入操作(分為四種情況,歸結為三類)
循環單鏈表的刪除操作(分為四種情況,歸結為三類)
#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_typedef
void CircleList;
typedef struct _tag_CircleListNode
{struct _tag_CircleListNode
* next;
}CircleListNode;CircleList
* CircleList_Create();
void CircleList_Destroy(CircleList
* list);
void CircleList_Clear(CircleList
* list);
int CircleList_Length(CircleList
* list);
CircleListNode
* CircleList_Get(CircleList
* list, int pos);
int CircleList_Insert(CircleList
* list, CircleListNode
* node, 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===============================================================================
#include <stdio
.h
>
#include <malloc
.h
>
#include "CircleList.h"typedef struct _tag_CircleList
{CircleListNode
header; CircleListNode
* slider; int length;
} TCircleList;CircleList
* CircleList_Create()
{TCircleList
* ret
= (TCircleList
*)malloc(sizeof(TCircleList));
if (ret
== NULL){
return NULL;}ret
->length
= 0;ret
->header.next
= NULL;ret
->slider
= NULL;
return ret;
}
void CircleList_Destroy(CircleList
* list)
{
if (
list == NULL){
return ;}free(
list);
}
void CircleList_Clear(CircleList
* list)
{TCircleList
* sList
= (TCircleList
*)
list;
if (sList
== NULL){
return ;}sList
->length
= 0;sList
->header.next
= NULL;sList
->slider
= NULL;
}int CircleList_Length(CircleList
* list)
{TCircleList
* sList
= (TCircleList
*)
list;int ret
= -1;
if (
list == NULL) {
return ret;}ret
= sList
->length;
return ret;
}CircleListNode
* CircleList_Get(CircleList
* list, int pos)
{TCircleList
* sList
= (TCircleList
*)
list;CircleListNode
* ret
= NULL;int i
= 0;
if (
list==NULL || pos
<0){
return NULL;}{CircleListNode
* current
= (CircleListNode
*)sList;for(i
=0; i
<pos; i
++){current
= current
->next;}ret
= current
->next;}
return ret;
}
int CircleList_Insert(CircleList
* list, CircleListNode
* node, int pos)
{ int ret
= 0, i
=0; TCircleList
* sList
= (TCircleList
*)
list;
if (
list == NULL || node
== NULL || pos
<0){
return -1;}CircleListNode
* current
= (CircleListNode
*)sList;for(i
=0; (i
<pos)
&& (current
->next
!= NULL); i
++){current
= current
->next;}node
->next
= current
->next; current
->next
= node;
if( sList
->length
== 0 ){node
->next
= node; sList
->slider
= node;}sList
->length
++;
if(sList
->length
> 0){
if( current
== (CircleListNode
*)sList ){CircleListNode
* last
= CircleList_Get(sList, sList
->length
- 1); last
->next
= current
->next; }}
return ret;
}
CircleListNode
* CircleList_Delete(CircleList
* list, int pos)
{CircleListNode
* ret
= NULL;TCircleList
* cList
= (TCircleList
*)
list;CircleListNode
* current
= &cList
->header;for(int i
=0;i
<pos;i
++){current
= current
->next; }
if(current
== &cList
->header) {
if(cList
->length
== 1) {ret
= current
->next;current
->next
= NULL;cList
->length
= 0;cList
->slider
= NULL;
return ret;}
else if(cList
->length
> 1) {CircleListNode
* ret
= current
->next;CircleListNode
* last
= CircleList_Get(
list,CircleList_Length(
list)
-1);current
->next
= current
->next
->next;last
->next
= current
->next;cList
->length
--;
if( cList
->slider
== ret ){cList
->slider
= ret
->next;}
return ret;}}ret
= current
->next;current
->next
= current
->next
->next;cList
->length
--;
if( cList
->slider
== ret ){cList
->slider
= ret
->next;}
return ret;
}CircleListNode
* CircleList_DeleteNode(CircleList
* list, CircleListNode
* node)
{TCircleList
* sList
= (TCircleList
*)
list;CircleListNode
* ret
= NULL;int i
= 0;
if( sList
!= NULL ){CircleListNode
* current
= (CircleListNode
*)sList;for(i
=0; i
<sList
->length; i
++){
if( current
->next
== node ){ret
= current
->next;break;}current
= current
->next;}
if( ret
!= NULL ){CircleList_Delete(sList, i);}}
return ret;
}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;
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;
}
======================================================================================
#include <stdio
.h
>
#include <stdlib
.h
>
#include "CircleList.h"struct Value
{CircleListNode
header; int v;
};
void print_1(CircleList
* list)
{for(int i
=0; i
<CircleList_Length(
list); i
++){CircleListNode
* p
= CircleList_Get(
list,i);struct Value
*q
= (struct Value
*)p;printf(
"%d\n",q
->v);}
}
void print_2(CircleList
* list)
{CircleList_Reset(
list);for(int i
=0; i
<CircleList_Length(
list); i
++){struct Value
* pv
= (struct Value
*)CircleList_Next(
list);printf(
"%d\n", pv
->v);}
}
void main()
{CircleList
* list = CircleList_Create();struct 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,
0); CircleList_Insert(
list, (CircleListNode
*)
&v2,
1); CircleList_Insert(
list, (CircleListNode
*)
&v3,
2); CircleList_Insert(
list, (CircleListNode
*)
&v4,
3); CircleList_Insert(
list, (CircleListNode
*)
&v5,
0); CircleList_Insert(
list, (CircleListNode
*)
&v6,
0); CircleList_Insert(
list, (CircleListNode
*)
&v7, CircleList_Length(
list)); CircleList_Insert(
list, (CircleListNode
*)
&v8,
0); print_1(
list);printf(
"\n");
CircleList_Delete(
list,
0);CircleList_Delete(
list,
3);CircleList_Delete(
list,CircleList_Length(
list));print_2(
list);printf(
"\n");
CircleList_Destroy(
list);system(
"pause");
return ;
}
總結
以上是生活随笔為你收集整理的第十天2017/04/23(1、企业财富库:“循环单链表”的设计与实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。