链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。

初学链表,一般从单向链表开始

--->NULL
head

这是一个空链表。

 ---->[p1]---->[p2]...---->[pn]---->[NULL]
head   p1->next  p2->next   pn->next

有n个节点的链表。

创建链表

typedef struct student{int score;struct student *next;
} LinkList;

一般创建链表我们都用typedef  struct,因为这样定义结构体变量时,我们就可以直接可以用LinkList  *a;定义结构体类型变量了。

初始化一个链表,n为链表节点个数。

LinkList *creat(int n){LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;head = (LinkList*)malloc(sizeof(LinkList));//分配地址end = head;         //若是空链表则头尾节点一样for (int i = 0; i < n; i++) {node = (LinkList*)malloc(sizeof(LinkList));scanf("%d", &node->score);end->next = node;end = node;}end->next = NULL;//结束创建return head;
}

修改链表节点值

修改链表节点值很简单。下面是一个传入链表和要修改的节点,来修改值的函数。

void change(LinkList *list,int n) {//n为第n个节点LinkList *t = list;int i = 0;while (i < n && t != NULL) {t = t->next;i++;}if (t != NULL) {puts("输入要修改的值");scanf("%d", &t->score);}else {puts("节点不存在");}
}

删除链表节点

删除链表的元素也就是把前节点的指针域越过要删除的节点指向下下个节点。即:p->next = q->next;然后放出q节点的空间,即free(q);

void delet(LinkList *list, int n) {LinkList *t = list, *in;int i = 0;while (i < n && t != NULL) {in = t;t = t->next;i++;}if (t != NULL) {in->next = t->next;free(t);}else {puts("节点不存在");}
}

插入链表节点

我们可以看出来,插入节点就是用插入前节点的指针域链接上插入节点的数据域,再把插入节点的指针域链接上插入后节点的数据域。根据图,插入节点也就是:e->next = head->next;  head->next = e;

增加链表节点用到了两个结构体指针和一个int数据。

void insert(LinkList *list, int n) {LinkList *t = list, *in;int i = 0;while (i < n && t != NULL) {t = t->next;i++;}if (t != NULL) {in = (LinkList*)malloc(sizeof(LinkList));puts("输入要插入的值");scanf("%d", &in->score);in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点t->next = in;//填充t节点的指针域,把t的指针域重新指向in}else {puts("节点不存在");}
}

输出链表

输出链表很简单,边遍历边输出就行了。

        while (h->next != NULL) {h = h->next;printf("%d  ", h->score);}

c语言链表详解(超详细)相关推荐

  1. Java 泛型详解(超详细的java泛型方法解析)

    Java 泛型详解(超详细的java泛型方法解析) 1. 什么是泛型 泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型.也就是说在泛型使用过程中,操作的数据类型被指定为 ...

  2. mysql 联表比对,MySQL联表查询详解/超详细mysql left join,right join,inner join用法分析比较...

    超详细mysql left join,right join,inner join用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a200 ...

  3. log4j 配置详解(超详细)

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  4. 【bind()函数】JavaScript手写bind()及详解-超详细~~~

    这两天学习了手写call.apply.bind,手写bind思考了很久才实现了MDN的示例的结果,所以记录下来~ 因为是第一篇文章,所以可能存在一些错误,希望各位大佬批评指正,不吝赐教. 也欢迎不懂的 ...

  5. @Autowired注解详解——超详细易懂

    @Autowired详解 要搞明白@Autowired注解就是要了解它是什么?有什么作用?怎么用?为什么? 首先了解一下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spr ...

  6. 斜率优化详解(超详细, 有图有代码有注释)

    文章目录 斜率优化引入 从例题开始 斜率优化Part 1: 推为斜率式 斜率优化Part 2: 合法点集的斜率单调性 Part 3: 找到最优决策点 Part 4: 斜率优化大流程 Part 5: 斜 ...

  7. C语言 printf() 详解 非常详细

    来源:CSDN - 恋猫大鲤鱼 编译环境:Linux 环境以 g++ 4.4.6 编译成 64 位程序 1.printf() 简介 printf() 是 C 语言标准库函数,用于将格式化后的字符串输出 ...

  8. C语言二叉查找树(图文详解)(超详细)

    二叉查找树 本人在第一次学习二叉树的时候,感觉很懵懵懂懂,勉强知道了二叉树的结构和查找方式,但要我自己去动手写的时候,可是难上加难,所以这里我用干货+实际例子的方式让你上手二叉树,这个例子几乎可以套用 ...

  9. web服务器常见配置搭建详解(超详细)

    前言: 本博客借鉴一些写的比较好的博客,进行归纳总结,整理了一篇比较详细的服务器常见配置搭建教程 一来是和大家一起分享,二来也是作为自己的学习笔记记录一下. 温馨提示: 篇幅较长,请分阶段选择性查看. ...

  10. 计算机网络 - IPv4 常考知识点详解(超详细!)

    目录 一.IPv4分组 1.IPv4分组的格式 2.IP数据报分片 3.网络层转发分组的流程 二.IPv4地址与NAT 1.IPv4地址 2.NAT 三.子网划分与子网掩码.CIDR 1.子网划分 2 ...

最新文章

  1. java基础入门传智播客 源码_Java-_2020年版Java零基础视频教程(Java 0基础,Java初学入门)魔鬼讲师老杜出品...
  2. 高速串行总线设计基础(五)揭秘SERDES高速面纱之多相数据提取电路与线路编码方案
  3. lc412. Fizz Buzz
  4. 加载静态文件,父模板的继承和扩展
  5. 页面传值-laber
  6. 学习Windows编程遇到的问题
  7. Linux文件属性之r、w、x
  8. Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
  9. 现在很多人都做自媒体,谈谈个人的一些想法
  10. 时序图与状态图(Rose) - Windows XP经典软件系列
  11. Flutter 判断横竖屏(含尺寸、方向改变时触发)
  12. PS 打开黑屏怎么办?
  13. MySQL——页和索引
  14. jupyter notebook环境配置
  15. 2012考研数学二第(21)题——中值定理:零点定理+数列极限:单调有界准则
  16. 《Spring实战》读书笔记-第7章 Spring MVC的高级技术
  17. 来看看怎样让你的VSR模型跑的和苏炳添一样快
  18. oracle 用户名密码找回
  19. cm-14.1 Android系统定制(二):内置系统应用
  20. java 打印菱形和空心菱形

热门文章

  1. Ubuntu软件中心的完全启用
  2. LayoutInflater解析
  3. python总结与思考_学Python很久但是一直无法提升!你有思考过究竟是为什么吗?...
  4. Myeclipse 10破解run.bat和cracker.jar打不开的问题
  5. 华为认证高级网络工程师(Huawei Certified Senior Network Engineer HCSE)
  6. 英语音标学习视频教程
  7. Windows问题记录之任务栏图标透明
  8. 【必备知识】线激光扫描三维成像原理
  9. smartprinter 这个绝对程序猿的福音啊
  10. python开发指法练习软件_利用“金山打字通”或其它指法训练软件,学习和掌握键盘指法指法输入规则。如果你的电脑中未安装,请到网上下载并自行安装,这里是“金山打字通2016”。...