一、线性表
概念:n个数据元素的有限序列。
1. 线性表的顺序实现
概念:用一组地址连续的存储单元依次存储线性表的数据元素。线性表可以用数组来实现。
#define int_Size 100
#define increment 10
#define ElemType int
//----------线性表的动态分配顺序存储结构-----------
typedef struct{
ElemType *elem;
int length; //当前有效长度
int listsize; //分配的存储容量
}SqList;
static enum Status
{
OK,
FAILED,
OVERFLOW
};
//-----------初始化--------------------------------
Status initSqList(SqList& list)
{
list.elem = (ElemType *)malloc(sizeof(ElemType)*int_Size);
if (!list.elem)
{
return OVERFLOW;
}
list.length = 0;
list.listSize = LIST_INIT_SIZE;
return OK;
}
2. 线性表的链式实现(指针)
用一组任意的存储单元存储线性表的数据元素(存储单元可以连续,也可以不连续)。
数据结构(C语言版本)_conanswp的专栏-CSDN博客_c语言数据结构
#define LINK_LIST_TYPE int
/*
线性表的链表实现
*/
typedef struct strLinkLinerList
{
LINK_LIST_TYPE data;
struct strLinkLinerList* pNext;
}LinkLinerList;
LinkLinerList* head = NULL;
/* 链表初始化 */
Status initLinkLinerList()
{
if (NULL == head)
{
head = (LinkLinerList*)malloc(sizeof(LinkLinerList));
if (!head)
{
return OVERFLOW;
}
head->pNext = NULL;
return OK;
}
else
{
return FAILED;
}
}
head = (LinkLinerList*)malloc(sizeof(LinkLinerList))的意思是生成一个链表类型的结点,同时将该结点的起始位置赋给指针变量head。
二、栈和队列
1. 栈
是仅限在表尾进行插入或删除操作的线性表,是先进后出的线性表。表尾端称为栈顶,表头端称为栈底,不含元素的空表称为空栈。
(1)定义:
#define STACK_INT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间增量分配
typedef struct{
int *base ; //栈底指针
int *top; //栈顶指针
int stacksize; //当前已分配的空间
}SqStack;
(2)算法:
//-----基本操作的算法描述(部分)-----
status InitStack(Sqstack &.s){
//构造一个空栈 s
S.base =(SElemType *)malloc(STACK.INIT_SIZE * sizeof(SElemType));
if(!S.base) exit (OVERrLow);
Ls.top=_S.Dase!都植问初始地址
s.stacksize = srAck liNir_Sizk;
//存储分配失败
return OK;
}// InitStack
Status GetfTop(SqStack S, SElemType &e){
//若栈不空,则用 e返回 S 的栈顶元素,并返回 OK;否则返回 ERROR
if(S.top == S.base) return ERROR;
e =*(S.top- 1);
return OK;
}// GetTop
Status Push (SqStack&s, SElemType e){
//插人元素 e为新的栈顶元素
if(S.top - S.base >= S.stacksize){//栈满,追加存储空间
S. base =(SElemType *) realloc( S.base,
(S.stacksize + STACKINCREMENT)* sizeof(SElemType));
i(!S.base) exit(OVERFLOW);//存储分配失败
s. top = S.base + S. stacksize;
S.stacksize += STACKINCREMENT;
data_
next
*S.top++= e;
return OK;
}//Push
Status Pop(SqStack &.s, SElemType &e){
//若栈不空,则删除 S 的栈顶元素,用 e返回其值,并返回
OK;否则返回 ERROR
if(S.top == S.base) return ERROR;
日
e =*--S.top;
return OK;
}// Pop
(3)应用
- 表达式求值——5*6+3
- 函数调用及递归实现
- 深度优先搜索、回溯算法
2. 队列
是一种先进先出的线性表,只允许在表的一端进行插入,在另一端删除元素。允许插入的一端叫做队尾,允许删除的一端称为队头。
(1)定义:
typedef struct QNode{
int data ;
int *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
(2)算法:
Status QueueTraverse(LinkQueue Q, visit())
//从队头到队尾依次对队列 Q中每个元素调用函数 visit()。一旦 viait失败,则操作失败。
//-----基本操作的算法描述(部分)'叫是-
Status InitQueue (LinkQueue &o){
/构造一个空队列 Q
Q.front = Q.rear =(QueuePtr)malloc(sizeof(QNode));
if(1Q.front)exit(OVERFLOW);
Q.front,->next = muul:
return ok;
//存储分配失败
}
Status DestroyQueue (Linkqueue &o){
//销毁队列Q
while (Q.front){
Q.rear = Q.front ->next;
free (Q.front);
Q.front = Q.rear;
return OK;
}
Status EnQueue (LinkQueue &Q, QElemType e){
//插入元素 e 为Q的新的队尾元素
p =(QueuePtr) malloc (sizeof (QNode));
i(!P) exit(OVERFLOW);
/存储分配失败
p->data = e; p->next = NULL;
Q.rear->next = p;
插人
Q.rear = P;
return OK;
}
Status DeQueue (LinkQueue &Q, QEIemType &.e){
//若队列不空,则删除Q的队头元素,用e返回其值,并返回 OK;
//否则返回 ERROR
Af(Q.front ==Q.rear) return ERROR;
p= Q.front->next;
e = p->data;
Q.front ->next = p->next;
if(Q.rear ==p)Q.rear = Q.front;
free (p);
return OK;
}
(3)应用
多项式的加法
四、串
由零或多个字符组成的有限数列。
五、数组和广义表
六、树和二叉树
1. 概念和分类
度:孩子节点的个数
叶节点:没有孩子节点的节点
深度:节点的最大层次
2. 二叉树的遍历
(1)先序遍历
含义:先遍历父节点
- 递归遍历
- 非递归遍历(栈)
(2)中序遍历
含义:第二遍历父节点
- 递归遍历
void InOrder(BitTree T)
{
if(T!=NULL)
{
InOrder(T->l);
printf("%d\n",T->val);
InOrder(T->r)
}
}
- 非递归遍历
(3)后序遍历
含义:最后遍历父节点
(4)层序遍历(队列)
七、图
定义:图的结点关系可以是任意的,图中任意两个数据元素之间都可能相关。
八、动态存储管理
(发现自己整理的还不如大神整理的好)