数据结构- 02线性表

84 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天

2.1定义&特点

线性表:数据特性相同的元素构成的有序数列

特点 每个数据元素都有一个前驱一个后继

第一个元素无直接前驱,最后一个元素无直接后继

长度 元素个数n

分类

顺序

链式

顺序表

定义

顺序结构/映像 用一组地址连续的存储单元依次存储线性表的数据元素

顺序表 这种存储结构的线性表

特点

1.逻辑上相邻的数据元素,物理次序也相邻

2.确定存储起始位置(及地址)后,表中任一元素可随机存取

  • 随机存取 存储器中的数据被读取或写入时,所需要的时间与该数据所在的物理地址无关
  • 顺序存取 所需要的时间与该数据所在的物理地址有关,表现为:在存取第N个数据时,必须先访问前(N-1)个数据。
  • 动态分配

基本操作

初始化

取值

查找

插入

删除

链表

1.链式结构/映像 用一组任意的存储单元依次存储线性表的数据元素

即为:结点node 数据域(数据)+指针域(指针/链)

2.分类

单链表/线性链表

定义

每个结点只包含一个指针域

存储结构

代码

首元节点/头指针/头结点(作用 两个)

基本操作

初始化

取值

查找

插入

删除

创建(头插/尾插)

 //尾插法建立链表:
 #include <stdio.h>
 #include <stdlib.h>//里面包含了malloc函数
 struct LinkList//创建结构体
 {
     int data;//数据域,用来保存数据。
     struct LinkList* next;//指针域,用来连接其他结点。
 };
 int main(void)
 {
     struct LinkList* head = (struct LinkList*)malloc(sizeof(struct LinkList));//创建头结点,并分配内存,需要的内存大小就是结构体的大小。别忘了在malloc前进行强制类型转换。(struct LinkList*)
     head->next = NULL;//头结点指针初始化
     struct LinkList* p ;//创建p结点 p结点在尾插法中用于记录链表尾结点,将来插入结点的时候只需要向p结点后插入即可。
     p = head;//p结点指针赋值为头结点
     int n;//保存链表长度,即结点的个数。
     printf("请输入链表长度:\n");
     scanf("%d", &n);
     printf("输入数据:\n");
     for (int i = 0; i < n; i++)//循环创建结点
     {
         struct LinkList* s = (struct LinkList*)malloc(sizeof(struct LinkList));//创建s结点,并分配内存
         scanf("%d", &s->data);//给s结点赋值。
         //尾插法建立链表
         p->next = s;//因为插完第一个结点后用p保存了上一个结点,所以再插结点时应该插在p节点后面,这就是尾插。
         s->next = NULL;//别忘了让插在尾部的s结点的指针指向NULL。
         p = s;//p结点保存刚才的s结点;以保证p始终为链表的最后一个节点
     }//至此,链表的创建已经完成了。
 ​
     p = head;//让p指针从"头"开始。
     while (p->next != NULL)//如果p的下一个结点不为NULL,也就是说如果p结点后还有节点存在,那就输出p后面结点中保存的数据。
     {
         printf("%-5d", p->next->data);
         p = p->next;//p结点后移
     }
     printf("\n");
     return 0;
 }//至此完成了链表的遍历输出。
 ​

循环链表

双向链表

顺序表链表比较

应用

\