此博客连接:
第一章 基本概念
数据:信息的载体。
数据元素:数据的基本单位。
第一章 链表
学习链接:https://blog.csdn.net/Miss_Monster/article/details/83657467(概念)
学习链接:https://www.jianshu.com/p/6ebedde370b0(java)
简介:
链表的数据元素是一个一个串联在一起的,这一串数据形成的结构就是“链表”。它就像一条自行车“链条”一样。每一个数据元素可以称之为一个节点。
单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。
特点:
链表在内存中的物理存储空间是非连续、非顺序的。其中每个节点包含两部分,一个是存储数据元素的“数据域”,另一个是存储下一个节点地址的“指针域”。
优点:
1、因为链表对内存空间的连续性和顺序性没有要求,所以它可以充分利用内存空间,并且这一特点还造就了链表可以不必预先知道数据的大小,更加灵活。
2、链表插入和删除数据速度快,只需要修改相邻节点的指针域就行。
缺点:
1、每个节点除了存储数据外还需要额外的存储下一个节点的地址,因此占用内存空间大。
2、链表没办法像有索引的数据结构那样随机访问某一个元素,只能每次查找元素时从链表的头节点或尾节点开始遍历,增加了查询数据的消耗。
链表的种类
在实际中,链表有许多形式,不止是上图中简简单单的样子。以下情况组合起来就有八种形式的链表:
下面介绍一下它们各自的结构,通过图可以理解得更深刻
不带头单链表
单向、双向
带头、不带头
循环、非循环
不带头双向链表
带头单链表
循环单链表
带头双向循环链表
虽然有很多的链表结构,但其实,我们最常用的就是两种结构:
链表的插入删除操作
存储
顺序存储:
插入移动 n/2个元素
删除移动(n-1)/2个元素
时间复杂度O(n)
指针
指针是一种保存变量地址的变量。
int *p; // 声明一个 int 类型的指针 p char *p // 声明一个 char 类型的指针 p int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针 int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针
声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化:或是使他指向现有的内存,或者给他动态分配内存,否则我们并不知道指针指向哪儿,这将是一个很严重的问题,稍后会讨论这个问题。初始化操作如下:
/* 方法1:使指针指向现有的内存 */ int x = 1; int *p = &x; // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址 /* 方法2:动态分配内存给指针 */ int *p; p = (int *)malloc(sizeof(int) * 10); // malloc 函数用于动态分配内存 free(p); // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h
结构体
结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。由于结构将一组相关的变量看做一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中。声明一个结构的方式如下:
struct message{ // 声明一个结构 message char name[10]; // 成员 int age; int score; }; typedef struct message s_message; // 类型定义符 typedef s_message mess = {"tongye",23,83}; // 声明一个 struct message 类型的变量 mess,并对其进行初始化 -------------------------------------------------------------------------------------------------------------- /* 另一种更简便的声明方法 */ typedef struct{ char name[10]; int age; int score; }message;
结构指针
结构指针是指向结构的指针,以上面的结构为例,可以这样定义一个结构指针:
s_message *p; // 声明一个结构指针 p ,该指针指向一个 s_message 类型的结构 *p = &mess; // 对结构指针的初始化与普通指针一样,也是使用取地址符 &
C语言中使用 -> 操作符来访问结构指针的成员,举个例子:
#include "stdio.h" typedef struct{ char name[10]; int age; int score; }message; int main(){ message mess = {"tongye",23,83}; message *p = &mess; printf("%s ",p->name); // 输出结果为:tongye printf("%d ",p->score); // 输出结果为:83 return 0; }