《数据结构(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)——什么是数据结构及算法
在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法"混合"起来讲,导致很多人初学时对于"数据结构"这个词的意思把握不准,从而降低了学习兴趣和学习信 ...
随机推荐
- 计网学习笔记三 MAC与LAN
在上一讲中,我们学习了链路层可以提供的服务:framing,link access,reliable delivery,error detection&correction.这一讲我们从lin ...
- python安装robotframework的一些常见的错误
python安装robotframework的一些常见的错误 首先的电脑环境是x86的,然后下载的python版本起初是3.10.1的 在cmd 中出入pip install robotframwor ...
- vulnhub靶场之BLUESMOKE: DEVRANDOM2|bluesmoke
准备: 攻击机:虚拟机kali.本机win10. 靶机:Bluesmoke: devrandom2,下载地址:https://download.vulnhub.com/bluesmoke/Bluesm ...
- 集合-ArrayList 源码分析
1.概述 ArrayList 是一种变长的集合类,基于定长数组实现.ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个 ...
- 利用NGINX搭建部署直播流媒体服务器
直播如今是一个老生常谈的问题,怎么用于直播,大多数人只晓得,大佬某平台直播软件,点击开始即可直播.那么如何来搭建一个简易的直播平台呢?仅仅是有直播功能,没有涉及转码以及播放软件. 安装nginx以及r ...
- 二进制安装Kubernetes,一键安装脚本
背景,最近几天闲着研究Kubernetes,发现使用手动二进制安装会有些繁琐.经过突发奇想,就出现这个脚本. 声明,该脚本不及互联网上其他大佬的一件脚本,该脚本仅仅是突发奇想编写的,希望大佬不喜勿喷. ...
- 实现自定义注解,实现ioc与aop
实现自定义注解主要分三个步骤: 1.定义自己的注解类. 注解类默认继承Annotation接口. 且注解内的属性默认public(要给别人用的) 属性可以定义默认值也就是不给你的属性传值也会拥有默认. ...
- 7.OAuth2
1.近几天在学习OAuth2协议,实际开发中用的最多的就是授权码模式 2.OAuth2的授权码模式流程:首先是用户去访问资源服务器,服务器会给用户一个授权码:用户根据授权码去访问认证服务器,服务器 ...
- android 6.0动态权限的申请
一下9组权限需要动态申请//通讯录(读.写.查询)group:android.permission-group.CONTACTS permission:android.permission.WRITE ...
- CentOS7.6静默安装19C实例脚本 ORA-27125 [FATAL] [DBT-10322]
脚本: dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname test -sid test -characte ...