循环链表(C语言版)

/*循环链表的存储结构*/

#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct DNode
{
    ElemType data;
    struct DNode *prior;
    struct DNode *next;
}dnode;
typedef struct DNode *DoubleLink;

DoubleLinkList.h

#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct DNode
{
    ElemType data;
    struct DNode *prior;
    struct DNode *next;
}dnode;
typedef struct DNode *DoubleLink;

Status InitLink(DoubleLink *DL);/*双向链表初始化*/
Status CreatLink(DoubleLink *DL, int n);/*创建双向链表*/
Status InsertLink(DoubleLink *DL, int i, ElemType e);/*双向链表的插入*/
Status DeleteLink(DoubleLink *DL, int i, ElemType *e);/*双向链表的删除*/
int LenLink(DoubleLink dl);/*双向链表的长度*/
void PrintList(DoubleLink dl);/*打印双向链表*/

DoubleLinkList.c

Status InitLink(DoubleLink *DL)
{
    *DL = (DoubleLink)malloc(sizeof(dnode));
    if(!(*DL))
    {
        return ERROR;
    }
    
    (*DL)->next = (*DL);
    (*DL)->prior = (*DL);
    
    return OK;
}

Status CreatLink(DoubleLink *DL, int n)
{
    int i;
    DoubleLink r, p;
    InitLink(DL);
    
    r = *DL;
    for(i=0; i<n; i++)
    {
        p = (DoubleLink)malloc(sizeof(dnode));
        if(!p)
        {
            return ERROR;
        }
        p->data = i+1;
        
        r->next = p;
        p->prior = r;
        r = p;
    }
    
    r->next = NULL;
    
    return OK;
}

Status InsertLink(DoubleLink *DL, int i, ElemType e)
{
    int j = 0;
    DoubleLink r, p;
    r = (*DL);
    if(i<1 || i>LenLink(*DL)+1)
    {
        return ERROR;
    }
    else if(i<LenLink(*DL)+1)
    {
        for(j=1; j<i; j++)
        {
            r = r->next;
        }
        
        p = (DoubleLink)malloc(sizeof(dnode));
        if(!p)
        {
            return ERROR;
        }
        p->data = e;
        
        /*
        p->prior = r;
        p->next = r->next;
        r->next->prior = p;
        r->next = p;
        */
        
        p->next = r->next;
        r->next->prior = p;
        r->next = p;
        p->prior = r;
    }
    else if(i==LenLink(*DL)+1)
    {
        for(j=1; j<i; j++)
        {
            r = r->next;
        }
        
        p = (DoubleLink)malloc(sizeof(dnode));
        if(!p)
        {
            return ERROR;
        }
        p->data = e;
        
        r->next = p;
        p->prior = r;
        p->next = NULL;
    }
    else;
    return OK;
    
}

Status DeleteLink(DoubleLink *DL, int i, ElemType *e)
{
    int j = 0;
    DoubleLink r = *DL;
    
    if(i<1 || i>LenLink(*DL))
    {
        return ERROR;
    }
    else if(i<LenLink(*DL))
    {
        for(j=0; j<i; j++)
        {
            r = r->next;
        }
        
        *e = r->data;
        r->prior->next = r->next;
        r->next->prior = r->prior;
        
        free(r);
    }
    else if(i==LenLink(*DL))
    {
        for(j=0; j<i; j++)
        {
            r = r->next;
        }
        *e = r->data;
        r->prior->next = NULL;
        free(r);
    }
    else;
    
    return OK;
}

int LenLink(DoubleLink dl)
{
    int len = 0;
    while(dl->next != NULL)
    {
        dl = dl->next;
        len++;
    }
    return len;
}

void PrintList(DoubleLink dl)
{
    while(dl->next != NULL)
    {
        dl = dl->next;
        printf("%d ", dl->data);
    }
    
    printf("\n");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值