考研 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]);
    }
}

五、考场答题万能格式(满分格式)

  1. 算法思想(2 句话)

  2. 代码(直接默写上面模板)

  3. 复杂度分析

    • 时间复杂度:O (?)
    • 空间复杂度:O (?)
posted @ 2026-05-13 18:26  轻狂书生han  阅读(19)  评论(0)    收藏  举报