【C/C++】数据结构与算法(ing)

一、线性表

概念: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)层序遍历(队列)

 

七、图

定义:图的结点关系可以是任意的,图中任意两个数据元素之间都可能相关。

八、动态存储管理

(发现自己整理的还不如大神整理的好)

 数据结构与算法_Java攻城狮-CSDN博客_常见数据结构与算法整理总结https://blog.csdn.net/guorui_java/article/details/106217472?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163532931416780366561795%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163532931416780366561795&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-9-106217472.pc_search_result_control_group&utm_term=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187

(15条消息) 数据结构与算法学习笔记_ityqing的博客-CSDN博客_数据结构与算法https://blog.csdn.net/ityqing/article/details/82838524?spm=1001.2014.3001.5506

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁荣生长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值