这里创建单链表都是指定长度进行创建的,之后会补上动态创建。

单链表

  • 一、头插法创建单链表(p30)
  • 二、尾插法创建单链表
  • 三、按索引查找和按值查找
  • 四、插入到第几个节点之后
  • 五、删除节点

一、头插法创建单链表(p30)

  1. 由于严蔚敏老师书上的代码是C/C++混着来的,按照书上的代码敲出来的代码,用C语言编译器编译会报错。

  2. 比如CreateList_L(LinList &L, int n)这函数,C语言中是没有引用调用(即 &L) 这种用法的。

  3. 所以下面给出纯C语言的版本,只需要将 &L 换成指针即可。

  4. 在这里提出一个小建议,很多博客写的头插法(包括严蔚敏老师书上的),都用到了typedef struct LNode {} *LinkLIst,对于新手来说,这种写法不太友好,感觉不太能直观的感受到指针的用法。所以,下面的我直接把它写成了二级指针。

  5. 之后会补上为什么要这样转化。(即LnikLIst &L -> LNode** L)==。

  6. T(n) = O(n)

  7. 运行结果


#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;typedef struct LNode
{ElemType data;struct LNode* next;
} LNode;/* # 头插法创建单链表- 头插法是将每个节点插入到头节点后面,即如输入1,2,3,4,5最后的链表应该是 head->5->4->3->2->1- L是单链表的首地址(头节点)- n是单链表的节点数目
*/
void List_HeadInsert(LNode** L, int n) {(*L) = (LNode*)malloc(sizeof(LNode));(*L)->next = NULL; // 头节点的创建(*L)->data = n;// printf("init: %x\n", &L);for(int i = 0; i < n; i ++) {LNode* p = (LNode*)malloc(sizeof(LNode));scanf("%d", &p->data);p->next = (*L)->next;(*L)->next = p;}
}/*# 打印单链表
*/
void print(LNode** L) {// L = L - 40;// printf("%x\n", &L);LNode* p = (*L)->next;if( !p) {printf("L is NULL.\n");}int len = (*L)->data;printf("Contents of the list are:\n");for (int i = 0; i < len; i ++) {printf("%d%s", p->data, i == len - 1 ? "\n" : "->");p = p->next;}
}int main() {LNode* L;List_HeadInsert(&L, 5);// printf("%x\n", &L);print(&L);return 0;
}

二、尾插法创建单链表

  1. 头插法创建的单链表和输入的节点逆序,尾插法则是顺序。
  2. 代码和运行结果。
  3. T(n) = O(n)
void List_HeadInsert(LNode** L, int n) {(*L) = (LNode*)malloc(sizeof(LNode));(*L)->next = NULL; // 头节点的创建(*L)->data = n;// printf("init: %x\n", &L);for(int i = 0; i < n; i ++) {LNode* p = (LNode*)malloc(sizeof(LNode));scanf("%d", &p->data);p->next = (*L)->next;(*L)->next = p;}
}

三、按索引查找和按值查找

  1. 运行结果和代码。
  2. T(n) = O(n)
/* 按序号查找节点值 */
LNode* GetElem(LNode** L, int dst) {if(dst < 0) return NULL;if(dst == 0) return *L;LNode* p = (*L)->next;for (int i = 0 ; i < dst; i ++) {if(p) p = p->next;}return p;
}/* 按元素值查找结点 */
LNode* LocateElem(LNode** L, int e) {LNode* p = (*L)->next;while( p->data != e && p) {p = p->next;}return p;
}

四、插入到第几个节点之后

  1. 运行结果和代码。
  2. T(n) = O(n)
/* 插入到第几个节点之后 */
void List_Insert(LNode** L, int dst) {if(dst < 0) return;LNode* s = (LNode*)malloc(sizeof(LNode));printf("var of current insert:\n");scanf("%d", &s->data);if(dst == 0) {s->next = (*L)->next;(*L)->next = s;(*L)->data += 1;return;}LNode* p = GetElem(L, dst-1);s->next = p->next;p->next = s;(*L)->data += 1;  // 表长加1
}

五、删除节点

  1. 运行结果和代码。
  2. T(n) = O(n)
/* 删除第i个节点 */
ElemType List_Delete(LNode** L, int i) {if(i < 0) return -1;ElemType res;LNode *p, *q;if(i == 0) {q = (*L)->next;res = q->data;(*L)->next = (*L)->next->next;free(q);(*L)->data --;return res;}p = GetElem(L, i - 1);q = p->next;res = q->data;p->next = p->next->next;free(q);(*L)->data --;return res;
}

