数据结构之线性表6循环链表


循环链表


循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。


 


单向循环链表


存储结构和单链表相同。


 


/* 设立尾指针的单循环链表的12个基本操作 */


void InitList(LinkList *L)


{ /* 操作结果:构造一个空的线性表L */


 *L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */


 if(!*L) /* 存储分配失败 */


   exit(OVERFLOW);


 (*L)->next=*L; /* 指针域指向头结点 */


}


void DestroyList(LinkList *L)


{ /* 操作结果:销毁线性表L */


 LinkList q,p=(*L)->next; /* p指向头结点 */


 while(p!=*L) /* 没到表尾 */


  {


   q=p->next;


   free(p);


   p=q;


  }


 free(*L);


 *L=NULL;


}


void ClearList(LinkList *L) /* 改变L */


{ /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */


 LinkList p,q;


 *L=(*L)->next; /* L指向头结点 */


 p=(*L)->next; /* p指向第一个结点 */


 while(p!=*L) /* 没到表尾 */


  {


   q=p->next;


   free(p);


   p=q;


  }


 (*L)->next=*L; /* 头结点指针域指向自身 */


}


Status ListEmpty(LinkList L)


{ /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */


 if(L->next==L) /* */


   return TRUE;


 else


   return FALSE;


}


int ListLength(LinkList L)


{ /* 初始条件:L已存在。操作结果:返回L中数据元素个数 */


  inti=0;


 LinkList p=L->next; /* p指向头结点 */


 while(p!=L) /* 没到表尾 */


  {


   i++;


   p=p->next;


  }


 return i;


}


Status GetElem(LinkList L,int i,ElemType*e)


{ /* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */


  intj=1; /* 初始化,j为计数器 */


 LinkList p=L->next->next; /* p指向第一个结点 */


 if(i<=0||i>ListLength(L)) /* i个元素不存在 */


   return ERROR;


 while(j< i)


  {/* 顺指针向后查找,直到p指向第i个元素 */


   p=p->next;


   j++;


  }


 *e=p->data; /* 取第i个元素 */


 return OK;


}


int LocateElem(LinkList L,ElemTypee,Status(*compare)(ElemType,ElemType))


{ /* 初始条件:线性表L已存在,compare()是数据元素判定函数 */


  /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。*/


 /*           若这样的数据元素不存在,则返回值为0 */


  inti=0;


 LinkList p=L->next->next; /* p指向第一个结点 */


 while(p!=L->next)


  {


   i++;


   if(compare(p->data,e)) /* 满足关系 */


     return i;


    p=p->next;


  }


 return 0;


}


Status PriorElem(LinkList L,ElemTypecur_e,ElemType *pre_e)


{ /* 初始条件:线性表L已存在 */


  /* 操作结果:若cur_eL的数据元素,且不是第一个,则用pre_e返回它的前驱,*/


 /*           否则操作失败,pre_e无定义 */


 LinkList q,p=L->next->next; /* p指向第一个结点 */


 q=p->next;


 while(q!=L->next) /* p没到表尾 */


  {


   if(q->data==cur_e)


    {


     *pre_e=p->data;


     return TRUE;


    }


   p=q;


   q=q->next;


  }


 return FALSE; /* 操作失败 */


}


Status NextElem(LinkList L,ElemTypecur_e,ElemType *next_e)


{ /* 初始条件:线性表L已存在 */


  /* 操作结果:若cur_eL的数据元素,且不是最后一个,则用next_e返回它的后继,*/


 /*           否则操作失败,next_e无定义 */


 LinkList p=L->next->next; /* p指向第一个结点 */


 while(p!=L) /* p没到表尾 */


  {


   if(p->data==cur_e)


    {


     *next_e=p->next->data;


     return TRUE;


    }


   p=p->next;


  }


 return FALSE; /* 操作失败 */


}


Status ListInsert(LinkList *L,inti,ElemType e) /* 改变L */


{ /* L的第i个位置之前插入元素e */


 LinkList p=(*L)->next,s; /* p指向头结点 */


  intj=0;


 if(i<=0||i>ListLength(*L)+1) /* 无法在第i个元素之前插入 */


   return ERROR;


 while(j< i-1) /* 寻找第i-1个结点 */


  {


   p=p->next;


   j++;


  }


 s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */


 s->data=e; /* 插入L */


 s->next=p->next;


 p->next=s;


 if(p==*L) /* 改变尾结点 */


   *L=s;


 return OK;


}


Status ListDelete(LinkList *L,inti,ElemType *e) /* 改变L */


{ /* 删除L的第i个元素,并由e返回其值 */


 LinkList p=(*L)->next,q; /* p指向头结点 */


  intj=0;


 if(i<=0||i>ListLength(*L)) /* i个元素不存在 */


   return ERROR;


 while(j< i-1) /* 寻找第i-1个结点 */


  {


   p=p->next;


   j++;


  }


 q=p->next; /* q指向待删除结点 */


 p->next=q->next;


 *e=q->data;


 if(*L==q) /* 删除的是表尾元素 */


   *L=p;


 free(q); /* 释放待删除结点 */


 return OK;


}


void ListTraverse(LinkListL,void(*vi)(ElemType))


{ /* 初始条件:L已存在。操作结果:依次对L的每个数据元素调用函数vi()*/


 LinkList p=L->next->next; /* p指向首元结点 */


 while(p!=L->next) /* p不指向头结点 */


  {


   vi(p->data);


   p=p->next;


  }


 printf("\n");



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值