数据结构是计算机存储,组织数据的方式,数据结构是指相互之间存在一种或多种关系的数据元素的集合,数据结构往往同高效的检索算法和索引技术有关
1,线性表的定义
线性表是最基本最简单,也是最常用的一种数据结构。
线性表中的数据元素之间的关系是一对一的关系:即除了第一个元素和最后一个元素以外,其他的数据元素
都是“首尾相连”的
线性表中的数据元素可以是各种各样的类型,但是同一个线性表中的数据元素必定具有相同的属性,
即同属于一种数据类型。
(1)存在唯一一个被称之为“第一个”的数据元素 first
(2)存在唯一一个被称之为“最后一个”的数据元素last
(3)除第一个外,线性表(集合)中的每个元素,有且仅有一个前驱元素
(4)除最后一个外,线性表(集合)中的每个元素,有且仅有一个后继元素
2,线性表的物理结构实现
要存储线性表,必须要存储两类东西:
“数据” -》班级号
“逻辑关系” -》哪个班开在前面,哪个班开在后面
存储线性表的时候,物理实现有两种方式
(1)顺序结构
用存储单元的地址的物理关系去描述其逻辑关系
你逻辑在前的元素,物理关系(存储单元地址)也在前面
线性表的顺序表示指的是用一组连续的存储单元依次存储线性表的各个元素。-》 “数组”
int a[7] = {19171,19172,19173,19174,.......};
各个元素的物理地址(物理结构)的先后顺序,就可以表示其“逻辑关系”
线性表(顺序结构,数组):增 删 改 查
增:
先找到你所属的位置
再挪动后面的元素
再插入
复杂
删:
先找到要删除的元素
再挪动后面的元素(一个一个往前挪)
复杂
改:
简单
查:
简单
顺序结构优点:
改,查,方便简单
缺点:
增,删,复杂,要挪动的元素太多了
(2)链式结构 -》链表
在存储线性表时,不一定要用连续的地址存储,可以随意在内存的任意位置(空闲的内存)去存储数据元素 ,只不过需要存储下一个或上一个元素的内存中的位置
typedef int ElemType;//给int类型取了一个别名,叫做ElemType->节点数据类型
struct node //定义了一个新的类型,叫做struct node
{
ElemType data;//存储“数据” ->数据域
struct node * next;//存储下一个元素的地址,因为下一个元素和这个元素属于同一类型
//所有它的类型是struct node * -》指针域
};
typedef struct node NODE;//给struct node取了一个别名NODE
链表分类:
无头结点的链表
有头结点的链表
双向链表
循环链表
示例代码:创建和打印各个节点
NODE * create_list()
{
int x;
NODE * p;//用来保存当前用户输入的节点的地址
NODE * first = NULL;//用来保存第一个节点
NODE * last = NULL;//用来保存最后一个节点
int flag = 0;
while(1)
{
//第一步
scanf("%d",&x);
if(x==0)
{
break;
}
//第二步:把用户输入的数据保存到一个“节点”中
p = (NODE *)malloc(sizeof(NODE));//动态分配一段空间用来保存当前“节点”
p->data = x;//把用户输入的数字保存到这个节点的数据域
p->next = NULL;
//第三步:把节点加入链表
//if(flag == 0)
if(first == NULL)
{
//第一个节点
first = p;//first:左值 ,p:右值
last = p;
//flag = 1;
}
else
{
//非第一个节点
#if 0
//尾插法
last->next = p;
last = p;
#else
//头插法
p->next = first;
first = p;
#endif
}
}
return first;
}
void printf_list(NODE * first)//打印整个链表(打印数据域)
{
while(first != NULL)
{
printf("%d ",first->data);//打印a[i]
first = first->next;//i++
}
printf("\n");
}