数据结构实验考试
1. 二叉树遍历算法
1.1 先序遍历
Status PreOrderTraverse(BiTree T) {
    if(T == NULL) return OK;        // 空二叉树
    else {
        cout << T->data;            // 访问根结点
        PreOrderTraverse(T->lchild); // 递归遍历左子树
        PreOrderTraverse(T->rchild); // 递归遍历右子树
    }
}
1.2 中序遍历
Status InOrderTraverse(BiTree T) {
    if(T == NULL) return OK;        // 空二叉树
    else {
        InOrderTraverse(T->lchild);  // 递归遍历左子树
        cout << T->data;            // 访问根结点
        InOrderTraverse(T->rchild);  // 递归遍历右子树
    }
}
1.3 后序遍历
Status PostOrderTraverse(BiTree T) {
    if(T == NULL) return OK;         // 空二叉树
    else {
        PostOrderTraverse(T->lchild); // 递归遍历左子树
        PostOrderTraverse(T->rchild); // 递归遍历右子树
        cout << T->data;             // 访问根结点
    }
}
2. 哈夫曼树相关算法
2.1 哈夫曼树初始化
void CreateHuffmanTree(HuffmanTree& HT, int n) {
    if (n <= 1) return;
    m = 2 * n - 1;
    HT = new HTNode[m + 1];
    
    for (i = 1; i <= m; ++i) {
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    
    cout << "请输入叶子结点的权值:\n";
    for (i = 1; i <= n; ++i)
        cin >> HT[i].weight;
}
2.2 哈夫曼编码构造
void CreatHuffmanCode(HuffmanTree HT, HuffmanCode& HC, int n) {
    int i, start, c, f;
    HC = new char* [n + 1];
    char* cd = new char[n];
    cd[n - 1] = '\0';
    
    for (i = 1; i <= n; ++i) {
        start = n - 1;
        c = i;
        f = HT[i].parent;
        
        while (f != 0) {
            --start;
            if (HT[f].lchild == c)
                cd[start] = '0';
            else
                cd[start] = '1';
            c = f;
            f = HT[f].parent;
        }
        
        HC[i] = new char[n - start];
        strcpy(HC[i], &cd[start]);
    }
}
2.3 哈夫曼译码
void HuffmanDecode(HuffmanTree tree, char* bitstreame) {
    int i, j = 0;
    char endflag = '\0';
    int m = tree[0].data;
    i = m;
    
    printf("译码后的字符为:");
    while (bitstreame[j] != endflag) {
        if (bitstreame[j] == '0')
            i = tree[i].lchild;
        else
            i = tree[i].rchild;
            
        if (tree[i].lchild == 0) {
            printf("%d", tree[i].data);
            i = m;
        }
        j++;
    }
    printf("\n");
}
3. 图相关算法
3.1 邻接矩阵创建无向网
Status CreateUDN(AMGraph &G) {
    cin >> G.vexnum >> G.arcnum;
    
    for(i = 0; i < G.vexnum; ++i)
        cin >> G.vexs[i];
        
    for(i = 0; i < G.vexnum; ++i)
        for(j = 0; j < G.vexnum; ++j)
            G.arcs[i][j] = MaxInt;
            
    for(k = 0; k < G.arcnum; ++k) {
        cin >> v1 >> v2 >> w;
        i = LocateVex(G, v1);
        j = LocateVex(G, v2);
        G.arcs[i][j] = w;
        G.arcs[j][i] = G.arcs[i][j];
    }
    return OK;
}
3.2 DFS算法
void DFS(ALGraph G, int v) {
    cout << v;
    visited[v] = true;
    p = G.vertices[v].firstarc;
    
    while(p != NULL) {
        w = p->adjvex;
        if(!visited[w])
            DFS(G, w);
        p = p->nextarc;
    }
}
3.3 BFS算法
void BFS(Graph G, int v) {
    cout << v;
    visited[v] = true;
    InitQueue(Q);
    EnQueue(Q, v);
    
    while(!QueueEmpty(Q)) {
        DeQueue(Q, u);
        for(w = FirstAdjVex(G, u); w >= 0; w = NextAdjVex(G, u, w))
            if(!visited[w]) {
                cout << w;
                visited[w] = true;
                EnQueue(Q, w);
            }
    }
}
4. 排序算法
4.1 直接插入排序
void InsertSort(SqList &L) {
    for(i = 2; i <= L.length; ++i)
        if(L.r[i].key < L.r[i-1].key) {
            L.r[0] = L.r[i];
            L.r[i] = L.r[i-1];
            for(j = i-2; L.r[0].key < L.r[j].key; --j)
                L.r[j+1] = L.r[j];
            L.r[j+1] = L.r[0];
        }
}
4.2 折半查找排序
// 折半查找部分
low = 1;
high = i-1;
while (low <= high) {
    mid = (low + high) / 2;
    if (L.r[0].key < L.r[mid].key)
        high = mid - 1;
    else
        low = mid + 1;
}
for (j = i-1; j >= high+1; --j)
    L.r[j+1] = L.r[j];
L.r[high+1] = L.r[0];
4.3 希尔排序
void ShellInsert(SqList &L, int dk) {
    for(i = dk+1; i <= L.length; ++i)
        if(L.r[i].key < L.r[i-dk].key) {
            L.r[0] = L.r[i];
            for(j = i-dk; j > 0 && (L.r[0].key < L.r[j].key); j -= dk)
                L.r[j+dk] = L.r[j];
            L.r[j+dk] = L.r[0];
        }
}
void ShellSort(SqList &L, int dlta[], int t) {
    for(k = 0; k < t; ++k)
        ShellInsert(L, dlta[k]);
}
4.4 改进冒泡排序
void BubbleSort(SqList &L) {
    m = L.length - 1;
    flag = 1;
    while((m > 0) && (flag == 1)) {
        flag = 0;
        for(j = 1; j <= m; j++)
            if(L.r[j].key > L.r[j+1].key) {
                flag = 1;
                t = L.r[j];
                L.r[j] = L.r[j+1];
                L.r[j+1] = t;
            }
        --m;
    }
}
4.5 快速排序
int Partition(SqList &L, int low, int high) {
    L.r[0] = L.r[low];
    pivotkey = L.r[low].key;
    while(low < high) {
        while(low < high && L.r[high].key >= pivotkey)
            --high;
        L.r[low] = L.r[high];
        while(low < high && L.r[low].key <= pivotkey)
            ++low;
        L.r[high] = L.r[low];
    }
    L.r[low] = L.r[0];
    return low;
}
void QSort(SqList &L, int low, int high) {
    if(low < high) {
        pivotloc = Partition(L, low, high);
        QSort(L, low, pivotloc-1);
        QSort(L, pivotloc+1, high);
    }
}
4.6 简单选择排序
void SelectSort(RecType R[], int n) {
    int i, j, k;
    for(i = 0; i < n-1; i++) {
        k = i;
        for(j = i+1; j < n; j++)
            if(R[j].key < R[k].key)
                k = j;
        if(k != i) {
            copyNK(R[k], temp);
            for(j = k; j > i; j--)
                copyNK(R[k-1], R[k]);
            copyNK(temp, R[i]);
        }
    }
}
5. 查找算法
5.1 线性表查找
int LocateELem(SqList L, ElemType e) {
    for(i = 0; i < L.length; i++)
        if(L.elem[i] == e)
            return i+1;
    return 0;
}
int Search_Seq(SSTable ST, KeyType key) {
    ST.R[0].key = key;
    for(i = ST.length; ST.R[i].key != key; --i);
    return i;
}
5.2 折半查找
int Search_Bin(SSTable ST, KeyType key) {
    low = 1;
    high = ST.length;
    while(low <= high) {
        mid = (low + high) / 2;
        if(key == ST.R[mid].key)
            return mid;
        else if(key < ST.R[mid].key)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return 0;
}
5.3 二叉排序树操作
5.3.1 插入操作
void InsertBST(BSTree &T, ElemType e) {
    if(!T) {
        BSTree S = new BSTNode;
        S->data = e;
        S->lchild = S->rchild = NULL;
        T = S;
    }
    else if(e.key < T->data.key)
        InsertBST(T->lchild, e);
    else if(e.key > T->data.key)
        InsertBST(T->rchild, e);
}
5.3.2 生成二叉排序树
void CreateBST(BSTree &T) {
    T = NULL;
    ElemType e;
    cin >> e.key;
    while(e.key != ENDFLAG) {
        InsertBST(T, e);
        cin >> e.key;
    }
}
5.4 哈希表查找
int SearchHash(HashTable HT[], int key) {
    int H0 = H(key);
    if(HT[H0].key == NULLKEY)
        return -1;
    else if(HT[H0].key == key)
        return H0;
    else {
        for(int i = 1; i < m; ++i) {
            Hi = (H0 + i) % m;
            if(HT[Hi].key == NULLKEY)
                return -1;
            else if(HT[Hi].key == key)
                return Hi;
        }
        return -1;
    }
}