《数据结构(C语言版)》严蔚敏代码实现———链表
一、前言
哈喽,大家好~我是熊子q,我又来了!
他来了他来了,他带着代码过来了!
今天要分享的代码是链表!快快搬着小板凳!

二、代码
严奶奶的书中预定义了一些预定义常量和类型,大家可以 新建一个y.h文件粘贴以下内容, 然后再去复制代码哦。
y.h文件内容:
/**
* 严奶奶书中的预定义常量和类型
**/
//函数结果状态代码
#define TRUE 1 //成功
#define FALSE 0 //失败
#define OK 1 //成功
#define ERROR 0 //错误
#define INFEASIBLE -1 //不可实行
#define OVERFLOW -2 //溢出
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
链表LinkList.cpp:
#include "y.h"
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef int ElemType;
/**
* 严奶奶单链表的实现
* by 熊子q 2021.2.1
**/
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//获取元素
Status GetElem(LinkList L, int i, ElemType &e){
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LNode *p = L->next; //p指向第一个结点
int j = 1; //j为计数器
while(p && j<i){ //寻找第i个位置
p = p->next;
++j;
}
if(!p || j>i) return ERROR; //第i个元素不存在
e = p->data; //否则获取第i个元素
return OK;
}
//插入元素,时间复杂度O(n)
Status Insert(LinkList &L, int i, ElemType e){
//在带头结点的单链表L中第i个位置之前插入元素e
LNode *p = L;
int j = 0;
while(p && j<i-1){p = p->next;++j;}
if(!p || j>i-1) return ERROR; //i小于1或者大于表长加1
LNode *q = (LNode*)malloc(sizeof(LNode));
q->data = e; //插入数据
q->next = p->next;
p->next = q;
return OK;
}
//删除元素,时间复杂度O(n)
Status ListDelete(LinkList &L, int i, ElemType e){
//在带头结点的单链表L中,删除第i个元素,并由e返回其值
LNode *p = L->next;
int j = 1;
while(p && j<i-1){p = p->next;++j;} //寻找i的前驱元素
if(!(p->next) || j>i-1) return ERROR; //删除位置不合理,i元素不存在或
LNode *q = p->next; //删除第i个位置元素,并释放该结点
p->next = q->next;
e = q->data;
free(q);
return OK;
}
//创建链表
void CreateList(LinkList &L, int n){
//逆序输入n个元素的值,建立带头结点的单链表L
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; //建立一个头结点
printf("请输入数据:\n");
for(int i=n;i>0;--i){
LNode *p = (LNode*)malloc(sizeof(LNode));
scanf("%d",&(p->data));
p->next = L->next; L->next = p;
}
}
//合并两个有序链表
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc){
//已知单链表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链表Lc,Lc的元素也按值非递减排列
LNode *pa = La->next;
LNode *pb = Lb->next;
LNode *pc = La; //用La的头结点作为Lc的头结点
Lc = pc;
while(pa && pb){
//取二者中较大值添加到Lc中
if(pa->data > pb->data){
//先添加该节点为pc的后继元素,然后pc和pa指针都后移
pc->next = pa; pc = pc->next; pa = pa->next;
}
else{pc->next = pb; pc = pc->next; pb = pb->next;}
}
pc->next = pa? pa: pb; //插入剩余段
free(Lb); //释放Lb的头结点
}
//输出单链表
void Display(LinkList &L){
LNode *p = L->next;
printf("单链表的内容为:");
while(p){
printf("%d",p->data);
if(p->next) printf("->");
else printf("\n");
p = p->next;
}
}
int main(){
LinkList l;
CreateList(l, 5);
Display(l);
// printf("在第%d位插入%d",1,123);
// Insert(l, 1, 123);
// Display(l);
int tmp;
GetElem(l, 2, tmp);
printf("%d",tmp);
return 0;
}
三、运行截图

四、附录
如果你想看其他的代码,下面有链接哦:
《数据结构(C语言版)》严蔚敏代码实现———链表的更多相关文章
- 数据结构(C语言版)严蔚敏->排序
@ 目录 1. 插入排序 1.1 直接插入排序 1.2 折半插入排序 1.3 希尔排序(Shell Sort) 2.交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 简单选择排序 ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 【数据结构(C语言版)系列二】 栈
栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...
- 【数据结构(C语言版)系列三】 队列
队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...
- 【数据结构(C语言版)系列一】 线性表
最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...
- 深入浅出数据结构C语言版(1)——什么是数据结构及算法
在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法"混合"起来讲,导致很多人初学时对于"数据结构"这个词的意思把握不准,从而降低了学习兴趣和学习信 ...
随机推荐
- GO语言学习笔记-反射篇 Study for Go ! Chapter nine - Reflect
持续更新 Go 语言学习进度中 ...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs ...
- 常用注解-SpringBoot请求
SpringBoot请求 常用注解及作用范围: @Controller :[类]需要返回一个视图(themleaf),加注解4@ResponseBody等于注解2 @RestController:[类 ...
- Python安装-在Linux系统中使用编译进行安装
Python安装-在Linux系统中使用编译进行安装 你可以使用Ubuntu自带的Python3,不过你不能自由的控制版本,还要单独安装pip3,如果你想升级pip3,还会出现一些让人不愉快的使用问题 ...
- 配置了一台3700X电脑后
众所周知,电脑是生活中必不可少的玩具,最近搞了一套配置.CPU3700X,显卡RX580,内存32GB.敲,这CPU的框框,看见就爽的不得了. As we all know, a comput ...
- 部署lnmp环境,安装typecho博客
安装nginx和PHP环境 root@cby:~# apt install nginx php7.4 php7.4-mysql php7.4-fpm 修改nginx配置文件 root@cby:~# v ...
- 多态、抽象、Object类
1.方法重写要求:方法名相同.参数类型相同.返回值相同或其子类返回值相同,子类修饰符要不小于父类 2.方法重载要求:方法名相同.参数类型不同.返回值没有改变.修饰符无关 3.多态的前提是继承.多态是定 ...
- 五月十五日java基础知识点
1.匿名内部类适用于编写事件程序 interface Ishape{ void shape(); } class MyType{ public void outShape(Ishape s){//接口 ...
- JS执行机制--同步与异步
单线程JavaScript语言具有单线程的特点,同一个时间只能做一件事情.这是因为JavaScript脚本语言是为了处理页面中用户的交互,以及操作DOM而诞生的.如果对某个DOM元素进行添加和删除,不 ...
- 基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
2023年目前要说最热的点,肯定是ChatGPT了. ChatGPT官方提供的网页版本,还有需要科*上网,很多人都会基于此进行封装. 现在是移动互联网时代,基于手机APP的需求还是很大的. 所以,今天 ...
- mysql+proxysql+replication-manager的主从半同步复制+高可用+读写分离
环境: AlmaLinux release 9.1 MySQL Community Server Ver 8.0.33 Replication Manager v2.2.40 for MariaDB ...