1 线性表知识框架
线性结构:结构中的元素只存在一对一的关系
树形结构:一对多
图装结构:多对多
2 顺序存储-顺序表
定义:
#define MaxSize 100
int struct{
int data[MaxSize];
int length;
}list; //静态分配
int struct{
int *data;
int length,MaxSize;
}list;
data = new int[MaxSize]; //动态分配
例:
main()
{
cout<<"请输入数组的大小:";
cin>>MaxSize;
data = new int[MaxSize];
}
最大特点:随机存取,可在时间O(1)内进行存取
3 链式存储
3.1 单链表
定义:
typedef struct Node
{
int data;
struct Node *next;
}Node;
优点:离散的存储在内存空间中,不需要连续的大量的地址。
缺点:指针域的存在,浪费了存储空间,且因为是离散,所以是非随机存取,即不能直接找到表中的某个特定节点,需要从头开始遍历。
头结点的优点:
1.使链表内每个结点的操作统一。
2.使头指针指向的链表永远非空。
单链表基本操作:
1.头插法建表
// L 头指针 s 新建结点
s -> next = L -> next;
L -> next = s;
2.尾插法建表
//L 头指针 r 指向尾结点 s 新结点
r -> next = s;
r = s;
3.插入结点
// p 插入位置的前驱结点 s 新结点
s -> next = p -> next;
p -> next = s;
4.删除结点
// p 删除结点的前驱 q 将被删除的结点
q = p -> next;
p -> next = q -> next;
free(q);
3.2 双链表
定义:
typedef struct DNode
{
int data;
struct DNode *prior,*next;
}DNode;
1.插入
p -> next -> prior = s;
s -> next = p -> next;
s -> prior = p;
p -> next = s; // 这一步必须放在 1 ,2 句后面
2.删除
p -> next = q -> next;
q -> next -> prior = p;
free(q);
3.3 循环链表
1.循环单链表:表中的最后一个结点指向头结点
2.循环双链表:头结点的prior指向尾结点,尾结点的next指向头结点
3.4 静态链表
定义:
# define MaxSize 100
typedef struct
{
int data;
int next;
}Node[MaxSize]; // 结构体数组