循环链表

“a.h”

#include
#include
#define TRUE 1;
#define FALSE 0;
#define ERROR 0;
#define OK 1;

typedef int Status;
typedef int ElemType;

typedef struct DuLNode{
    ElemType  data;
    struct DuLNode  *prior ,*next;
}DuLNode , *DuLinkList;

 

"b.h"

#include"a.h"
Status InitList(DuLinkList *L);

Status DestroyList(DuLinkList *L);

Status ClearList(DuLinkList L);

Status ListEmpty(DuLinkList L);

Status ListLength(DuLinkList L);

Status GetElem(DuLinkList L,int i,ElemType *e);

int  LocateElem(DuLinkList L,ElemType e,Status(*compare)(ElemType,ElemType));

Status PriorElem(DuLinkList L,ElemType cur_e,ElemType *pre_e);

Status NextElem(DuLinkList L,ElemType cur_e,ElemType *next_e);

DuLinkList GetElemP(DuLinkList L,int i);

Status ListInsert(DuLinkList L,int i,ElemType e);

Status ListTraverse(DuLinkList L,void(*fun)(ElemType e));

Status ListDelete(DuLinkList L,int i,ElemType *e);

Status ListTraverseBack(DuLinkList L,void(*fun)(ElemType e));

 

 

"b.c"


#include "b.h"

Status InitList(DuLinkList *L)
{
    *L=(DuLinkList)malloc(sizeof(DuLNode));
 if(*L){
    (*L)->prior=(*L)->next=(*L);
    return OK;
 }
 else
  return ERROR;
}

Status DestroyList(DuLinkList *L)
{
 DuLinkList q;
    DuLinkList p=(*L)->next;
 while(p!=(*L)){
     q=p->next;
  free(p);
  p=q;
 }
 free(*L);
 (*L)=NULL;
 return OK;
}

Status ClearList(DuLinkList L)
{
 DuLinkList q;
    DuLinkList p=L->next;
 while(p!=L){
     q=p->next;
  free(p);
  p=q;
 }
 L->next=L->prior=L;
 return OK;
}

Status ListEmpty(DuLinkList L)
{
    if(L->next==L&&L->prior==L)
  return TRUE;
 
  return FALSE;
}

Status ListLength(DuLinkList L)
{
   int i=0;
   DuLinkList p=L->next;
   while(p!=L){
      p=p->next;
   i++;
   }
   return i;
}

Status GetElem(DuLinkList L,int i,ElemType *e)
{

    DuLinkList p=L->next;
 if(i>ListLength(L))
  return ERROR;
 while(--i&&p!=L) 
   p=p->next;
    *e=p->data;
 return OK;
}

int  LocateElem(DuLinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
       int i=1; 
       DuLinkList p=L->next;
    while(!compare(p->data,e)&&p!=L){
        p=p->next;
     i++;
    }
       return i;
}

Status PriorElem(DuLinkList L,ElemType cur_e,ElemType *pre_e)
{
      DuLinkList p=L->next;
   while(p!=L){
    if(p->data==cur_e){
   *pre_e=p->prior->data;
            return OK;
   
    p=p->next;
   }
    return ERROR;
}

Status NextElem(DuLinkList L,ElemType cur_e,ElemType *next_e)
{
     DuLinkList p=L->next;
   while(p!=L){
    if(p->data==cur_e){
   *next_e=p->next->data;
            return OK;
    }
    p=p->next;
   }
      return ERROR;
}

DuLinkList GetElemP(DuLinkList L,int i)
{
     DuLinkList p=L;
  while(i){
    i--;
    p=p->next;
  }
  return p;
}

Status ListInsert(DuLinkList L,int i,ElemType e)
{
    DuLinkList p ;
 DuLinkList q;
 if(i<1&&i>ListLength(L)+1)
   return ERROR;
     p=GetElemP(L,i-1);
     q=(DuLinkList)malloc(sizeof(DuLNode));
  q->data=e;
  q->next=p->next;
  p->next->prior=q;
  p->next=q;
  q->prior=p;
  return OK;

}

Status ListTraverse(DuLinkList L,void(*fun)(ElemType e))
{
     DuLinkList p=L->next;
  while(p!=L){
     fun(p->data);
  p=p->next;
  }
  return OK;
}

Status ListDelete(DuLinkList L,int i,ElemType *e)
{
    DuLinkList p,q; 
 if(i<1&&i>ListLength(L))
  return ERROR;
 p=L;
 while(--i)
    p=p->next;
 q=p->next;
 *e=q->data;
 p->next=q->next;
 q->next->prior=p;
 free(q);
 return OK;
}

Status ListTraverseBack(DuLinkList L,void(*fun)(ElemType e))
{
     DuLinkList p=L->prior;
  while(p!=L){
     fun(p->data);
  p=p->prior;
  }
  return OK;
}

 

"main.c"


#include "b.h"


Status compare(ElemType e,ElemType f)
{
   if(e==f)
    return TRUE;
 
    return FALSE;
}
void fun(ElemType e)
{
      printf(" %d ",e);
}

int main()
{
    DuLinkList p;
    ElemType e;
    int i=0;
       DuLinkList L;
       InitList(&L);
    for(i;i<10;i++)
    ListInsert(L,1,i);
    ListTraverse(L,fun);
    printf("\n");

    if(ListEmpty(L))
     printf("表为空\n");
    else
     printf("表不为空\n");

    printf("表的长度为 %d\n",ListLength(L));

    GetElem(L,3,&e);
    printf("第三个元素为 %d\n",e);

       printf("满足compare的与5的关系的元素是第 %d 个\n",LocateElem(L,5,compare));

    PriorElem(L,7,&e);
    printf("7之前的一个元素是  %d\n",e);

    NextElem(L,7,&e);
    printf("7之后的一个元素是 %d\n", e);

       p=GetElemP(L,4);
    printf("第4个元素为 %d\n", p->data);

        ListDelete(L,3,&e);
  printf("被删除的第3个元素是  %d\n",e);
  ListTraverse(L,fun);
  printf("\n");
  ListTraverseBack(L,fun);
        printf("\n");
    
        ClearList(L);
   printf("表的长度为 %d\n",ListLength(L));
   if(ListEmpty(L))
     printf("表为空\n");
    else
     printf("表不为空\n");
  ListTraverse(L,fun);

       return OK;
}

 

 

循环链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值