大话数据结构(1)

阅读可以是一件主动的事,阅读越主动,效果越好。
1.理解记忆
2.练习
3.运用

1.绪论
数据元素{数据项1、数据项2...}
数据对象:是性质相同的数据元素的集合,是数据的子集。
数据结构:不同数据元素之间不是独立的,而是存在特定关系
逻辑结构:数据对象中数据元素之间的相互关系
    集合结构
    线性结构:一对一
    树形结构:一对多
    图形结构:多对多
物理结构:数据的逻辑结构在计算机的存储形式
    顺序存储结构:把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系一致的
    链式存储结构:把数据元素存放在任意的存储单元里,存储关系不能反映其逻辑关系
逻辑结构面向问题的,物理结构面向计算机的,其基本目标是将数据及其逻辑关系存储到计算机的内存中。    
抽象数据结构类型
    原子类型:是不可以再 分解的基本类型,例如:整型、实型。
    结构类型:由若干个类型组合而成,是可以再分解的。例如:整形数组
    抽象:抽取事物的普遍性本质。
    抽象数据类型(Abstract Data Type):一个数学模型及定义在该模型上的一组操作。

2.算法
求和:这样写是不是真的很好
同一个问题,可以有多种解决问题的算法,尽管算法不唯一,相对好的算法还是存在的。
好的算法
    正确性
    可读性
    健壮性:输入数据不合法,也能做相关处理
    时间效率高和存储量低
事前分析估算法
    一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入量的多少。
    T(n) = O(f(n))        n为问题的规模
    S(n) = O(f(n))
大O记号(得到大O阶)
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数
常数阶、线性阶、对数阶、平方阶
通常,我们提到的运行时间都是最坏情况的运行时间。

3.线性表:零个或多个数据元素的有限序列
描述顺序存储结构需要三个属性:
    存储空间的起始位置
    线性表的最大存储容量
    线性表的当前长度
存取时间性能为O(1)。通常把具有这一特点的存储结构称为随机存取结构。
顺序存储结构的插入与删除

Status ClearList(LinkList *L)
{
    LinkList p,q;
    p = (*L)->next;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    (*L)->next = NULL;
    return OK;
}

单链表结构和顺序存储结构做对比:
存储分配方式、时间性能、空间性能

线性表的双向链表存储结构
typedef struct DulNode
{
    Elemtype data;
    struct DulNode *prior;
    struct DulNode *next;
} DulNode, *DuLinkList;


栈与队列
栈的结构定义:
typedef int SElemType;
typedef struct
{
    SElemType data[MAXSIZE];
    int top;    //用于栈顶指针
}SqStack;

//进栈操作push 插入元素e为新的栈顶元素
Status Push(SqStack *S, SElemType e)
{
    if(S->top == MAXSIZE - 1)
    {
        return ERROR;
    }
    S->top++;
    S->data[S->top] = e;
    return OK;
}

//出栈操作pop
Status Pop(SqStack *S, SElemType * e) //用e返回其值
{
    if(S->top == -1)
    {
        return ERROR;
    }
    *e = S->data[S->top];
    S->top --;
    return OK;
}


//两栈共享空间结构
typedef struct
{
    SEleType data[MAXSIZE];
    int top1; /*栈1 栈顶指针*/
    int top2; /*栈2 栈顶指针*/
};

//斐波那契递归
int Fbi(int i)
{
    if(i<2)
    {
        return i == 0 ? 0 : 1;
    }
    return Fbi(i-1)+Fib(i-2);
}

int main()
{
    int i;
    for(int i = 0; i < 40; i++)
    {
        printf("%d", Fbi(i));
    }
    return 0;
}

迭代与递归
迭代使用循环结构,递归使用选择结构(结构清晰,但消耗时间和内存)

int Index(String S, String T, int pos)
{
    int i = pos;
    
    int j = 1;
    while(i <= S[0] && j <= T[0])
    {
        if(S[i] == T[j])
        {
            ++i;
            ++j;
        }
        else
        {
            i = i - j + 2;
            j = 1;
        }
    }
    if(j > T[0])
        return i - T[0];
    else
        return 0;
}

//双亲表示法的节点结构定义代码
#define MAX_TREE_SIZE 100
typedef int TElemType;
typedef struct PTNode //节点结构
{
    TElemType data;
    int parent;
} PTNode;
typedef struct
{
    PTNode nodes[MAX_TREE_SIZE];
    int r, n;
} PTree;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值