阅读笔记-数据结构(C语言)-严蔚敏老师-单链表相关推荐

  1. 数据结构 c语言(严蔚敏) 总结 + 代码

    第一章 基本绪论 基本概念和术语 数据(Data):客观事物的符号表示,所有能够输入计算中并被计算机处理的符号的总称. 数据元素(Data Element):数据的基本单位,在计算机中作为一个整体进行 ...

  2. 数据结构-C语言-严蔚敏

    包含教材和教材的习题及答案,望大家找的也不那么辛苦 链接:https://pan.baidu.com/s/1SdTF3EKyv71Qw421kwqVyw?pwd=4t80  提取码:4t80

  3. 数据结构 c语言 严蔚敏 第十章 答案 10.1,严蔚敏版数据结构(C语言版)参考答案第十章..doc...

    第十章 内部排序 10.23 void Insert_Sort1(SqList &L)//监视哨设在高下标端的插入排序算法{??k=L.length;??for(i=k-1;i;--i) // ...

  4. 数据结构与算法(C语言 严蔚敏)一

    锚点 前言 什么是数据结构和算法 相关概念 逻辑结构 物理结构 抽象数据类型 C 语言结构体回顾 ​ 前言 有误的地方还请大家指出来,我会一一改正,也会在评论区置顶更正的记录: 如果是因为不同的教材导 ...

  5. 算法设计题3.16-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  6. 算法设计题3.27-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  7. 数据结构个人笔记 第三课 顺序表和单链表

    数据结构个人笔记 第三课 顺序表和单链表 顺序表的基本操作 插入元素 删除元素 顺序表查找元素 顺序表更改元素 本节总结代码 单链表 链表的节点 头节点.头指针和首元结点 链表的创建(初始化) 本节总 ...

  8. 单链表折半查找c语言,为什么有序的单链表不能进行折半查找

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:为什么有序的单链表不能进行折半查找 问题详情:急!!!!拜托高手解答 等级低 分数不高 请帮帮忙 谢谢了回答:这是由链表的特决定的. ...

  9. Nwafu-OJ-1485 Problem o C语言实习题八——单链表结点的阶乘和

    问题 : C语言实习题八--单链表结点的阶乘和 时间限制: 1 Sec  内存限制: 128 MB 提交: 5120  解决: 1555 [提交][状态][讨论版] 题目描述 要求实现一个函数,求单向 ...

最新文章

  1. 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法
  2. comp 313 schemas的学习
  3. OpenCASCADE:要求
  4. iOS开发-编译出错 duplicate symbols for architecture x86_64
  5. leetcode 1489. 找到最小生成树里的关键边和伪关键边(并查集)
  6. 【CH - 1401】 兔子与兔子(字符串哈希)
  7. 第58课 百钱买百鸡(完整) 3.完善程序 (《小学生C++趣味编程》)
  8. mysql meb安装_用meb搭建MySQL Master/Slave
  9. Java中Object转换为List类型
  10. java编写一个个人通信录程序
  11. 再谈UDP协议—浅入理解深度记忆
  12. MySql【超简单】清空部分表的数据
  13. Luogu2257 YY的GCD
  14. idea项目中使用URule 规则引擎的简单例子
  15. 【radon变换原理讲解及利用python库函数快速实现】
  16. 【visual studio】visual studio 2022 无法 复制黏贴
  17. 90%的预测准确率覆盖30%的订单,滴滴出行“猜您要去”目的地预测系统是怎么做的?...
  18. java怎么对数组中数据进行降序排序?
  19. Java开源工具库使用之Apache commons-lang3
  20. 更多内容请移步GitHub

热门文章

  1. 创·人 | 赵欧伦:90后不要和同龄人比较,认知自己是最酷的事情
  2. 栈的push、pop 序列
  3. 低功耗验证 (一) CMOS基础,功耗分类,低功耗方法
  4. H264码流解析(三):解析SPS和PPS
  5. 重置计算机win7,win7重置系统,开机一键还原win7系统
  6. InterSystems IRIS、IRIS for Health和Health Connect 2021.1预览版现已发布
  7. 个性化推荐系统在互联网中的应用
  8. macbook pro m1 安全性与隐私无法解锁,鼠标点击无响应,谷歌浏览器,postman无法选择上传文件
  9. SQL Server 返回了错误 21(设备未就绪。) 解决方法
  10. Windows 正在配置 Microsoft Office Professional Edition 2003