链/顺序表,链栈、顺序栈、链队列、循环顺序队列

数据结构学习整理

//全局常量 
#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----------------------*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值