数据结构D4作业

1.实现单向循环链表的功能

loop.c

#include "loop.h"
loop_p create_loop()
{
    loop_p H=(loop_p)malloc(sizeof(loop));
    if(H==NULL)
    {
        printf("创建失败\n");
        return NULL;
    }
    H->len=0;
    H->next=H;  
    return H;        
}

loop_p create_node(datatype data)
{
    loop_p new=(loop_p)malloc(sizeof(loop));
    if(new==NULL)
    {
        printf("空间申请失败\n");
        return NULL;
    }
    new->data=data;
    return new;
}

void insert_head(loop_p H,datatype data)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return;
    }
    loop_p new = create_node(data);
    new->next = H->next;
    H->next = new;
    H->len++;
}

void insert_pos(loop_p H,datatype data,int pos)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return;
    }
    loop_p p = H;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }
    loop_p new=create_node(data);
    new->next=p->next;
    p->next=new;
    H->len++;
}

void del_tail(loop_p H)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    loop_p temp = H;
    while(temp->next->next!=H)
    {
        temp=temp->next;
    }
    loop_p del=temp->next;
    temp->next=temp->next->next;
    free(del);
    H->len--;
}

void del_pos(loop_p H,int pos)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(pos<=0||pos>H->len)
    {
        printf("位置不合理\n");
        return;
    }
    loop_p temp=H;
    for(int i=0;i<pos-1;i++)
    {
        temp=temp->next;
    }
    loop_p del=temp->next;
    temp->next=temp->next->next;
    free(del);
    H->len--;
}

void out_put_loop(loop_p H)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    loop_p p = H->next;
    while(p!=H)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
    putchar(10);
}

main.c


#include "loop.h"
int main()
{
    loop_p H=create_loop();
    insert_head(H,4);
    insert_head(H,3);
    insert_head(H,2);
    insert_head(H,1);
    del_tail(H);
    del_pos(H,2);
    out_put_loop(H);
    return 0;
}

2.思维导图

见上一次作业

3.重写一遍链表逆置函数

void ovtu_link(link_p H)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(link_empty(H))
    {
        printf("链表为空\n");
        return;
    }
    if(H->next->next==NULL)
    {
        printf("表中只有一个元素,无需翻转\n");
        return;
    }
    link_p p = H->next->next;
    H->next->next = NULL;
    link_p q = p->next;
    while(p!=NULL)
    {
        p->next=H->next;
        H->next=p;    
        p=q;
        if(q!=NULL)
        {
            q=q->next;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值