7.29.

思维导图

函数代码

#include"head.h"
//创建头结点
DOUlinkPtr create()
{
    DOUlinkPtr H = (DOUlinkPtr)malloc(sizeof(DOUlink));
    if(NULL==H)
    {
        printf("创建失败\n");
        return NULL;
    }
    H->len=0;
    H->prior=NULL;
    H->next=NULL;
    return H;
}
//判空
int empty(DOUlinkPtr H)
{
    if(NULL==H)
    {
        printf("判空失败!");
        return -1;
    }
    return H->len==0;
}
//申请节点,封装数据
DOUlinkPtr create_node(DataType e)
{
    DOUlinkPtr p=(DOUlinkPtr)malloc(sizeof(DOUlink));
    if(NULL==p)
    {
        printf("申请失败\n");
        return NULL;
    }
    p->data=e;
    p->next=NULL;
    p->prior=NULL;
    return p;
}
//头插
int head_add(DOUlinkPtr H,DataType e)
{
    if(NULL==H)
    {
        printf("插入失败\n");
        return 0;
    }
    DOUlinkPtr p=create_node(e);
    if(H->next != NULL)
    {
        p->next=H->next;
        p->prior=H;
        H->next=p;
        H->len++;
    }
    else
    {
        p->prior=H;
        H->next=p;
        H->len++;
    }
    return 1;
}
//遍历
void show(DOUlinkPtr H)
{
    if(NULL==H || empty(H))
    {
        printf("遍历失败\n");
        return;
    }
    DOUlinkPtr q=H;
    while(NULL!=q->next)
    {
        q=q->next;
        printf("%d\t",q->data);
    }
    putchar(10);
    //printf("%d\n",H->len);
}
//任意位置插入
int loc_add(DOUlinkPtr H,int loc,DataType e)
{
    //判断链表是否合法,插入位置是否合理
    if(NULL==H || loc<1 || loc>H->len+1)
    {
        printf("插入失败!\n");
        return -1;
    }
    //插入的节点
    DOUlinkPtr P=create_node(e);
    
    //插入位置前一个节点
    DOUlinkPtr h=H;
    
    //找到插入位置前的位置
    for(int i=0;i<loc-1;i++)
    {
        h=h->next;    
    }
    //判断插入位置是否为链表为或空链表
    if(h->next==NULL)
    {
        h->next=P;
        P->prior=h;
        H->len++;
    }
    //在给定位置插入
    else
    {    
        h->next->prior=P;
        P->next=h->next;
        h->next=P;
        P->prior=h;
        H->len++;
    }
    return 1;
}
//任意位置删除
int loc_del(DOUlinkPtr H,int loc)
{
    if(NULL==H || empty(H) || loc<1 || loc>H->len)
    {
        printf("删除失败\n");
        return -1;
    }

    //给定位置前一个节点
    DOUlinkPtr t=H;
    //定位
    for(int i=0;i<loc;i++)
    {
        t=t->next;
    }
    //
    if(t->next==NULL)
    {
        t->prior->next=NULL;
    }
    else
    {
        t->prior->next=t->next;
        t->next->prior=t->prior;
    }
    free(t);
    H->len--;    
    //free(t);
    t=NULL;
    
}
//销毁

void My_free(DOUlinkPtr H)
{
    if(NULL==H)
    {
        printf("销毁失败\n");
        return;
    }
    while(H->next!=NULL)
    {
        DOUlinkPtr q=H;
           for(int i=0;i<H->len-1;i++)
        {
            q=q->next;
        }
        DOUlinkPtr p=q->next;
        q->next=p->next;
        free(p);
         p=NULL;
         H->len--;
     }
    free(H);
    H=NULL;
    printf("销毁成功!\n");

}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值