LinkList.h:结构的定义,基本函数的申明
#ifndef __LINKLIST_H__
#define __LINKLIST_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
{
int data;
struct Node *next;
}LNode,*LinkList;
/* 初始化 */
Status init(LinkList *list);
/* 销毁 */
Status destroy(LinkList *list);
/* 重置 */
Status clear(LinkList list);
/* 判空 */
Boolean isEmpty(LinkList list);
/* 获取已存元素的数量 */
int listLen(LinkList list);
/* 获取指定索引的元素 */
Status getElem(LinkList list, int index, int *elem);
/* 获取给定元素值,并满足关系的第一个元素的索引 */
int LocateElem(LinkList list, int elem, int (*comp)(int, int));
/* 获取元素的前驱 */
Status getPriorElem(LinkList list, int elem, ElemType *pre_);
/* 获取元素的后继 */
Status getNextElem(LinkList list, int elem, int *next_);
/* 插入一个元素 */
Status insertElem(LinkList list, int index, int elem);
/* 删除一个元素 */
Status deleteElem(LinkList list, int index, int *del_elem);
/* 根据给定关系改变元素的值 */
Status traverse(LinkList list, void (*update)(int *) );
#endif
LinkList.c 函数的实现
#include "LinkList.h"
/* 初始化 */
Status init(LinkList *list)
{
*list = (LinkList)malloc(sizeof(LNode));
if(*list == NULL)
{
printf("动态内存分配失败");
exit(-1);
}
(*list)->next = NULL;
return OK;
}
/* 销毁,连头结点空间也要释放 */
Status destroy(LinkList *list)
{
LinkList p ;
while(!(*list))
{
p = (*list)->next;
free(*list);
*list = p;
}
*list = NULL;
return OK;
}
/* 重置 除头结点外的其他结点都要释放*/
Status clear(LinkList list)
{
LinkList q,p = list->next;
while(!p)
{
q = p->next;
free(p);
p = q;
}
list->next = NULL;
return OK;
}
/* 判空 */
Boolean isEmpty(LinkList list)
{
if(list->next == NULL)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* 获取已存元素的数量 */
int listLen(LinkList list)
{
int i=0;
LinkList p = list->next;
while(!p)
i++;
p = p->next;
}
return i;
}
/* 获取指定索引的元素 */
Status getElem(LinkList list, int index, int *elem)
{
int i=0;
LinkList p = list->next;
while(i < index && p) //从首结点开始向后遍历,到索引位置停止
{
i++;
p = p->next;
}
if(i > index || !p)
{
return ERROR;
}
*elem = p->data;
return OK;
}
/**
* 获取给定元素值,并满足关系的第一个元素的索引
* comp函数类型的返回值是1或0,1表示满足条件,0表示不满足条件
**/
int LocateElem(LinkList list, int elem, int (*comp)(int, int))
{
LinkList p = list->next;
int i=0;
while(p)
{
if(comp(p->data, elem))
{
return i;
}
p = p->next;
i++;
}
return -1;
}
/* 获取元素的前驱 */
Status getPriorElem(LinkList list, int elem, int *pre_)
{
LinkList q,p = list->next;
while(p && p->next)
{
q = p->next;
if(q->data == elem)
{
*pre_ = p->data;
return OK;
}
p = q;
}
return ERROR;
}
/* 获取元素的后继 */
Status getNextElem(LinkList list, int elem, int *next_)
{
LinkList p = list->next;
while(p && p->next) //如果获取第i个元素的后继,则i+1也必须是有效元素
{
if(p->data == elem)
{
*next_ = p->next->data;
return OK;
}
p = p->next;
}
return ERROR;
}
/* 插入一个元素 */
Status insertElem(LinkList list, int index, int elem)
{
int i=0;
LinkList s,p = list;
while(i < index && p) //找到索引的前一个位置
{
p = p->next;
i++;
}
if(i > index || !p)
{
return ERROR;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = elem;
s->next = p->next; //将第i个元素移动到新结点的后面,即新结点的指针域设为第i个元素的结点
p->next = s; //将第i-1个元素的指针域设为新的结点
return OK;
}
/* 删除一个元素 */
Status deleteElem(LinkList list, int index, int *del_elem)
{
int i=0;
LinkList q,p = list;
while(p && i < index)
{
p = p->next;
i++;
}
if(i > index || !p)
{
return ERROR;
}
q = p->next; // 将待删的结点赋值给q
p->next = q->next; //将待删结点的指针域 赋值给 待删结点的前一个结点的指针域
*del_elem = q->data;
free(q);
return OK;
}
/* 根据给定关系改变元素的值 */
Status traverse(LinkList list, void (*update)(int *))
{
LinkList p = list->next;
while(p)
{
update(&(p->data));
p = p->next;
}
printf("\n");
return OK;
}