考研 408 数据结构
26 考研 408 数据结构
【一页纸背诵版】链表 + 树 + 图 + 排序 满分模板
考场直接默写,算法大题稳拿分
一、单链表(每年必考)
// 结构定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
1. 初始化(带头结点)
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
return true;
}
2. 按位插入(带头结点)
bool ListInsert(LinkList &L, int i, ElemType e){
if(i<1) return false;
LNode *p = L; int j=0;
while(p && j<i-1){ p=p->next; j++; }
if(!p) return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
3. 按位删除(带头结点)
bool ListDelete(LinkList &L, int i, ElemType &e){
if(i<1) return false;
LNode *p = L; int j=0;
while(p && j<i-1){ p=p->next; j++; }
if(!p || !p->next) return false;
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
4. 后插操作(万能)
bool InsertNextNode(LNode *p, ElemType e){
if(!p) return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
5. 链表逆序
void Reverse(LinkList &L){
LNode *p = L->next, *q;
L->next = NULL;
while(p){
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
二、二叉树(高频)
// 结构定义
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
1. 先序遍历
void PreOrder(BiTree T){
if(T){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
2. 中序遍历
void InOrder(BiTree T){
if(T){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
3. 后序遍历
void PostOrder(BiTree T){
if(T){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
4. 求树深度
int GetDepth(BiTree T){
if(!T) return 0;
int l = GetDepth(T->lchild);
int r = GetDepth(T->rchild);
return l>r ? l+1 : r+1;
}
5. 层次遍历
void LevelOrder(BiTree T){
if(!T) return;
Queue Q; InitQueue(Q);
EnQueue(Q, T);
while(!isEmpty(Q)){
DeQueue(Q, p);
visit(p);
if(p->lchild) EnQueue(Q,p->lchild);
if(p->rchild) EnQueue(Q,p->rchild);
}
}
三、图(必考)
// 邻接表结构
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
ElemType data;
ArcNode *firstarc;
}VNode, AdjList[MaxVex];
typedef struct{
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
1. DFS 深度优先
bool visited[MaxVex];
void DFS(ALGraph G, int v){
visit(v); visited[v]=true;
ArcNode *p = G.vertices[v].firstarc;
while(p){
int w = p->adjvex;
if(!visited[w]) DFS(G,w);
p = p->nextarc;
}
}
2. BFS 广度优先
void BFS(ALGraph G, int v){
visit(v); visited[v]=true;
Queue Q; InitQueue(Q); EnQueue(Q,v);
while(!isEmpty(Q)){
DeQueue(Q,u);
ArcNode *p = G.vertices[u].firstarc;
while(p){
int w = p->adjvex;
if(!visited[w]){
visit(w); visited[w]=true;
EnQueue(Q,w);
}
p=p->nextarc;
}
}
}
四、排序(必背)
1. 直接插入排序
void InsertSort(int A[], int n){
int i,j;
for(i=2; i<=n; i++){
A[0]=A[i];
for(j=i-1; A[j]>A[0]; j--)
A[j+1]=A[j];
A[j+1]=A[0];
}
}
2. 冒泡排序
void BubbleSort(int A[], int n){
int i,j;
for(i=0; i<n-1; i++){
bool flag=false;
for(j=n-1; j>i; j--)
if(A[j-1]>A[j]){
swap(A[j-1],A[j]); flag=true;
}
if(!flag) break;
}
}
3. 快速排序(最高频)
int Partition(int A[], int low, int high){
int pivot=A[low];
while(low<high){
while(low<high&&A[high]>=pivot) high--;
A[low]=A[high];
while(low<high&&A[low]<=pivot) low++;
A[high]=A[low];
}
A[low]=pivot;
return low;
}
void QuickSort(int A[], int low, int high){
if(low<high){
int pos=Partition(A,low,high);
QuickSort(A,low,pos-1);
QuickSort(A,pos+1,high);
}
}
4. 简单选择排序
void SelectSort(int A[], int n){
int i,j,min;
for(i=0; i<n-1; i++){
min=i;
for(j=i+1; j<n; j++)
if(A[j]<A[min]) min=j;
if(min!=i) swap(A[i],A[min]);
}
}
五、考场答题万能格式(满分格式)
-
算法思想(2 句话)
-
代码(直接默写上面模板)
-
复杂度分析
- 时间复杂度:O (?)
- 空间复杂度:O (?)

浙公网安备 33010602011771号