数据结构---线性表(单循环链表)

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;
}

猜你喜欢

转载自blog.csdn.net/yimo_5288/article/details/84971359