循环双链表的代码实现

        循环双链表,是一种链式存储结构的线性表,它具有两个指针域(一前一后分别是指向当前结点的直接前驱和直接后继),一个数据域。它与普通的双链表不同的是,头结点的直接前驱不再是NULL,而是该双链表的尾结点。而尾结点的直接后继也不再是BULL,而是该双链表的头结点。除了判断表是否为空、遍历表元素等操作的判断条件有所变化其余的操作(如插入,删除等等)和一般的双链表一样。

        以下就是循环双链表的代码实现:

        C语言(CircularDoubleLinkedList):

#ifndef CIRCULARDOUBLELINKEDLIST_H_INCLUDED
#define CIRCULARDOUBLELINKEDLIST_H_INCLUDED

typedef int ElemType;
typedef struct Node
{
    ElemType elem;
    struct Node *prior;
    struct Node *next;
}LNode,*LinkedList;
void InitList(LinkedList *L)
{
    (*L)=(LNode*)malloc(sizeof(LNode));
    (*L)->next=(*L);
    (*L)->prior=(*L);
}
void DestroyList(LinkedList *L)
{
    LNode *p=(*L),*clc;
    while(p->next!=(*L))
    {
        p=p->next;
    }
    while(p!=(*L))
    {
        clc=p;
        p=clc->prior;
        clc->prior->next=clc->next;
        clc->next->prior=clc->prior;
        free(clc);
        clc=NULL;
    }
    free(*L);
    (*L)=NULL;
}
void ClearList(LinkedList *L)
{
    LNode *p=(*L),*clc;
    while(p->next!=(*L))
    {
        p=p->next;
    }
    while(p!=(*L))
    {
        clc=p;
        p=clc->prior;
        clc->prior->next=clc->next;
        clc->next->prior=clc->prior;
        free(clc);
        clc=NULL;
    }
}
int ListEmpty(LinkedList *L)
{
    LNode *p=(*L);
    if(p->next==(*L))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int ListLength(LinkedList *L)
{
    LNode *p=(*L);
    int i=0;
    while(p->next!=(*L))
    {
        i++;
        p=p->next;
    }
    return i;
}
ElemType GetElem(LinkedList *L,int index)
{
    if(index<0||index>=ListLength(L))
    {
        return -1;
    }
    int i=0;
    LNode *p=(*L)->next;
    while(i<index)
    {
        i++;
        p=p->next;
    }
    return p->elem;
}
int LocateElem(LinkedList *L,ElemType elem)
{
    int i=0;
    LNode *p=(*L)->next;
    while(p!=(*L))
    {
        if(p->elem==elem)
        {
            return i;
        }
        i++;
        p=p->next;
    }
    return -1;
}
ElemType PriorElem(LinkedList *L,ElemType elem)
{
    LNode *p=(*L)->next;
    while(p!=(*L))
    {
        if(p->elem==elem)
        {
            if(LocateElem(L,elem)==0)
            {
                return p->prior->prior->elem;
            }
            return p->prior->elem;
        }
        p=p->next;
    }
    return -1;
}
ElemType NextElem(LinkedList *L,ElemType elem)
{
    LNode *p=(*L)->next;
    while(p!=(*L))
    {
        if(p->elem==elem)
        {
            if(LocateElem(L,elem)==ListLength(L)-1)
            {
                return p->next->next->elem;
            }
            return p->next->elem;
        }
        p=p->next;
    }
    return -1;
}
void addFirst(LinkedList *L,ElemType elem)
{
    LNode *s,*p=(*L);
    s=(LNode*)malloc(sizeof(LNode));
    s->elem=elem;
    s->next=p->next;
    s->next->prior=s;
    s->prior=p;
    p->next=s;
}
void addAfter(LinkedList *L,ElemType elem)
{
    LNode *p=(*L),*s;
    s=(LNode*)malloc(sizeof(LNode));
    s->elem=elem;
    while(p->next!=(*L))
    {
        p=p->next;
    }
    s->next=p->next;
    s->next->prior=s;
    s->prior=p;
    s->prior->next=s;
}
int ListInsert(LinkedList *L,int index,ElemType elem)
{
    if(index<0||index>ListLength(L))
    {
        return -1;
    }
    else
    {
        LNode *p=(*L),*s;
        s=(LNode*)malloc(sizeof(LNode));
        s->elem=elem;
        int i=0;
        while(i<index)
        {
            p=p->next;
            i++;
        }
        s->next=p->next;
        s->next->prior=s;
        s->prior=p;
        s->prior->next=s;
        return 1;
    }
}
int ListDelete(LinkedList *L,int index)
{
    if(index<0||index>=ListLength(L))
    {
        return -1;
    }
    else
    {
        int i=0;
        LNode *p=(*L)->next,*del;
        while(i<index)
        {
            p=p->next;
            i++;
        }
        del=p;
        del->prior->next=del->next;
        del->next->prior=del->prior;
        free(del);
        del=NULL;
        return 1;
    }
}
void TraverseList(LinkedList *L)
{
    LNode *p=(*L)->next;
    while(p!=(*L))
    {
        printf("%d\t",p->elem);
        p=p->next;
    }
    printf("\n");
}
void TraverseListByReverseOrder(LinkedList *L)
{
    LNode *p=(*L)->next;
    while(p->next!=(*L))
    {
        p=p->next;
    }
    while(p!=(*L))
    {
        printf("%d\t",p->elem);
        p=p->prior;
    }
    printf("\n");
}

#endif // CIRCULARDOUBLELINKEDLIST_H_INCLUDED



	

        Java语言:

package DataStructure.LinearList;
public class LinkedList1 {
    protected Object elem;
    protected LinkedList1 next;
    protected LinkedList1 prior;
    public LinkedList1(Object elem)
    {
        this.elem=elem;
    }
    public LinkedList1(){}
}
package DataStructure.LinearList;
public class CircularDoubleLinkedList {
    private LinkedList1 list;
    private LinkedList1 head;
    public void InitList()
    {
        list=new LinkedList1();
        this.head=list;
        head.next=list;
        head.prior=list;
        head.elem=null;
    }
    public Boolean DestoryList()
    {
        try
        {
            ClearList();
            head=null;
            return true;
        }
        catch (NullPointerException e)
        {
            System.out.println("This DoubleLinkedList has been destoried");
            return true;
        }
    }
    public Boolean ClearList()
    {
        LinkedList1 temp=head;
        while (temp.next!=head)
        {
            temp.elem=null;
            temp.prior=null;
            temp=temp.next;
        }
        temp.next=null;
        head.next=head;
        head.prior=head;
        return true;
    }
    public Boolean ListEmpty()
    {
        if (head.next!=head)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public int ListLength()
    {
        LinkedList1 temp=head;
        int i=0;
        while (temp.next!=head)//&&head.prior!=temp
        {
            i++;
            temp=temp.next;
        }
        return i;
    }
    public Object GetElem(int index)
    {
        if(index<0||index>=this.ListLength())
        {
            return -1;
        }
        else
        {
            LinkedList1 temp=head;
            int i=0;
            while (i<index)
            {
                i++;
                temp=temp.next;
            }
            return temp.elem;
        }
    }
    public int LocateElem(Object elem)
    {
        LinkedList1 temp=head;
        for(int i=0;i<this.ListLength();i++)
        {
            if (temp.elem.equals(elem))
            {
                return i;
            }
            else
            {
                temp=temp.next;
            }
        }
        return -1;
    }
    public Object PriorElem(Object elem)
    {
        LinkedList1 temp=head;
        for(int i=0;i<this.ListLength()-1;i++)
        {
            if(temp.next.elem.equals(elem))
            {
                return temp.elem;
            }
            else if (this.LocateElem(elem)==0)
            {
                return head.prior.prior.elem;
            }
            else
            {
                temp=temp.next;
            }
        }
        return -1;
    }
    public Object NextElem(Object elem)
    {
        LinkedList1 temp=head;
        for (int i = 0; i < this.ListLength(); i++)
        {
            if(temp.elem.equals(elem))
            {
                if (this.LocateElem(elem)==this.ListLength()-1)
                {
                    return temp.next.next.elem;
                }
                else
                {
                    return temp.next.elem;
                }
            }
            else
            {
                temp=temp.next;
            }
        }
        return -1;
    }
    public Boolean ListInsert(Object elem,int index)
    {
        if(index<0||index>this.ListLength())
        {
            return false;
        }
        LinkedList1 temp=head;
        LinkedList1 node=new LinkedList1(elem);
        if(index==0)
        {
            addFirst(elem);
        }
        if(index>0)
        {
            int i=1;
            while(i<index)
            {
                temp=temp.next;
                i++;
            }
            node.next=temp.next;
            temp.next.prior=node;
            temp.next=node;
            node.prior=temp;
        }
        return true;
    }
    public void addFirst(Object elem)
    {
        LinkedList1 node=new LinkedList1(elem);
        LinkedList1 temp=head;
        while (temp.next!=head)
        {
            temp=temp.next;
        }
        temp.next=node;
        node.next=head;
        node.prior=temp;
        head.prior=node;
        head=node;
    }
    public void addAfter(Object elem)
    {
        int i=0;
        LinkedList1 temp=head;
        if (this.ListLength()==0)
        {
            addFirst(elem);
        }
        else
        {
            while (i<this.ListLength()-1)
            {
                temp=temp.next;
                i++;
            }
            LinkedList1 node=new LinkedList1(elem);
            node.next=temp.next;
            temp.next.prior=node;
            temp.next=node;
            node.prior=temp;
        }
    }
    public Boolean DeleteElem(int index)
    {
        if(index<0||index>this.ListLength()-1)
        {
            return false;
        }
        if(index==0)
        {
            LinkedList1 pre=head.next;
            LinkedList1 temp=head;
            LinkedList1 node=head;
            while (node.next!=head)
            {
                node=node.next;
            }
            node.next=pre;
            pre.prior=node;
            head=pre;
            temp.next=null;
            temp.prior=null;
            return true;
        }
        else
        {
            LinkedList1 temp=head;
            for (int i = 0; i < index-1; i++) {
                temp=temp.next;
            }
            LinkedList1 delete=temp.next;
            temp.next=delete.next;
            delete.next.prior=temp;
            delete.next=null;//可有可无
            delete.prior=null;//可有可无
            return true;
        }
    }
    public void TraverseList()
    {
        LinkedList1 temp=head;
        while(temp.next!=head)
        {
            System.out.print(temp.elem+"\t");
            temp=temp.next;
        }
        System.out.println("");
    }
    public void TraverseListByReverseOrder()
    {
        int i=0;
        LinkedList1 temp=head;
        while (i<this.ListLength()-1)//
        {
            temp=temp.next;
            i++;
        }
        while (temp!=head.prior)head
        {
            System.out.print(temp.elem+"\t");
            temp=temp.prior;
        }
        System.out.println("");
    }
}

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荧光百叶草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值