数据结构学习之单向链表(各种操作合集)

本文详细介绍了单向链表的创建(函数返回值创建、地址传参创建)、插入(头插法、尾插法、任意位置插入)、删除(头删法、尾删法、任意位置删除)、查找与修改,以及清空、销毁、翻转、排序和去重等操作,附带操作步骤和示例代码。
摘要由CSDN通过智能技术生成

单向链表(各种操作合集)

单向链表的两种创建方式

方式1:根据函数的返回值创建

  • 通过返回值返回所申请的头结点所在的内存空间首地址,即创建单向链表的头结点,代码如下:
  • 示例代码:
node_t *create_link_node_1(){
   

    node_t *phead = (node_t *)malloc(sizeof(node_t));
    if(NULL == phead){
   

        printf("内存分配失败\n");

        exit(-1);

    }
    //或者memset(phead, 0, sizeof(node_t));
    phead->data = -1;
    phead->next = NULL;

    return phead;

}
  • 注意事项:
  • 1.分配完头结点的内存地址空间后,一定要检查内存分配是否成功
  • 2.若头结点的内存分配失败,需要使用shell命令exit(-1)退出
  • 3.单向链表的每个结点都有数据域和指针域,而头结点的数据域可以不储存任何数据,头结点的数据域在此函数中,被赋值 -1
  • 4.头结点的指针域被赋值 NULL,表示此时的单向链表只有一个头结点

方式2:根据地址传参创建

  • 使用地址传参的方式创建单向链表的头结点,代码如下:
  • 示例代码:
int create_link_node_2(node_t **phead,int data){
   

    if(NULL == phead){
   


        printf("入参为NULL\n");

        return -1;

    }

    *phead = (node_t *)malloc(sizeof(node_t));

    if(NULL == *phead){
   


        printf("内存分配失败\n");

        return -1;

    }
     //或者memset(*phead, 0, sizeof(node_t));
    (*phead)->data = data;
    (*phead)->next = NULL;

    return 0;

}

注意事项:

  • 1.所传入的形参必须是二级指针变量,因为二级指针用来存储一级指针变量的地址,即所申请的单向链表头结点在内存空间的地址
  • 2.形参传入到创建单向链表头结点的功能函数后,一定要做入参合理性检查
  • 3.同方式1一样,分配完头结点的内存地址空间后,一定要检查内存分配是否成功
  • 4.头结点的数据域被赋值 -1
  • 5.头结点的指针域被赋值 NULL

单向链表的三种插入方式

方式1:头插法

  • 在单向链表的头结点和第0个结点之间插入新结点,即头插法,代码如下:
  • 示例代码:
int insert_link_list_1(node_t *phead,int data){
   

    if(NULL == phead){
   


        printf("入参为NULL\n");

        return -1;

    }

    //创建新结点

    node_t *pnew = NULL;
    
    create_link_node_2(&pnew,data);
    //头插到链表
    pnew->next = phead->next;

    phead->next = pnew;

    return 0;
}
  • 操作步骤:
  • 1.创建新结点pnew
  • 2.将第0个结点的地址指向新结点的指针域,即pnew->next = phead->next
  • 3.再将新结点的地址指向头结点的指针域,即phead->next = pnew

方式2:尾插法

  • 在单向链表的最后一个结点后面插入新结点,即尾插法,代码如下:
  • 示例代码:
int insert_link_list_2(node_t *phead,int data){
   

    if(NULL == phead){
   


        printf("入参为NULL\n");

        return -1;

    }

    //创建新结点

    node_t *pnew = NULL;
    
    create_link_node_2(&pnew,data);

    //遍历链表,找到最后一个结点

    node_t *ptemp = phead;

    while(NULL != ptemp->next){
   


        ptemp = ptemp->next;

    }

    ptemp->next = pnew;

    return 0;
}
  • 操作步骤:
  • 1.创建新结点pnew
  • 2.遍历链表,找到链表的最后一个结点ptemp
  • 3.将新结点的地址指向最后一个结点的指针域,即 ptemp->next = pnew

方式3:任意位置插入新节点

  • 在单向链表的任意一个位置,插入新结点,代码如下:
  • 示例代码:
int insert_link_list_3(node_t *phead,int pos,int data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值