数据结构与算法分析学习(一)

学习记录:MOOC-数据结构-华中科技大学 + 《Data Structure and Algorithms in C++ - etc.》

Day 1

2.2 线性表顺序结构在C语言中的定义

在这里插入图片描述

静态分配:给类型变量分配了固定大小的硬件存储空间后,若插入的元素超过存储空间的大小,会发生溢出。

例:元素所占空间和表长合并为C语言的一个结构类型

#define maxleng 100

typedef struct
{
ElemType elem[maxleng];	// 下标: 0,1, ..., maxleng-1
int lenth;								// 表长
} SqList;

SqList La;
...

其中:
La.lenth: 表长;
La.elem[0]: 第一个元素(逻辑索引为0),上图中的 a 1 a_1 a1
La.elem[La.lenth-1]: 最后一个元素(逻辑索引为n-1),上图中的 a n a_n an

为解决静态分配的问题,引入动态分配:在溢出发生时,寻找一片更大的空间对数据进行重新分配。

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
ElemType *elem;			// 存储空间基地址
int length;					// 表长
int listsize;				// 当前分配的存储容量
					// 以 sizeof(ElemType) 为单位
} SqList;
SqList Lb;

在这里插入图片描述

chap5 基于数组的序列

python “序列”类,内嵌的 列表类(list),元组类(tuple),字符串类(str)。这些类之间有明显的共性:每个类都支持用下标访问序列元素;每个类都使用 数组 来表示序列。然而也有区别:这些类所表示的抽象以及实例化的方式存在明显差异。

数组
一组相关变量能够一个接一个地 存储在计算机存储器的一块连续区域内。

数组的每个单元必须占据相同数量的字节。原因在于为了允许使用索引值能在常量时间内访问数组内的任一单元。(数组中的每个位置称为单元)。

例:一个文本字符串以 一个字符数组形式存储。
可通过 start + cellsize*index 计算所求字符的内存地址。

Day 2

链表

链表构成

链表是由一系列连接在一起的结点构成,其中的每个结点都是一个数据结构。

链表的结点通常是动态分配、使用和删除的,允许链表在程序运行时增大或缩小。如果需要将新信息添加到链表中,则程序只需分配另一个结点并将其插入到系列中。如果需要从链表中删除特定的信息块,则程序将删除包含该信息的结点。

链表中的每个结点由数据成员和一个指针组成。数据成员包含一个或多个保存数据的成员。指针指向链表下一个节点。

链表访问

非空链表的第一个结点称为链表的头。要访问链表中的结点,需要有一个指向链表头的指针。从链表头开始,可以按照存储在每个结点中的后继指针访问链表中的其余结点。最后一个结点中的后继指针被设置为 nullptr 以指示链表的结束。

链表的C++实现

定义结点:假设每个结点将存储一个类型为 double 的数据项:

struct ListNode   	 	// ListNode 就是要存储在链表中的结点的类型
{
	double value;		// 结构成员 value 是结点的数据部分
	ListNode *next;	// 指向下一个结点的后继指针
	};

ListNode 结构有一个有趣的属性,它包含一个指向相同类型数据结构的指针,因此可以说是一个包含对自身引用的类型。像这样的类型称为自引用数据类型或自引用数据结构。

初始化链表:定义一个用作链表头的指针并将其初始化为nullptr:

ListNode *head = nullptr;

创建列表:包含一个结点,存储值为 1

head = new ListNode;		// 分配新结点
head -> value = 1;
head -> next = nullptr;

其中 new 是关键字,相当于程序员手动请求分配一块内存空间,以存储该链表。

创建新节点

ListNode *secondPtr = new ListNode;
secondPtr -> value = 2;
secondPtr -> next = nullptr;		// 第二个结点是链表的结尾
head -> next = secondPtr; 		// 第一个结点指向第二个

创建简单链表

#include <iostream>
using namespace std;
struct ListNode
{
    double value;
    ListNode *next;
};

int main()
{
    ListNode *head = nullptr;
    // Create first node with 12.5
    head = new ListNode; // Allocate new node
    head->value = 12.5;    // Store the value
    head->next = nullptr; // Signify end of list
    // Create second node with 13.5
    ListNode *secondPtr = new ListNode;
    secondPtr->value = 13.5;
    secondPtr->next = nullptr; // Second node is end of list
    head->next = secondPtr; // First node points to second
    // Print the list
    cout << "First item is " << head->value << endl;
    cout << "Second item is " << head->next->value << endl;
    return 0;
}

http://c.biancheng.net/view/1570.html
https://blog.csdn.net/slandarer/article/details/91863177
https://blog.csdn.net/qq_33835307/article/details/82683475
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值