1.概述

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

2.单链表基本组成

typedef struct linklist_t{int data;                   // 数据域.struct linklist_t *next;    // 指针域.
}LinkList_T;
static LinkList_T *pHead;       // 头指针.

上述代码中我们定义了 pHead 头指针结点.这个结点并不包含实际的数据域,仅仅是为了我们更加方便的操作链表.

3.单链表基础操作

3.1创建单链表

创建单链表的整体思路是依托于pHead头结点,创建结点,并建立结点之间的相互关系.

/*创建一个含有n个结点的单链表.
*/
int creatlist(int n)
{LinkList_T *pTmp = NULL, *pEnd = NULL;int i = 0;pHead = (LinkList_T*)malloc(sizeof (LinkList_T));if (NULL == pHead)return -1;pEnd = pHead;/*整体流程: pEnd指向了pHead头结点.首次执行for循环时,设置pTmp的数据域,然后pEnd->next指向pTmp(即首结点).之后pEnd后移指向pTmp.第二次执行pTmp时,pEnd指向的是第一个结点(不计算pHead),pEnd->next = pTmp;即第一个结点的next指针指向新加入的结点.pEnd = pTmp;pEnd再指向新加入的结点.依次类推.即完成了链表的创建.        */for (i = 0; i < n; i++){pTmp = (LinkList_T*)malloc(sizeof (LinkList_T));pTmp->data = i;pEnd->next = pTmp;pEnd = pTmp;}pEnd->next = NULL;return 0;
}

3.2插入新结点

插入结点的思路是找到要插入的位置,先建立待插入结点与下一个结点的关系,然后再建立待插入结点与 上一个结点的位置关系(即断开插入之前的连接关系).

/*在链表的第n个结点后面插入新的结点.
*/
int insertlist(int n, int num)
{/*整体思路:1.遍历链表找到要插入的位置.2.插入结点.*/LinkList_T *pTmp = NULL, *pNode = NULL;int j = 0;pTmp = pHead;/*遍历链表寻找插入位置.*/while (pTmp && (j < n)){pTmp = pTmp->next;j++;}/*结点不存在.*/if (NULL == pTmp)return -1;pNode = (LinkList_T *)malloc(sizeof (LinkList_T));if (NULL == pNode)return -1;/*插入结点思路:pNode->next = pTmp->next;先连接后面的结点.        pTmp->next = pNode; 将前面的结点指向自己,即断开了前面结点与之前后面结点的连接.*/pNode->next = pTmp->next;pNode->data = num;pTmp->next = pNode;return 0;
}

3.3删除节点

删除结点的思路是找到待删除的结点,建立待删除结点的前一个结点与待删除结点的后一个结点之间的连接关系.然后删除待删除结点.

/*删除单链表的第n个结点.
*/
int dellist(int n)
{LinkList_T *pTmp = pHead;LinkList_T *pPrv = pHead;int j = 0;/*遍历链表寻找要删除的位置.注意此时要保留待删除结点的前一个结点地址.*/  while(pTmp && (j < n)){pPrv = pTmp;pTmp = pTmp->next;j++;}if (NULL == pTmp)return -1;/*思路: 1.获取到要删除的结点和前一个结点. 2.建立要删除的结点的后一个结点和其前一个结点的关系.3.删除待删结点.*/pPrv->next = pTmp->next;pTmp->next = pTmp;free(pTmp);return 0;
}

3.4修改链表数据

修改链表指定结点数据的思路是遍历链表找到待修改结点,修改数据域.

/*修改链表第n个结点的数据域
*/
int changelist(int n, int num)
{LinkList_T *pTmp = NULL;int j = 0;pTmp = pHead;/*遍历链表找到修改项*/while(pTmp && (j < n)){pTmp = pTmp->next;j++;}if (NULL == pTmp)return -1;/*修改数据.*/pTmp->data = num;return 0;
}

3.5查询链表

