CircleList.h
#ifndef __CIRCLELIST_H__
#define __CIRCLELIST_H__
//一些库函数的头文件包含
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
//自定义bool
typedef int Boolean;
//定义函数返回状态
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,*PNode;
/* 初始化 */
Status init(PNode *list);
/* 销毁 */
Status destroy(PNode *list);
/* 重置 */
Status clear(PNode *list);
/* 判空 */
Boolean isEmpty(PNode list);
/* 获取已存元素的数量 */
int listLen(PNode list);
/* 获取指定索引的元素 */
Status getElem(PNode list, int index, int *elem);
/* 获取给定元素值,并满足关系的第一个元素的索引 */
int LocateElem(PNode list, int elem, int (*comp)(int, int));
/* 获取元素的前驱 */
Status getPriorElem(PNode list, int elem, int *pre_);
/* 获取元素的后继 */
Status getNextElem(PNode list, int elem, int *next_);
/* 插入一个元素 */
Status insertElem(PNode *list, int index, int elem);
/* 删除一个元素 */
Status deleteElem(PNode *list, int index, int *del_elem);
/* 根据给定关系改变元素的值 */
Status traverse(PNode list, void (*update)(int *) );
#endif
CircleList.c
#include "CircleList.h"
/* 初始化 */
Status init(PNode *list)
{
*list = (PNode)malloc(sizeof(LNode));
if(!*list)
{
printf("动态内存分配失败");
exit(-1);
}
(*list)->next = *list;
return OK;
}
/* 销毁 */
Status destroy(PNode *list)
{
//获取头结点
PNode q,p = (*list)->next;
while(p != (*list) ) //只要首结点的下个结点不是尾结点
{
q = p->next;
free(p);
p = q;
}
free(*list);
*list = NULL;
return OK;
}
/* 重置 */
Status clear(PNode *list)
{
//获取头结点,并将头结点的next设为自身(初始循环状态),其实就是讲尾指针指向head结点上
*list = (*list)->next;
PNode q,p = (*list)->next;//获取首结点
while(p!=(*list))
{
q = p->next;
free(p);
p = q;
}
(*list)->next = (*list); //再将头结点的n指针域设为自身
return OK;
}
/* 判空 */
Boolean isEmpty(PNode list)
{
if(list->next == list)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* 获取已存元素的数量 */
int listLen(PNode list)
{
int i=0;
//获取头结点,如果获取的是首结点,则循环完了还要加上尾结点这个元素
PNode p = list->next;
while(p != list)
{
i++;
p = p->next;
}
return i;
}
/* 获取指定索引的元素 */
Status getElem(PNode list, int index, int *elem)
{
int i = 0;
PNode p = list->next;
while(i < index && p!=list)
{
i++;
p = p->next;
}
if(i > index || p == list)
{
return ERROR;
}
*elem = p->next->data;
return OK;
}
/* 获取给定元素值,并满足关系的第一个元素的索引 */
int LocateElem(PNode list, int elem, int (*comp)(int, int))
{
int i = 0;
PNode p = list->next->next;
while(p != list->next)
{
if(comp(p->data, elem))
{
return i;
}
i++;
p = p->next;
}
return -1;
}
/* 获取元素的前驱 */
Status getPriorElem(PNode list, int elem, int *pre_)
{
PNode q,p = list->next->next;
q = p->next;
while(q != list->next) //只要结点不等于头结点
{
if(q->data == elem)
{
*pre_ = p->data;
return OK;
}
p = q;
q = q->next;
}
return ERROR;
}
/* 获取元素的后继 */
Status getNextElem(PNode list, int elem, int *next_)
{
PNode p = list->next->next;
while(p != list)
{
if(p->data == elem)
{
*next_ = p->next->data;
return OK;
}
p = p->next;
}
return ERROR;
}
/* 插入一个元素 */
Status insertElem(PNode list, int index, int elem)
{
int i =0;
PNode s,p = list->next;
while(i < index && p != list->next)
{
i++;
p = p->next;
}
if( i > index || p == list->next)
{
return ERROR;
}
s = (PNode)malloc(sizeof(LNode));
s->data = elem;
s->next = p->next;
p->next = s;
if(p == list) //如果p是尾结点,则说明是在尾结点后插入结点,则尾指针应该指向新结点
{
list = s;
}
return OK;
}
/* 删除一个元素 */
Status deleteElem(PNode *list, int index, int *del_elem)
{
int i = 0;
PNode q,p = (*list)->next;
while(i < index && p != (*list))
{
i++;
p = p->next;
}
if( i > index || p == (*list))
{
return ERROR;
}
q = p->next;
p->next = q->next;
if(q == (*list))
{
*list = p;
}
*del_elem = q->data;
free(q);
q= NULL;
return OK;
}
/* 根据给定关系改变元素的值 */
Status traverse(PNode list, void (*update)(int *) )
{
PNode p = list->next;
while( p!= list)
{
update( &(p->next->data) );
p = p->next;
}
printf("\n");
return OK;
}