一、前言

哈喽,大家好~我是熊子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语言版)》严蔚敏代码实现———链表的更多相关文章

  1. 数据结构(C语言版)严蔚敏->排序

    @ 目录 1. 插入排序 1.1 直接插入排序 1.2 折半插入排序 1.3 希尔排序(Shell Sort) 2.交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 简单选择排序 ...

  2. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  3. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  4. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  5. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  6. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  7. 【数据结构(C语言版)系列二】 栈

    栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...

  8. 【数据结构(C语言版)系列三】 队列

    队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...

  9. 【数据结构(C语言版)系列一】 线性表

    最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...

  10. 深入浅出数据结构C语言版(1)——什么是数据结构及算法

    在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法"混合"起来讲,导致很多人初学时对于"数据结构"这个词的意思把握不准,从而降低了学习兴趣和学习信 ...

随机推荐

  1. 计网学习笔记三 MAC与LAN

    在上一讲中,我们学习了链路层可以提供的服务:framing,link access,reliable delivery,error detection&correction.这一讲我们从lin ...

  2. python安装robotframework的一些常见的错误

    python安装robotframework的一些常见的错误 首先的电脑环境是x86的,然后下载的python版本起初是3.10.1的 在cmd 中出入pip install robotframwor ...

  3. vulnhub靶场之BLUESMOKE: DEVRANDOM2|bluesmoke

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Bluesmoke: devrandom2,下载地址:https://download.vulnhub.com/bluesmoke/Bluesm ...

  4. 集合-ArrayList 源码分析

    1.概述 ArrayList 是一种变长的集合类,基于定长数组实现.ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个 ...

  5. 利用NGINX搭建部署直播流媒体服务器

    直播如今是一个老生常谈的问题,怎么用于直播,大多数人只晓得,大佬某平台直播软件,点击开始即可直播.那么如何来搭建一个简易的直播平台呢?仅仅是有直播功能,没有涉及转码以及播放软件. 安装nginx以及r ...

  6. 二进制安装Kubernetes,一键安装脚本

    背景,最近几天闲着研究Kubernetes,发现使用手动二进制安装会有些繁琐.经过突发奇想,就出现这个脚本. 声明,该脚本不及互联网上其他大佬的一件脚本,该脚本仅仅是突发奇想编写的,希望大佬不喜勿喷. ...

  7. 实现自定义注解,实现ioc与aop

    实现自定义注解主要分三个步骤: 1.定义自己的注解类. 注解类默认继承Annotation接口. 且注解内的属性默认public(要给别人用的) 属性可以定义默认值也就是不给你的属性传值也会拥有默认. ...

  8. 7.OAuth2

    1.近几天在学习OAuth2协议,实际开发中用的最多的就是授权码模式   2.OAuth2的授权码模式流程:首先是用户去访问资源服务器,服务器会给用户一个授权码:用户根据授权码去访问认证服务器,服务器 ...

  9. android 6.0动态权限的申请

    一下9组权限需要动态申请//通讯录(读.写.查询)group:android.permission-group.CONTACTS permission:android.permission.WRITE ...

  10. CentOS7.6静默安装19C实例脚本 ORA-27125 [FATAL] [DBT-10322]

    脚本: dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname test -sid test -characte ...