[数据结构]程杰《大话数据结构》单链表代码

《大话数据结构》读书笔记 书名:《大话数据结构》 作者:清华大学出版社 程杰 刚毕业那会看的,那时候看数据结构就是背,为了面试嘛。现在回过头再来看,结合平时用的api,发现能理解平时写的很多代码的底层实现逻辑了,做了一下笔记。 ...... 阅读详情
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20     /* 存储空间初始分配量 */

typedef int Status;    /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;  /* ElemType类型根据实际情况而定,这里假设为int */

typedef struct Node {  /* 线性表的单链表存储结构 */
	ElemType data;
	struct Node *next;
} Node;

typedef struct Node *LinkList; /* 定义LinkList */

/*打印某个数*/
Status visit(ElemType c) {
	printf("%d ", c);
	return OK;
}

/* 初始化顺序线性表 */
//申请的结果有两种
//1、失败:return ERROR
//2、成功:设定指针域为空、return OK
Status InitList(LinkList *L) {
	*L = (LinkList) malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
	if (!(*L)) /* 存储分配失败 */
		return ERROR;
	(*L)->next = NULL; /* 指针域为空 */
	return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(LinkList L) {
	if (L->next)
		return FALSE;
	else
		return TRUE;
}

/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(LinkList *L) {
	LinkList p, q;
	p = (*L)->next;         /*  p指向第一个结点 */
	while (p)               /*  没到表尾 */
	{
		q = p->next;        /*  用q保存p的下一节点*/
		free(p);            /*  释放p节点的空间*/
		p = q;
	}
	(*L)->next = NULL;      /*  最后,头结点指针域为空 */
	return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(LinkList L) {
	int i = 0;              /* 计数器 */
	LinkList p = L->next;   /* important:p指向第一个结点 */
	while (p) {
		i++;
		p = p->next;
	}
	return i;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(LinkList L, int i, ElemType *e) {
	int j;
	LinkList p;  /* 声明一结点p */
	p = L->next; /* 让p指向链表L的第一个结点 */
	j = 1;       /* j为计数器 */
	while (p && j < i) /* p不为空或者计数器j还没有等于i时,循环继续 */
	{
		p = p->next;   /* 让p指向下一个结点 */
		++j;
	}
	if (!p || j > i)
		return ERROR; /*  第i个元素不存在 */
	*e = p->data;     /*  取第i个元素的数据 */
	return OK;
}

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(LinkList L, ElemType e) {
	int i = 0;
	LinkList p = L->next;
	while (p) {
		i++;
		if (p->data == e) /* 找到这样的数据元素 */
			return i;
		p = p->next;
	}

	return 0;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(LinkList *L, int i, ElemType e) {
	int j;
	LinkList p, s;
	p = *L;
	j = 1;
	while (p && j < i) /* 寻找第i个结点 */
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
		return ERROR; /* 第i个元素不存在 */
	
	
	
	s = (LinkList) malloc(sizeof(Node)); /*  生成新结点(C语言标准函数) */
	s->data = e;
	s->next = p->next; /* 将p的后继结点赋值给s的后继  */
	p->next = s; /* 将s赋值给p的后继 */
	return OK;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(LinkList *L, int i, ElemType *e) {
	int j;
	LinkList p, q;
	p = *L;
	j = 1;
	while (p->next && j < i) /* 遍历寻找第i个元素 */
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i)
		return ERROR; /* 第i个元素不存在 */
	//插入和删除的前面这部分相同。
	
	
	q = p->next;
	p->next = q->next; /* 将q的后继赋值给p的后继 */
	*e = q->data; /* 将q结点中的数据给e */
	free(q); /* 让系统回收此结点,释放内存 */
	return OK;
}

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(LinkList L) {
	LinkList p = L->next;
	while (p) {
		visit(p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
void CreateListHead(LinkList *L, int n) {
	LinkList p;
	int i;
	srand(time(0)); /* 初始化随机数种子 */
	*L = (LinkList) malloc(sizeof(Node));
	(*L)->next = NULL; /*  先建立一个带头结点的单链表 */
	for (i = 0; i < n; i++) {
		p = (LinkList) malloc(sizeof(Node)); /*  生成新结点 */
		p->data = rand() % 100 + 1; /*  随机生成100以内的数字 */
		p->next = (*L)->next;
		(*L)->next = p; /*  插入到表头 */
	}
}

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
void CreateListTail(LinkList *L, int n) {
	LinkList p, r;
	int i;
	srand(time(0)); /* 初始化随机数种子 */
	*L = (LinkList) malloc(sizeof(Node)); /* L为整个线性表 */
	r = *L; /* r为指向尾部的结点 */
	for (i = 0; i < n; i++) {
		p = (Node *) malloc(sizeof(Node)); /*  生成新结点 */
		p->data = rand() % 100 + 1; /*  随机生成100以内的数字 */
		r->next = p; /* 将表尾终端结点的指针指向新结点 */
		r = p; /* 将当前的新结点定义为表尾终端结点 */
	}
	r->next = NULL; /* 表示当前链表结束 */
}

int main() {
	LinkList L;
	ElemType e;
	Status i;
	int j, k;
	i = InitList(&L);
	printf("初始化L后:ListLength(L)=%d\n", ListLength(L));
	for (j = 1; j <= 5; j++)
		i = ListInsert(&L, 1, j);
	printf("在L的表头依次插入1~5后:L.data=");
	ListTraverse(L);

	printf("ListLength(L)=%d \n", ListLength(L));
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	i = ClearList(&L);
	printf("清空L后:ListLength(L)=%d\n", ListLength(L));
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	for (j = 1; j <= 10; j++)
		ListInsert(&L, j, j);
	printf("在L的表尾依次插入1~10后:L.data=");
	ListTraverse(L);

	printf("ListLength(L)=%d \n", ListLength(L));

	ListInsert(&L, 1, 0);
	printf("在L的表头插入0后:L.data=");
	ListTraverse(L);
	printf("ListLength(L)=%d \n", ListLength(L));

	GetElem(L, 5, &e);
	printf("第5个元素的值为:%d\n", e);
	for (j = 3; j <= 4; j++) {
		k = LocateElem(L, j);
		if (k)
			printf("第%d个元素的值为%d\n", k, j);
		else
			printf("没有值为%d的元素\n", j);
	}

	k = ListLength(L); /* k为表长 */
	for (j = k + 1; j >= k; j--) {
		i = ListDelete(&L, j, &e); /* 删除第j个数据 */
		if (i == ERROR)
			printf("删除第%d个数据失败\n", j);
		else
			printf("删除第%d个的元素值为:%d\n", j, e);
	}
	printf("依次输出L的元素:");
	ListTraverse(L);

	j = 5;
	ListDelete(&L, j, &e); /* 删除第5个数据 */
	printf("删除第%d个的元素值为:%d\n", j, e);

	printf("依次输出L的元素:");
	ListTraverse(L);

	i = ClearList(&L);
	printf("\n清空L后:ListLength(L)=%d\n", ListLength(L));
	CreateListHead(&L, 20);
	printf("整体创建L的元素(头插法):");
	ListTraverse(L);

	i = ClearList(&L);
	printf("\n删除L后:ListLength(L)=%d\n", ListLength(L));
	CreateListTail(&L, 20);
	printf("整体创建L的元素(尾插法):");
	ListTraverse(L);

	return 0;
}

数据结构算法-顺序表、栈和队列-单链表删除元素(适用考研408) 单链表删除元素思路就是:设存储元素ai的结点为q,要实现将结点q删除单链表的操作其实就是将它的前继结点的指针绕过指向它的后继结点即可。 阅读详情

相关推荐

线性表详解(静态链表、单链表、双向链表、循环链表)

目录申明 申明   本文章属于原创,其中参考了程杰老师《大话数据结构》行文结构和内容,侵删。

雅俗共赏 4373

3

public class NewsDAOHibImpl implements INewsDAO { private HibernateUtil util; public NewsDAOHibImpl() { this.util = HibernateUtil.getInstance(); } @Override public void save(News n) { Sess

508

博途AI助手演示,完成简单且重复的梯形图代码,并导入到博途

自写个博途AI助手,下面演示AI帮我生成完善多个模拟量输入转换的代码,

gsjkwg的博客 1525

大话数据结构-单链表勘误,计划调整

按照之前的规划,参考《大话》来学习,但发现其中的有些代码比较让人疑惑,本来很简单的,我也都懂的,但是看完书上的代码就晕了,非常影响学习的进度和状态。读到单链表确实有点受不了,于是上网查了发现网友已经列出这本书的很多小错误,但对于单链表这边快还没有发现,遂提出: 书中对于单链表的存储结构定义如下: typedef struct Node { Elemtype data; struct Node* next; }Node;//定义结点 typedef struct Node* Link.

weixin_46432495的博客 739

基于APDL语言的结构优化设计

同理,二次微分值称为二阶值。通俗地讲优化分析,指的找到一种方案可以满足所有的设计要求,而且所需的支出(如重量,面积,体积,应力,费用等)最小。设计方案的任何方面都是可以优化的,比如说:尺寸(如厚度),形状(如过渡圆角的大小),支撑位置,制造费用,自然频率,材料特性等。完成分析文件的建立后,就可以进行优化分析了,如果在交互方式下进行优化的话,最好先在ANSYS数据库中用分析文件建立参数,其优点有:初始参数可以作为一阶分析方法的起点,且对于优化过程参数在数据库中可以在GUI下进行操作,便于定义优化变量。

m0_73816777的博客 1174

散户渡劫指南:从炼气期到化神期的量化之路

经常有人问我普通人怎么学习量化交易,我就在想怎么学了量化就不是普通人了吗,可能他的意思是类比修仙,量化素人如何修炼进阶,今天就将量化学习每个阶段均对标修仙境界的核心能力与心法要诀一一介绍,助你从“交易凡人”蜕变为“量化金仙”。

木头大左的博客 1338

线性表的实现(一)

我回来了,也变强了!准备更新王道考研课程中实现的代码。欢迎交流! 第二章线性表 用静态数组实现线性表。 把书上给到的函数给实现一下。 话不多说,直接上代码了。 void InitList(SqList &L); 初始化表。构造一个空表。 bool List_input(SqList &L,int n); 键入数据元素,n为你想键入的个数。 bool PrintfList(SqList &L); 输出操作,按先后顺序输出线性表的所有元素。 int Length(SqList L); 求

zmm0628的博客 833

【PyTorch项目实战】图像分类与识别:手写数字识别(MNIST)、普适物体识别(CIFAR-10)

主要介绍了两个经典的实战项目:(1)基于 MNIST 数据集的手写数字识别(2)基于 CIFAR-10 数据集进行图像分类

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 4400

线性表

线性表的基本概念 定义: 具有相同数据类型的n (n>=0)个数据元素的有限序列 特点: 元素类型都相同,所以每一个元素占有相同大小的存储空间; 元素个数有限; 元素具有逻辑顺序性,序列中各元素排列有先后顺序; 线性表的基本操作 //表的建立和销毁 InitList(&L):初始化表,构造一个空的线性表L,分配内存空间 DestroyList(&L):销毁操作。销毁线性表,并释放L所占用的内存空间 //增、删 ListInsert(&L,i,e):插入操作。在表中的第

weixin_44810857的博客 376

Codex CLI 手机号验证失败?5 种接码平台实测对比与绕过地区限制的 3 步操作

揭示 Codex CLI 手机号验证失败的真实原因在于上下文污染而非网络问题,分析其通过 ASN、Accept-Language 和 TLS SNI 三重加权风控的机制,并实测对比 5 种接码平台在 DNS 解析路径、ASN 干净度和复用间隔上的差异,提出剥离浏览器指纹、固化 TLS SNI、隔离

weixin_42627902的博客 730

【ComfyUI】【Nunchaku】【diffusers报错解决】秋叶整合包安装 Nunchaku 报错的解决方法

最近在折腾 AI 绘图时,我尝试在秋叶的 ComfyUI 整合包中安装 `ComfyUI-nunchaku` 插件(版本 0.3.3),结果启动后直接报错,提示无法从 `accelerate.utils.memory` 中导入 `clear_device_cache`,让我一度怀疑插件是否兼容。查阅了一堆 issue 和源码之后,总算找到了原因和解决方法。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1852

【数据结构】线性表的定义及基本操作

数据结构的三要素是逻辑结构、数据的运算、存储结构(物理结构),存储结构不同,运算的实现方式也不同。本次文章包括线性表的定义和基本操作,其中线性表的定义属于三要素中的逻辑结构,基本操作属于三要素中的运算。线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则一般表示为L=(a1,a2,…ai,ai+1,…,an)。需要理解的重要概念有表长、空表、表头、表尾、前驱、后继、位序,“已经放入思维导图中”👇。

颜颜yan_的博客 969

使用Python的OpenCV库进行三维重建点云

通过这些步骤,我们可以使用Python的OpenCV库进行三维重建,并生成对应的点云。当然,这只是一个简单的示例,实际的三维重建可能涉及更多的图像处理和计算步骤。在计算机视觉领域,三维重建是一项重要的任务,它可以将多个二维图像或视频序列转换为三维场景模型。在本文中,我们将介绍如何使用Python的OpenCV库进行三维重建,并生成相应的点云。以上是使用Python的OpenCV库进行三维重建点云的简要介绍和示例代码。最后,我们可以将计算得到的三维点云可视化。安装完成后,我们可以开始编写代码。

AuSwift的博客 1646

C数据结构 单链表操作

单链表的一些操作函数(参考自 程杰---《大话数据结构》): 宏定义: #define OK 1 #define ERROR 0 typedef int ElemType; typedef int Status; 结构体:(线性单链表存储结构) typedef struct Node { ElemType data; struct Node *n

y85171642的专栏 1141

华为数字化转型之道 方法篇 第五章 视IT为投资,用产品思维管理IT

比较传统信息化和数字化转型下的IT系统特征,我们发现业务环境、IT能力、业务和IT的关系都发生了巨大的变化(见图5-1)从“管理系统”到“作业平台”。企业通常的做法是将线下的文档、流程线上化,IT系统是作为管理系统而存在的。而面向数字化,企业的业务作业、业务运营和决策、团队协同等业务动作已经和IT系统集成,IT系统逐步转变为作业系统。从“功能优先”到“体验优先”,如果要整体完成一项工作往往需要用户在不同系统间切换,费时费力。

沧海之巅的专栏 1093

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

猿创征文|数据结构-单链表详解(含完整代码)

数据结构-单链表详解,包含单链表代码,包含图片解析,一看就会的单链表。

qq_65641647的博客 1894

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

你数据结构怎么学的?||内附单链表的基本操作源码。

你数据结构怎么学的?一文解决算法与数据结构所有基础问题! 1.数据结构 1.1数据结构起源 早起人们都把计算机理解为数值计算工具,所以应该先从实际问题中抽象一个适当的数据模型,设计一个解决此问题的算法,然后编写程序,得到一个实际的软件。 但是在现实中,计算机不是用来解决数值计算问题,而是需要科学有效的手段(例如链表,树,图等数据结构)的帮助,才能更好的解决问题。 所以,数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等子相关问题的学科(大话数据结构)。 1.2基本概念和术

m0_56116235的博客 238

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【数据结构系列】单链表的基本操作

DATE: 2020.4.14 1、参考 2、单链表的基本操作(创建、查找、插入、删除、遍历)

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 562

带头单链表实现-C语言

都是对带头单表的实现和操作,该文章提供了带头单链表的反转代码和代码解析

qq_52304908的博客 719

Qiuner赠书活动:算法图解、C++ Primer Plus、大话数据结构、Java项目全程开发实录、算法导论、深度学习、第一视角带你构建大模型GPT

人年轻时常觉空虚,总想找点什么填满自己。买书,是我曾经的一种方式。但买得多,看得少。最近想着,这些书放着也是放着,不如抽几本送给粉丝,包邮寄出。

Java、Python、AI、前沿技术等领域的技术总结和经验分享。 7777

数据结构——线性表(一)线性表的顺序存储和单链表

今天,好好整理下线性表的内容,打好基础。同时也为刷程序题做准备。本博客对相关代码做了非常详细的注释。       本博客主要参考了程杰先生的《大话数据结构》和严蔚敏老师的《数据结构c语言版》       1、线性表       线性表(List)是指零个或多个数据元素的有限序列。从名字看,是具有像线一样的性质的表。第一,它是一个序列,也就是说,元素之间是有顺序的,这个顺序不是指从小到大或者从

denghe优快云的博客 4329

建立单链表的完整代码_每天5分钟用C#学习数据结构(5)双链表 Part 1

【基础知识】| 作者 / Edison Zhou这是恰童鞋骚年的第189篇原创文章在上一篇中,我们学习了单链表,这一篇我们开始学习双链表。1双链表的基础双链表的节点结构与单链表不同的是,双链表有两个指针域,一个指向前驱节点,另一个指向后继节点。双链表的总体结构双链表中,每个节点都有两个指针,指向前驱和后继,这样可以方便地找到某个节点的前驱节点和后继节点,这在某些场合中是非常实用的。2双链表的实现双...

weixin_39585974的博客 195

C语言--单链表插入元素代码

C语言链表插入元素代码

dingxialei的博客 2980

程杰《大话数据结构》3-2线性表的链式存储(C语言源码+运行结果)

#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define

春卷同学的博客 290

菜鸟自学数据结构系列——(一)如何写出能够在VC下运行的单链表生成程序

最近打算自学数据结构,于是就在网上淘了两本书,一本是清华大学出版社出的严蔚敏老师的数据结构,一本是程杰的大话数据结构。直接看严老师的那一本实再是很吃力。于是我就先看大话的内容后,在深入的看严老师的书。大话数据结构写的非常有意思,语言很口语化,对于有些概念都用一些通俗的语言描述,看着不累,但是个人觉得其内容的深度太低,只适合了解一下基础的概念。想深入的学习,还是严老师的那本书。所以个人觉得两本书一起

zxman660的专栏 2813

从《大话数据结构》理解:链表 vs 数组,到底怎么选?

读《大话数据结构》时,程杰老师用很生动的比喻讲清楚了链表和数组的区别。这篇笔记结合我的理解做个总结。

2401_87777279的博客 221
上一篇: [数据结构]头插法与尾插法
下一篇: 用函数指针代替C++的引用参数 //严蔚敏《数据结构》(C语言版)课本源代码
ilikeprograming
博客等级 码龄14年 46粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值