/*查询链表
*/
int querylist(void)
{LinkList_T *pTmp = NULL;int i = 0;pTmp = pHead;while(pTmp->next){pTmp = pTmp->next;i++;printf ("第 %d 结点的值是 %d \r\n",i, pTmp->data);}printf ("\r\n");return 0;
}

4.测试程序

int main(int argc, char **argv)
{creatlist(5);querylist();insertlist(5, 8);querylist();changelist(2, 6);querylist();insertlist(2, 8);querylist();dellist(3);querylist();
}

5测试结果

第 1 结点的值为 0
第 2 结点的值为 1
第 3 结点的值为 2
第 4 结点的值为 3
第 5 结点的值为 4 第 1 结点的值为 0
第 2 结点的值为 1
第 3 结点的值为 2
第 4 结点的值为 3
第 5 结点的值为 4
第 6 结点的值为 8 第 1 结点的值为 0
第 2 结点的值为 6
第 3 结点的值为 2
第 4 结点的值为 3
第 5 结点的值为 4
第 6 结点的值为 8 第 1 结点的值为 0
第 2 结点的值为 6
第 3 结点的值为 8
第 4 结点的值为 2
第 5 结点的值为 3
第 6 结点的值为 4
第 7 结点的值为 8 第 1 结点的值为 0
第 2 结点的值为 6
第 3 结点的值为 2
第 4 结点的值为 3
第 5 结点的值为 4
第 6 结点的值为 8 

C语言单链表实现增删改查相关推荐

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

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

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

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

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

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

  4. 带头节点单链表的增删改查

    单链表有很多结构循环单链表,有头节点的单链表,无头节点的单链表,双节点单链表,以下源码是以有一个头节点的单链表为例写的增删改查的各种功能,就是下图 然后各个注释也在函数后面写着,这玩意确实还挺难,源码 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. seaborn箱图(box plot)可视化、并且在箱图中使用三角形标注均值的位置(showmeans=True)
  2. BlogEngine.Net架构与源代码分析系列(转载)
  3. 6、Java Swing JTextField:单行文本框组件
  4. AIX 6.1 异步 I/O 的 配置与性能评估
  5. asp.net C# 实现上传Excel文件导入数据到SQL Server 数据库
  6. 百道Python面试题实现,搞定Python编程就靠它
  7. ubuntu kylin mysql_Ubuntu16.04下Kylin的安装与配置
  8. 依据BOM和已经存在的文件生成其他种类的文件
  9. 【QT】基于HTTP通信的天气查询的实现
  10. windows 下 修改mysql配置文件
  11. 数学分析(9): 不定积分
  12. c#对接科大讯飞平台--语音转写
  13. 08.音频系统:第006课_音频系统HAL分析:第001节_HAL之框架
  14. Kinect黑客:机械人科技未来的转变者
  15. 密码学和加密数字货币的简介
  16. “古董级” 诺基亚功能机跑Linux是怎样的画风?
  17. mvc 从客户端 中检测到有潜在危险的 Request 值
  18. Linux 安装httpd(apache)超详细教程
  19. 逻辑地址和物理地址转换
  20. 用python画枫叶代码-Python自定义函数基础

热门文章

  1. 爬取百度贴吧用户的帖子
  2. 航天信息a3服务器怎么打开,航天信息 睿财A3 使用说明
  3. TextMate 2.0 RC 23 特别版 Mac 著名的文本编辑器软件
  4. python单位根检验平稳性怎么看是否平稳_Python关于时间序列的平稳性检验
  5. 【Redis代理】- Twemproxy,不来了解一哈?
  6. 小程序——扫普通链接二维码打开小程序
  7. IE浏览器以及内置IE浏览器的程序不能使用的解决方案
  8. win10 1909版本安装不上RX560 570显卡驱动的解决办法。
  9. 游戏自评——CF手游
  10. 关于冗余和容错的一些总结(Redundancy and fault tolerance)