数据结构--循环单链表

来源:互联网 发布:餐厅预订软件 编辑:程序博客网 时间:2024/05/17 02:00

循环链表的存储结构和单链表是相同的。不同的地方是循环单链表的最后一个指针指向了头结点,不是单链表的“NULL”,这样有表尾很容易找到表头,但是由表头到表尾如果链表很长,则会很费时。因而,循环单链表设置尾指针而不是头指针。

存储结构

typedef struct LNode{  int data;  struct LNode *next;}LNode,*LinkList;
基本操作如下:
//初始化单链表void InitList(LinkList &L){  L=(LinkList)malloc(sizeof(LNode));  if(!L)  {    printf("空间分配失败!");    exit(0);  }  L->next=L;}//销毁链表void DestroyList(LinkList &L){  LinkList p=L->next;  while (p!=L)  {    q=p->next;    free(p);    p=q;  }  free(L);  L=NULL;}//判断单链表是否为空bool ListEmpty(LinkList L){  if (L->next==L) return true;  else return false;}//求单链表的长度int LengthList(LinkList L){  int len=0;  LinkList p=L->next->next;  while (p!=L->next)  {    ++len;    p=p->next;  }  return len;}//清空整个链表void ClearList_CL(LinkList &L)//改变了L要使用引用{  L=L->next;  LinkList q,p=L->next;  while (p!=L)  {    q=p->next;    free(p);    p=q;  }  L->next=L;}//查找位置为i的元素的值void GetElem_CL(LinkList L,int i,int &e){  int j=1;  LinkList p=L->next->next;  if(i<0||i>LengthList(L)) return;  while(j<i)  {    ++j;    p=p->next;  }  e=p->data;}//查找当前元素相等的上一个元素void Prior_Elem(LinkList L,int cur_elem,int &pre_elem){  LinkList p=L->next->next,q;  q=p->next;  while (p!=L->next)  {    if(q->data==cur_elem)    {      pre_elem=p->data;      return;    }    p=q;    q=q->next;  }}//查找当前元素的下一个元素void Next_Elem(LinkList L,int cur_elem,int &next_elem){  LinkList p=L->next->next;  while (p->next!=L->next)  {    if(cur_elem==p->data)    {      next_elem=p->next->data;      return;    }    p=p->next;  }}//寻找和e相等元素的位置int LocateElem_CL(LinkList L,int e){  LinkList p=L->next->next;  int pos=0;  while (p!=L->next)  {    ++pos;    if(e==p->data) return pos;    p=p->next;  }  return 0;}//插入单链表void ListInsert_CL(LinkList &L,int i,int e)//改变L{  int j=0;//计数器  LinkList p=L->next,s;  while (j<i-1)  {    ++j;    p=p->next;  }  s=(LinkList)malloc(sizeof(LNode));  s->data=e;  s->next=p->next;  p->next=s;  if(p==L) L=s;}//删除单链表中的元素void ListDelete_CL(LinkList &L,int i,int &e)//改变L{  int j=0;//计数器  LinkList q,p=L->next;  while (j<i-1)  {    ++j;    p=p->next;  }  if(p->next==L->next) return;  q=p->next;  p->next=q->next;  e=q->data;  if(L==q) L=p;  free(q);}

原创粉丝点击