#include<stdio.h>
#include<stdlib.h>
//线性表的循环链表分配顺序存储结构
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef int ElemType;
//线性表的循环链表动态分配顺序存储结构
typedef struct CircleNode{
ElemType data;//存储空间基址
struct CircleNode *next;
}CircleNode,*CircleLinkList;
Status InitList_CL(CircleLinkList &L)
{
//操作结果:返回一个空的线性表L
L=(CircleLinkList)malloc(sizeof(struct CircleNode));//产生头结点,并使L指向此头结点
if(!L)
return OVERFLOW;//存储分配失败
L->next=L;//指针域指向头结点
printf("初始化线性表成功\n");
return OK;
}//InitList_CL
//销毁线性表L
Status DestroyList_CL(CircleLinkList &L)
{
CircleLinkList p=L,q=L->next;
while(p!=L)//循环一直到表尾
{
p->next=q->next;
free(q);
q=p->next;
}
free(L);
L=NULL;
printf("销毁线性表成功\n");
return OK;
}//DestroyList_CL
Status ClearList_CL(CircleLinkList &L)
{
//初始条件:线性表L已存在。操作结果:将L重置为空表
CircleLinkList p=L,q=L->next;//p 指向头结点,q指向第二个节点
while(p!=L)
{
p->next=q->next;
free(q);
q=p->next;
}
printf("清空线性表成功\n");
return OK;
}//ClearList_CL
Status ListEmpty_CL(CircleLinkList L)
{
//初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
CircleLinkList p=L->next;
if(p==L)
return TRUE;
else
return FALSE;
}//ListEmpty_CL
Status ListLength_CL(CircleLinkList L)
{
//初始条件:L已存在。操作结果:返回L中数据元素个数
CircleLinkList p=L,q=L->next;
int i=0;
while(q!=L)
{
++i;
q=q->next;
}
return i;
}//ListLength_CL
Status GetElem_CL(CircleLinkList L,int i,ElemType &e)
{
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
CircleLinkList p=L,q=L->next;
int j=1;
if(i<1||i>ListLength_CL(L))return ERROR;
while(j<i)
{
++j;
q=q->next;
}
e=q->data;
return OK;
}//GetElem_CL
Status LocateElem_CL(CircleLinkList L,ElemType &e,Status (*compare)(ElemType,ElemType))
{
//初始条件:线性表L已存在,compare()是数据元素判定函数
//操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0
int i=0;
CircleLinkList p=L->next;
while(p!=L)
{
++i;
if((*compare)(p->data,e))
{
return i;
}
p=p->next;
}
}//LocateElem_CL
Status compare(ElemType e1,ElemType e2)
{
if(e1==e2)
return OK;
}
Status PriorElem_CL(CircleLinkList L,ElemType cur_e,ElemType &pre_e)
{
//初始条件:线性表L已存在
//操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱
//否则操作失败,pre_e无定义
CircleLinkList p=L->next;
while(p&&p->next&&p->next!=L)
{
if(p->next->data==cur_e)
{
pre_e=p->data;
return TRUE;
}
p=p->next;
}
return ERROR;
}
//PriorElem_CL
Status NextElem_CL(CircleLinkList L,ElemType cur_e,ElemType &next_e)
{
// 初始条件:线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继
// 否则操作失败,next_e无定义
CircleLinkList p=L->next;
while(p&&p->next&&p->next!=L)
{
if(p->data==cur_e)
next_e=p->next->data;
return TRUE;
}
return ERROR;
}//NextElem_CL
Status ListInsert_CL(CircleLinkList &L,int i,ElemType e)
{
//在L的第i个位置之前插入元素e
int j=0;
CircleLinkList q=L;
if(i<1||i>ListLength_CL(L)+1)return ERROR;
while(j<i-1)
{
++j;
q=q->next;
}
CircleLinkList s=(CircleLinkList)malloc(sizeof(struct CircleNode));
s->data=e;
s->next=q->next;
q->next=s;
return OK;
}//ListInsert_CL
Status LinkDelete_CL(CircleLinkList &L,int i,ElemType &e)
{
//删除L的第i个元素,并由e返回其值
int j=0;
CircleLinkList q=L,p;
if(i<1||i>ListLength_CL(L))return ERROR;
while(j<i-1)
{
++j;
q=q->next;
}
p=q->next;
q->next=p->next;
free(p);
}//LinkDelete_CL
Status ListTraverse_CL(CircleLinkList L,Status (*visit)(ElemType e))
{
CircleLinkList p=L->next;
printf("线性表遍历结果:");
while(p!=L)
{
if((*visit)(p->data))
printf("%d,",p->data);
p=p->next;
}
printf("\n");
return OK;
}//ListTraverse_CL
Status visit(ElemType e)
{
return OK;
}
int main(void)
{
CircleLinkList L;
ElemType e,pre_e,next_e;
InitList_CL(L);
ListInsert_CL(L,1,1);
ListInsert_CL(L,2,2);
ListTraverse_CL(L,visit);
if(!ListEmpty_CL(L))
printf("线性表不为空\n");
GetElem_CL(L,1,e);
printf("线性表第1个元素为:%d\n",e);
printf("线性表元素为1的位序为:%d\n",LocateElem_CL(L,e,compare));
PriorElem_CL(L,2,pre_e);
printf("线性表元素为2的前驱为:%d\n",pre_e);
NextElem_CL(L,1,next_e);
printf("线性表元素为1的后继为:%d\n",next_e);
//printf("线性表删除位序1后:");
LinkDelete_CL(L,1,e);
ListTraverse_CL(L,visit);
ClearList_CL(L);
DestroyList_CL(L);
getchar();
getchar();
return 0;
}