数据结构

此博客连接:

第一章 基本概念

数据:信息的载体。

数据元素:数据的基本单位。

第一章 链表

学习链接: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;
}
原文地址:https://www.cnblogs.com/ping2yingshi/p/13352554.html