单链表有很多结构循环单链表,有头节点的单链表,无头节点的单链表,双节点单链表,以下源码是以有一个头节点的单链表为例写的增删改查的各种功能,就是下图

然后各个注释也在函数后面写着,这玩意确实还挺难,源码均已测试,vs2019运行妥妥的

废话不多说直接来看全部源码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef int ElemType;          //后期修改程序方便
typedef struct ListNode               //定义结构体
{ElemType data;struct ListNode* next;
}ListNode;typedef struct                //头节点
{struct ListNode* head;int cursize;
}LinkList;struct ListNode* BuyNode()           //购买节点,用malloc向堆区申请空间
{struct ListNode* s = (struct ListNode*)malloc(sizeof(struct ListNode));if (NULL == s){exit(1);}memset(s, 0, sizeof(struct ListNode));return s;
};void FreeNode(struct ListNode* p)         //堆区申请完之后必须得free
{free(p);
}int GetSize(const LinkList* plist)        //获得cursize的大小
{assert(plist != NULL);return plist->cursize;
}bool IsEmpty(const LinkList* plist)       //判断cursize是否为空
{assert(plist != NULL);return GetSize(plist) == 0;
}void InitList(LinkList* plist)            //初始化函数,malloc购买节点之后用memset初始化为0
{assert(plist != NULL);plist->head = BuyNode();plist->cursize = 0;
}void Print(LinkList* plist)              //输出函数
{assert(plist != NULL);ListNode* p = plist->head->next;while (p != NULL){printf("%d ", p->data);p = p->next;}printf("\n");
}ListNode* FindeValue(LinkList* plist, ElemType val)         //找到当前值的地址
{assert(plist != NULL);ListNode* p = plist->head->next;while (plist != NULL && p->data != val){p = p->next;}return p;
}ListNode* FindeValue_Prev(LinkList* plist, ElemType val)        //查找输入val的前驱地址
{assert(plist != NULL);ListNode* pre = plist->head;ListNode* p = plist->head->next;while (p != NULL && p->data != val){pre = p;}if (p == NULL){pre = NULL;}return p;
}bool Insert_Next(LinkList* plist, ListNode* ptr, ElemType val)         //在ptr节点后面插入val值
{assert(plist != NULL);if (ptr == NULL){return false;}ListNode* s = BuyNode();s->next = ptr->next;ptr->next = s;s->data = val;plist->cursize += 1;return true;
}void Push_Front(LinkList* plist, ElemType val)         //头插法
{Insert_Next(plist, plist->head, val);}void Push_Back(LinkList* plist, ElemType val)        //尾插法
{assert(plist != NULL);ListNode* p = plist->head;while (p->next != NULL){p = p->next;}Insert_Next(plist, p, val);
}void InsertItem(LinkList* plist, ElemType x, ElemType val)      //在指定x的之后插入val值
{assert(plist != NULL);ListNode* p = FindeValue(plist, x);Insert_Next(plist, p, val);
}ListNode* FindPos(const LinkList* plist, ElemType pos)        //返回当前节点
{assert(plist != NULL);if (pos<1 || pos>plist->cursize){return NULL;}int i = 1;ListNode* p = plist->head->next;while (p!=NULL && i < pos){p = p->next;i++;}return p;
}ListNode* FindPos_Prev(const LinkList* plist, ElemType pos)      //返回前驱节点
{assert(plist != NULL);if (pos<1 || pos>plist->cursize + 1){return NULL;}ListNode* p = plist->head;int i = 1;while (i < pos){p = p->next;i++;}return p;
}bool Erase_Next(LinkList* plist, ListNode* ptr)       //删除ptr之后的节点
{assert(plist != NULL);if (NULL == ptr || NULL == ptr->next) return false;ListNode* q = ptr->next;ptr->next = q->next;FreeNode(q);plist->cursize -= 1;return true;
}void Pop_Front(LinkList* plist)          //头删法
{assert(plist != NULL);Erase_Next(plist, plist->head);
}void Pop_Back(LinkList* plist)           //尾删法
{assert(plist != NULL);ListNode* p = FindeValue_Prev(plist, plist->cursize);Erase_Next(plist, p);
}void MergerList(LinkList* palist, LinkList* pblist, LinkList* pclist)        //两个数组的有序合并
{assert(palist != NULL && pblist != NULL && pclist != NULL);ListNode* pa = palist->head->next;ListNode* pb = pblist->head->next;ListNode* pc = pclist->head;while (pa != NULL && pb != NULL){if (pa->data >= pb->data){pc->next = pb;pb = pb->next;}else{pc->next = pa;pa = pa->next;}pc = pc->next;}if (pa != NULL){pc->next = pa;}else{pc->next = pb;}pclist->cursize = palist->cursize + pblist->cursize;palist->head->next = NULL;pblist->head->next = NULL;
}int main()
{int ar[] = { 12,23,34,45,56,67,78,89,90,100 };int n = sizeof(ar) / sizeof(ar[0]);LinkList mylist;InitList(&mylist);for (int i = 0; i < n; i++){Push_Front(&mylist, ar[i]);Print(&mylist);}return 0;
}

