数据结构基础练习(2023-2-6)

1,实现双向链表按元素删除

void DeleteSearch(LoopDoubleLink L,datatype e)
{
    if(L->len==0)
    {
        printf("数据不存在\n");
        return;
    }
    LoopDoubleLink q=L;
    while(q->next)
    {    
        LoopDoubleLink p=q->prev;
        if(q->data==e)
        {
            q->next->prev=p;
            p->next=q->next;
            break;
        }
        q=q->next;
    }
    free(q);
    q=NULL;
    L->len--;
}

2,实现循环双向链表按位置插入

void InsertPos(LoopDoubleLink L,datatype e,int pos)
{
    if(L==NULL||pos>L->len||pos>0)
    {
        printf("插入失败\n");
        return;
    }
    LoopDoubleLink q=L;
    for(int i=0;i<pos-1;i++)
    {
        q=q->next;
    }
    LoopDoubleLink p=LinkCreateNode();
    p->data=e;
    p->next=q->next;
    p->prev=q;
    q->next->prev=p;
    q->next=p;
    L->len++;
}

3,实现约瑟夫环

void josephe(LoopDoubleLink L,int m,int n)
{
    LoopDoubleLink q=L;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n-1;j++)
        {
            q=q->next;
            if(q==L)
                j--;
        }
        LoopDoubleLink p=q->next;
        if(p==L)
        {
            p=p->next;
        }
        printf("%.2f ",p->data);
        q->next=p->next;
        free(p);
        p=NULL;
    }
}

4,删除链表中的所有结点

void DeleteFree(LoopDoubleLink L)
{
    if(L->len==0)
    {
        printf("数据不存在\n");
        return;
    }
    LoopDoubleLink q=L;
    while(q->next!=L)
    {
        LoopDoubleLink p=q;
        free(p);
        p=NULL;
        q=q->next;
    }
}

5,实现单向链表的简单选择排序

mian.c

    //===单向简单排序===
    LinkSimple(L);
    LoopListShow(L);

head.c

//简单排序
void LinkSimple(LoopLink L)
{
    //1.判断链表是否存在
    if(L==NULL)
    {
        printf("链表不存在\n");
        return;
    }
    //2.开辟一个新的空间
    LoopLink S=LinkCreateHeadNode();
    if(S==NULL)
    {
        printf("创建失败\n");
        return;
    }
    //3.将L的值传入排序中,并将每次返回的值加入到头指针
    while(L->next)
    {
        int min=MinChoice(L);
        LoopLink p=LinkCreateNode();
        //数据域
        p->data=min;
        //指针域
        p->next=s->next;
        S->next=p;
    }
    LoopListShow(S);
}
int MinChoice(LoopLink L)
{
    LoopLink p=L;
    int min=L->next->data;
    while(p->next)
    {
        if(p->data<min)
        {
            min=p->data;
        }
    }
    DeleteLink(L,min);
}
void DeleteLink(LoopLink L,datatype e)
{
    if(L->len==0)
        return;
    LoopLink p=L;
    for(int i=0;i<L->len;i++)
    {
        p=p->next;
        if(p->data==e)
        {
            DeleteBypos(L,i);
        }
    }

}
int DeleteBypos(Linklist L,int pos)
{
    //判断链表是否为空
    //判断下标是否越界
    if(L==NULL||pos<1||pos>len)
    {
        printf("删除失败\n");
        return -1;
    }
    Linklist p=L;
    //用循环找到插入位置的前驱
    //将数据删除
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;//p向后移动  
    }
    Linklist q=p->next;//将要删除的下标位
    p->next=q->next;
    free(q);
    q=NULL;
    L->len--;    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值