数据结构Part1 绪论与线性表

本文深入探讨了数据结构的基础概念,包括逻辑结构、存储结构和算法效率衡量。重点讲解了线性表,区分了顺序表与链表,分析了它们的操作和优缺点。此外,还详细介绍了单链表和双链表的定义、操作及其实现,包括链表的翻转算法。内容涵盖数据结构的核心知识,是理解数据结构与算法的宝贵资源。
摘要由CSDN通过智能技术生成

分节目录

数据结构(完结)
数据结构Part1 绪论与线性表
数据结构Part2 栈和队列
数据结构Part3 串
数据结构Part4 树与二叉树
数据结构Part5 图
数据结构Part6 查找
数据结构Part7 排序

第一章 绪论

1.基本概念:数据,数据元素,数据对象,数据类型(原子类型,结构类型,抽象数据类型),数据结构

2.数据结构三要素:逻辑结构(线性,非线性),存储结构(顺序存储,链式存储,索引存储,散列存储),数据的运算(算法)

3.算法特征:有穷性,确定性,可行性,输入,输出;算法目标:正确性,可读性,健壮性,效率与低存储量需求

4.效率度量:时间复杂度与空间复杂度

第二章 线性表

1. 线性表的定义与基本操作

1.1 概念

定义:由相同数据类型的有限序列。
表中元素具有:有限性,顺序性,单个元素,类型相同(所占空间大小相同),抽象性。
线性表是一种逻辑结构,顺序表与链表是指存储结构。

1.2 基本操作

// 基本操作
InitList(&L)     		//初始化表。构造一个空的线性表L,分配内存空间。
DestroyList(&L)			//销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
ListInsert(&L,i,e)		//插入操作。在表L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e)		//删除操作。删除表L中第i个位置的元素,并用e返回删除元素。
LocateElem(L,e)			//按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem(L,i)			//按位查找操作。获取表L中第i个位置的元素的值。
Length(L)				//求表长。返回线性表L的长度,即L中数据元素的个数。
PrintList(L)			//输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L)				//判空操作。若L为空表,则返回true,否则返回false。

查->改/增/删,查的基本操作是表非空情况下的遍历。

2. 顺序表

2.1 概念

1.定义:线性表的顺序存储表示称为顺序表,表中元素的逻辑顺序与其物理顺序相同。

loc(A) + (i-1) * sizeof(ElemType)

2.静态分配的顺序表:静态数组,创建时固定表的大小。

3.动态分配的顺序表:动态数组,扩容时申请一篇更大的区域,复制过去。

2.2 操作

随机访问,存储密度高,适合查找,不适合增删;通常不可扩容,且扩容的代价大。

3. 链表

3.1 单链表

定义:线性表的链式存储表示称为单链表,分为带头节点不带头节点两种。

操作:头插法,逆序建立链表;尾插法,需要增加一个尾指针,正向建立链表。判断链表为空的条件,链表遍历。

难点:指定节点a前插入b,可以在指定节点a后插入b,然后交换a,b节点的数据元素。

翻转单链表:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(!head)   return head;
        ListNode* pre = nullptr;
        ListNode* p = head;
        while (p) {
            ListNode* temp = p->next;
            p->next = pre;
            pre = p;
            p = temp;
        }
        return pre;
    }
};

3.2 双链表

每个节点既有next指针,也有prior指针。

3.3 循环链表

最后一个节点的不指向NULL而是指向头节点。

if(L->next == L)	//链表为空
if(p->next == L)	//p为尾节点,用于遍历

循环单链表:只需定义一个尾指针指向尾部,可以快速的对头尾进行操作,可用于队列的实现。

循环双链表:prior与next都指向L。

3.4 静态链表

借助数组来描述线性表的链式存储结构

addrdatanext
02
1b6
2a1
3d-1
4
5
6c3

初始化:头节点->next=-1,其余节点->next=-2,next保存下一个节点的实际位置的序号,尾节点的next为-1。

应用:FAT表(文件分配表),不支持指针的高级语言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值