其中函数的复用程度较高,值得仔细学习一下,初入编程的小白一个,欢迎大家来评论区交流学习。

​​​​​​​乾坤稳定,你我皆是黑马,加油!

带头节点单链表的增删改查相关推荐

  1. 通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现

    文章目录 节点类 链表类(主要) 测试类 小结 节点类 可以根据需要,对节点属性进行修改.注意重写toString()方法,以便后续的输出操作. //节点类 class Node {public in ...

  2. 单链表实现增删改查(含头结点)

    ** 单链表实现增删改查(含头结点) ** **## 单链表** package com.Linked;public class HeadLinked {public String name;// 链 ...

  3. C语言 单链表的增删改查

    单链表的增删改查 目录 单链表的增删改查 链表的创建和输出(有头结点) 链表的查找 链表的删除 链表的修改 链表是一种最常见地采用动态存储分配方式的数据结构,相较于数组而言它更加灵活. 单链表的特点 ...

  4. java单链表 提供增删改查_java实现单链表增删改查的实例代码详解

    package 数据结构算法.链表; /* *定义节点 * 链表由节点构成 */ public class node { private e e; //数据data private node next ...

  5. 单链表实现增删改查(进化版)

    主函数: 链表.cpp #include <bits/stdc++.h> #include "List.cpp" using namespace std; int ma ...

  6. C语言单链表实现增删改查

    1.概述 单链表使是一种链式存储结构,链表中的数据以结点的方式表示.每个结点由数据域和指针域两部分构成.数据域存储链表的数据元素,指针域存储连接相邻结点的地址. 2.单链表基本组成 typedef s ...

  7. 2020-12-13# **链表的增删改查,逆置**

    链表的增删改查,逆置,长度,排序,是否为空 1.``准备阶段## ## # include<stdio.h> # include<stdlib.h>typedef struct ...

  8. Django学习笔记(10)——Book单表的增删改查页面

    一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...

  9. 极其方便的使用Mybatis单表的增删改查

    [活动]Python创意编程活动开始啦!!!      CSDN日报20170427 --<如何在没有实际项目经验的情况下找到工作>      深入浅出,带你学习 Unity 目录(?)[ ...

最新文章

  1. linux查看告警日志,shell脚本,用于监视Linux中的消息日志(警告,错误和严重)...
  2. js网页文件资源加载器
  3. ubuntu server执行sudo出现no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory...
  4. linux内核arc4算法,linux内核中与进程相关的数据结构(基于linux-mainline-rc4)
  5. 初步解决leiningen配置到Eclipse中出错的问题
  6. PLSQL自动输入select * from|附件在cnblogs文件|
  7. SEO人员,不要见风是雨
  8. 03 vsftpd 登录过程的调试
  9. SAP ERP和ORACLE ERP的区别是哪些?
  10. 【探路者】10月13日立会报告(团队第1周-第1次)
  11. JavaScript 判断是否是数字 isFinite() Number.isFinite()
  12. pip install 安装的问题
  13. Arai2自动添加tracker链接的方法
  14. hadoop命令无法创建目录
  15. 在环仿真有两种,一种是软件在环仿真SITL,还有一种是硬件在环仿真HITL。
  16. 漏洞修复需要升级打补丁,打补丁准备工作
  17. mysql查询和某人一样_使用sql语句实现查询某人的排名,分数相同排名相同
  18. 考研上交823上岸东南蒙纳什心得
  19. ant design vue给table设置斑马条纹样式
  20. 使用小程序做交互的技巧(演讲内容实录)丨掘金开发者大会

热门文章

  1. Pipe Utilization管道利用率
  2. Yolov3Yolov4网络结构与源码分析
  3. 客快物流大数据项目(十七):自定义镜像mycentos
  4. [JavaScript] 探索JS中的函数秘密
  5. 查看Ubuntu 系统的版本
  6. ecplise 设置代码自动提示功能的设置
  7. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
  8. CentOS7部署ELK5.2
  9. 从头到尾彻底解析Hash表算法
  10. UVa 11174 - Stand in a Line