阅读可以是一件主动的事,阅读越主动,效果越好。
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;