数据结构学习整理
//全局常量
#define InitSize 100//初始化表空间大小
#define IncreasementSize 10//增加的表空间大小
#define MaxSize 100
/*-------------------------------------------*/
/*-------------------------------------------*/
/*
一、顺序表-用一组地址连续的存储单元,依次存储线性表中的数据元素。
1、逻辑位置相邻的元素,物理位置上也相邻
2、可以随机存取
3、在任意位置删除和添加一个元素时,需要移动大量的元素,这一方面是不足之处。
4、SqList
*/
//顺序表结构-表空间动态增加的
typedef struct {
int *elem;//数组指针
int length;//表长,意为线性表中元素个数 Count
int listSize;//表空间大小size
}SqList;
//分配表空间方式
SqList S;
S.elem = (int *) malloc (InitSize * sizeof(int));//初始分配
//增加表空间
S.elem = (int *) realloc (S.elem,((InitSize + IncreasementSize) * sizeof(int)));
//需要判断空间是否分配成功
if(!S.elem){//等价于S.elem == NULL
//分配失败!
exit(1);//异常退出程序
//exit(0);//正常退出程序
//return;//退出方法体
}//下面等同
//顺序表的静态结构
typedef struct {
int elem[100];//一维数组,存储线性表的元素
int length;//表长
}SqList2;
SqList2 S2;
//直接调用数组即可,无需再分配空间
S2.elem[1]//既是第二个元素值
/*-------------------------------------------*/
/*-------------------------------------------*/
/*
二、链表-用任意的存储空间,存储线性表中的数据元素。存储空间可以是连续的也可以是不连续的。
1、逻辑位置上相邻的物理位置上不一定相邻
2、链表的元素以结点形式表示-数据域和指针域;方便插入和删除,只需修改指针
3、想要查找某个元素,必须遍历整个链表,不能随机存取。这一方面是不足之处
4、链表的带头结点是自定义进去的,有一定的方便之处。
5、链表的表长不包括头结点。
6、LinkList
*/
//单链表的结构
typedef struct Node{
int data;//数据域
struct Node *next;//指针域,指向下一个数据,代表下一个数据元素的存储位置
}Node,*LinkList;
//除了上述的结构,也可以在内部加入一个变量length,用于记录表长,方便一些操作。
//例如:
/*
typedef struct Node{
int data;
struct Node *next;
int length;
}Node,*LinkList;
*/
//创建结点,并分配结点空间的方式:
LinkList L = (LinkList) malloc (sizeof(Node));//将生成的Node类型的结构赋值予LinkList型变量L
Node *L = (Node *) malloc (sizeof(Node));
//同上判断是否分配成功
//上述的两种的书写形式是等价的。
//双链表的结构
typedef struct DNode{
int data;//数据域
struct DNode *next;//后继指针
struct DNode *prior;//前驱指针
}DNode,*DLinkList;
/*-------------------------------------------*/
/*-------------------------------------------*/
/*
三、栈-特殊的线性表,有限制的线性表。
1、只允许在表尾进行插入和删除,该端称为栈顶top,表头称为栈底bease。
2、基于上述的特性,称其为后进先出表LIFO。
3、Stack
*/
//顺序栈的结构
typedef struct {
int *top;//栈顶指针-永远指向栈顶元素的下一个
int *rear;//栈顶指针
int length;//表长
int StackSize;//表空间大小
}SqStack;
//初始化
SqStack S3;
S3.top = S3.rear = (int *) malloc (InitSize * sizeof(int));
//同上判断是否分配成功
//链栈的结构
typedef struct LSNode{
int data;//数据域
struct LSNode *next;//指针域
}LSNode,*LinkStack;
//同单链表的操作差不多,只是多了一点栈的限制
/*-------------------------------------------*/
/*-------------------------------------------*/
/*
四、队列-特殊的线性表,有限制的线性表
1、允许一端进行插入、另一端进行删除。
2、插入的一端称队尾rear,删除的一端为队头front。
3、既称先进先出表FIFO
4、Queue
*/
//顺序队列-循环队列最常用
typedef struct {
int *elem;//数组指针-存放数据元素
int front;//队头位置
int rear;//队尾位置
}SqQueue;
//约定分配一次表空间后,不在动态增加空间
//约定将队尾的下一个位置指向对头时称队列满-即牺牲一个表空间
//front = rear = 0时为空
SqQueue SQ;
SQ.elem = (int *) malloc (MaxSize * sizeof(int));
SQ.front = SQ.rear = 0;//初始化
//队满
(SQ.rear + 1) % MaxSize == SQ.front;
//对空
SQ.front == SQ.front
//队长
(SQ.rear - SQ.front + MaxSize) % MaxSize;
//链队列
typedef struct LQNode{
int data;//数据域
struct LSNode *next;//指针域
}LQNode,*QueuePtr;
typedef struct{
QueuePtr front;//队头指针 LQNode *front;
QueuePtr rear;//队尾指针 LQNode *rear;
}LinkQueue;
LinkQueue LQ;
LQ.front = LQ.rear = (QueuePtr) malloc (sizeof(LQNode));
//每次只需创建结点即可,插入删除,进行修改指针的操作
//时刻把握,尾进头出
/*-------------------------------------------*/
/*-----------------over----------------------*/