4.17课程作业-吴佳旎

本文详细介绍了如何在C语言中创建双向链表,包括头插、头删、尾插、尾删以及按位置插入和删除节点的方法,展示了链表结构的基础操作实现。
摘要由CSDN通过智能技术生成

创建双向链表

#include "double_list.h"
node_p create_double()
{
    node_p H=(node_p)malloc(sizeof(node))//申请头结点空间
    if(H==NULL)
    {
        printf("空间申请失败\n");  
        return NULL;  
    }
    H->data=0;//刚创建链表时,链表中没有结点
    H->next=H;//双向循环链表,下一个结点指向上一个结点,链表为空时,头结点也是下一个结点
    return H;
}

创建结点

node_p create_node(int data)
{
    node_p H=(node_p)malloc(sizeof(node))//申请头结点空间
    if(new==NULL)
    {
        printf("空间申请失败\n");  
        return NULL;  
    }
    new->data=data;//链表中暂无数据
    return new;
}

判空

int empty_double(node_p H)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return -1;    
    }
    return H->next==H?1:0;
}

头插

void insert_head(node_p H,int data)
{
    if(H==NULL)
    {
     printf("入参为空\n");
     return;
    }
    new->data=H->next;//新结点的指针域指向原来头结点指向的结点
    if(H->next!=NULL);//如果头结点后面没有结点的情况
    {
        p=H->next;//原来头结点指向的节点定义一个新的首地址    
    }
    p->pri=new;//原来头结点指向的结点往前指向新结点xin
    new->pri=H;//新结点往前指向头结点
    H->next=new;//原来头结点指向的结点更换成新结点
    H->next++;//将头结点存储的链表长度自增
}

头删

void dele_head(node_p H)
{
    if(H==NULL)
    {
     printf("入参为空\n");
     return;
    }
    if(empty_double(H))
    {
        printf("表为空\n");
        return;    
    }
 node_p del=H->next;//保存要删除的结点
 H->next=H->next->next;//让头结点指向第二个结点
 H->next->next->pri=H//让第二个结点往前指向头结点
 free(del);//释放掉要删除的结点
 H->data--;
}

尾插

void insert_tail(node_p H,int data)
{
    if(H==NULL)
    {
     printf("入参为空\n");
     return;
    }
 node_p p=H;//找到尾结点
 while(p->next!=NULL)
 {
     p=p->next; //让p指向下一个结点
 }
 node_p new=create_node(data);//申请新的结点
 new->next=NULL;//新结点的下一个结点是空
 new=p->next;//新结点替换原来尾结点的下一个节点
 new->pri=p;//新结点指向原来的尾结点
 H->data++;
}

尾删

void dele_tail(node_p H)
{
    if(H==NULL)
    {
     printf("入参为空\n");
     return;
    }
 if(empty_double(H))
 {
     printf("表为空\n");
     return; 
 }
 //找到倒数第二个结点
 node_p p=H;
 while(p->next->next!=NULL)
 {
     p=p->next; 
 }
 //保留要删除的结点
 node_p del=p->next;
 //将倒数第二个节点的指针域指向空
 p->next=p->next->next;
 ferr(del);
 H->data--;
}

按位置插入

void insert_pos(node_p H,int data,int pos)
{
    if(H==NULL)
    {
     printf("入参为空\n");
     return;
    }
 //判断位置的不合理
 if(pos<=0||pos>H->data+1)
 {
     printf("位置不合理\n");
     return;
 }
 //找到pos-1的位置的结点
 node_p p=H;//记录找到的结点
 for(int i=0;i<pos-1;i++)
 {
     p=p->next; 
 }
 //创建一个新结点
 node——p new =create_node(data);
 new->next=p->next;
 p->next->pri=new;
 new->pri=p
 p->next=new;
 H->data++;
}

按位置删除

void dele_pos(node_p H,int pos)
{
    if(H==NULL)
    {
     printf("入参为空\n");
     return;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yoyozi_wu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值