数据类型:原子、结构、抽象数据类型
数据结构(3):
数据对象,数据元素,数据项,
复杂度:
#静态分配
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
vs
链表)#c初始分配
L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize);
#c++初始分配
L.data = new ElemType(InitSize);
≈
其他操作):判断(i合法,满)、找到位置插入typedef struct LNOde{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
#顺序栈
typedef struct{
Elemtype data[MaxSize];
int top; 判断-1<=top<=MaxSize
}SqStack;
#初始化函数
S.top=-1;
#链栈
typedef struct Linknode{ //和链表相似,简直是一模一样
ElemType data;
struct Linknode *next;
}*LiStack
#顺序存储
typedef struct{
Elemtype data[MaxSize];
int front,rear; 空满:font+MaxSize-rear
}SqQueue;
#初始化
Q.rear=Q.front=0;
#链式存储
typedef strcut{
ELemtype data;
strcut LinkNode *next;
}LinkNode;
typedef struct{ //链队列需要定义两个节点
LinkNode *front,*rear; 从front出,从rear入
}LinkQueue;
#初始化
void InitQueue(LinkQueue Q){
Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode)); //首尾指向同一节点
Q.front->next=NULL;
}
串的数据元素:字符
存储:
#顺序
typedef struct{
char ch[MaxSize];
int length;
}SString;
基操:
模式匹配:暴力,KMP
**矩阵:**对称,三角,三对角,稀疏(三元组,十字链表)
广义表:
#顺序
index ---- a的孩子 2a和2a+1
#链式
typedef struct BiTNode{
Elemtype data;
struct BiTree *lchild,*rchild;
}BiTNode,*BiTree;
#先序:递归 PreOrder InOrder PostOrder
void PreOrder(BiTree T){
if(T!=NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
#void InOrder2(BiTree T){
InitStack(S);BiTress p=T;
while(p||!IsEmpty(S)){
if(p){
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);visit(p);
p=p->rchild;
}
}
}
void LevelOrder(BiTree T){
InitQueue(Q);BiTree p;
EnQueue(Q,T);
while(!IsEmpty(Q)){
DeQueue(Q,p);
visit(p);
if(p->lchild!=NULL) EnQueue(Q,p->lchild);
if(p->rchild!=NULL) EnQueue(Q,p->rchild);
}
}
#节点存储
typedef struct ThreadNode{
Elemtype data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
#中序
#二叉树线索化
void InThread(ThreadTree &p,ThreadTree &pre){
if(p!=NULL){
InThread(p->lchild,pre);
if(p->lchild){
p->lchild=pre;
p->ltag=1;
}
if(p->rchild&&pre!=NULL){
pre->rchild=p;
pre->rtag=1;
}
pre=p;
InThread(p->rchild,pre);
}
}
#建立
void CreateInThread(ThreadTree T){
if(T!=NULL){
InThread(T,pre);
pre->rchild=NULL;
pre->rtag=1;
}
}
二叉排序树(BST):
int BST_Insert(BiTree &T,KeyType k){
if(T==NULL){
T=(BiTree)malloc(sizeof(BSTNode));
T->data=k;
T->lchild=T->rchild=NULL;
return true;
}else if(k==T->key){
return false;
}else if(k>T->key){
return BST_Insert(T->rchild,k);
}else if(k<T->key){
return BST_Insert(T->lchild,k);
}
}
void Create_BST(BiTree &T,Keytype str[],int n){
T=NULL;
int i=0;
while(i<n){
BST_Insert(T,str[i]);
i++;
}
}
平衡二叉树:
哈夫曼树:
#双亲表示
typedef struct{
Elemtype data;
int parent;
}PTNode; //定义节点
typedef struct{
PTNode nodes[MaxSize];
int n; //节点数目
}PTree; //定义树
#孩子兄弟表示
typedef struct CSNode{
Elemtype data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
arc\vertex\ DAG(Directed Acyclic Graph)
存储:邻接矩阵法,邻接表法,十字链表vs
邻接多重表,
#邻接表法
typedef struct ArcNode{
int adjvex;
struct ArcNode *next;
//可以存边的权值
}ArcNode;
typedef struct VNode{
Vertextype data;
ArcNode *first;
}VNode,AdjList[MaxVertexNum];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
#伪代码
bool visited[MaxSize];
void BFSTraverse(Graph G){
for(i=0;i<G.vexnum;++i) visited[i]=false;
InitQueue(Q);
for(i=0;i<G.vexnum;++i){
if(!visited[i]) BFS(G,i);
}
}
void BFS(Graph G,int v){
visit(v);
visted[v]=true;
EnQueue(Q,v);
while(!IsEmpty(Q)){
DeQueue(Q,v);
for(w=FirstNeightbor(G,v);w>=0;w=NextNeightbor(G,v,w)){
if(!visited[w]){ //改为深度优先的话,只需要if结构体为DFS(G,w)
visit(w);
visited[w]=true;
EnQueue(Q,w);
}
}
}
}
#折半查找
int Binary_Search(SeqList L,Elemtype key){
int low=0,high=L.length-1,mid;
while(low<=high){
mid=(low+high)/2;
if(L.elem[mid]==key) return mid;
else if(L.elem[mid]>key) high=mid-1;
else low=mid+1;
}
return -1;
}
插入:直接插入,折半插入,希尔排序(不稳)
交换:冒泡,快排(不稳)
选择:简单选择(不稳),堆排序(不稳)
归并,基数(低位->高位)
外部:多路归并排序
外排:多路归并
败者树:
代码