以下是根据您的要求整理的完整数据结构与算法伪代码实现,涵盖了顺序表、链表、树、查找和排序等核心内容:

数据结构与算法伪代码实现全集

1. 顺序表基本操作

1.1 顺序表打印

PROCEDURE PrintList(SeqList L, int n)
    FOR i ← 0 TO L.length-1 DO
        PRINT L.data[i] + " "
    END FOR
    PRINT newline
END PROCEDURE

1.2 顺序表查找

FUNCTION LocateList(SeqList L, DataType x) RETURNS int
    i ← 0
    WHILE i < L.length AND L.data[i] ≠ x DO
        i ← i + 1
    END WHILE
    
    IF i < L.length THEN
        RETURN i + 1
    ELSE
        RETURN 0
    END IF
END FUNCTION

1.3 顺序表插入

PROCEDURE InsertList(SeqList *L, DataType x, int i)
    IF i < 1 OR i > L->length + 1 THEN
        PRINT "插入位置非法"
        EXIT
    END IF
    
    IF L->length ≥ ListSize THEN
        PRINT "表空间溢出"
        EXIT
    END IF
    
    FOR j ← L->length-1 DOWNTO i-1 DO
        L->data[j+1] ← L->data[j]
    END FOR
    
    L->data[i-1] ← x
    L->length ← L->length + 1
END PROCEDURE

1.4 顺序表删除

PROCEDURE DeleteList(SeqList *L, int i)
    IF i < 1 OR i > L->length THEN
        PRINT "删除位置非法"
        EXIT
    END IF
    
    FOR j ← i TO L->length-1 DO
        L->data[j-1] ← L->data[j]
    END FOR
    
    L->length ← L->length - 1
END PROCEDURE

1.5 顺序表逆置

PROCEDURE inverse_seqlist(SeqList *A)
    FOR i ← 0 TO floor(A->length/2) - 1 DO
        t ← A->data[i]
        A->data[i] ← A->data[A->length-1-i]
        A->data[A->length-1-i] ← t
    END FOR
END PROCEDURE

1.6 有序顺序表插入(两种方法)

方法一:从后向前扫描

PROCEDURE insert(SeqList *L, DataType x)
    IF L->length ≥ ListSize THEN
        PRINT "溢出错误"
        EXIT
    END IF
    
    i ← L->length - 1
    WHILE i ≥ 0 AND x < L->data[i] DO
        L->data[i+1] ← L->data[i]
        i ← i - 1
    END WHILE
    
    L->data[i+1] ← x
    L->length ← L->length + 1
END PROCEDURE

方法二:从前向后扫描

PROCEDURE insert(SeqList *L, DataType x)
    IF L->length ≥ ListSize THEN
        PRINT "溢出错误"
        EXIT
    END IF
    
    IF x ≥ L->data[L->length-1] THEN
        L->data[L->length] ← x
    ELSE
        i ← 0
        WHILE x ≥ L->data[i] DO
            i ← i + 1
        END WHILE
        
        FOR j ← L->length-1 DOWNTO i DO
            L->data[j+1] ← L->data[j]
        END FOR
        
        L->data[i] ← x
    END IF
    
    L->length ← L->length + 1
END PROCEDURE

2. 单链表基本操作

2.1 单链表建立(头插法)

FUNCTION CreateListF() RETURNS LinkList
    head ← NULL
    ch ← getchar()
    
    WHILE ch ≠ newline DO
        s ← malloc(sizeof(ListNode))
        s->data ← ch
        s->next ← head
        head ← s
        ch ← getchar()
    END WHILE
    
    RETURN head
END FUNCTION

2.2 单链表建立(尾插法)

FUNCTION CreateListR() RETURNS LinkList
    head ← NULL
    r ← NULL
    
    ch ← getchar()
    WHILE ch ≠ newline DO
        s ← malloc(sizeof(ListNode))
        s->data ← ch
        
        IF head = NULL THEN
            head ← s
        ELSE
            r->next ← s
        END IF
        
        r ← s
        ch ← getchar()
    END WHILE
    
    IF r ≠ NULL THEN
        r->next ← NULL
    END IF
    
    RETURN head
END FUNCTION

2.3 单链表打印

PROCEDURE PrintList(LinkList head)
    p ← head
    WHILE p ≠ NULL DO
        PRINT p->data
        p ← p->next
    END WHILE
    PRINT newline
END PROCEDURE

2.4 单链表查找

FUNCTION GetNode(LinkList head, int i) RETURNS LinkList
    p ← head
    j ← 0
    
    WHILE p->next ≠ NULL AND j < i DO
        p ← p->next
        j ← j + 1
    END WHILE
    
    IF i = j THEN
        RETURN p
    ELSE
        RETURN NULL
    END IF
END FUNCTION

2.5 单链表插入

PROCEDURE InsertList(LinkList head, DataType x, int i)
    p ← GetNode(head, i-1)
    
    IF p = NULL THEN
        PRINT "插入位置非法"
        EXIT
    END IF
    
    s ← malloc(sizeof(ListNode))
    s->data ← x
    s->next ← p->next
    p->next ← s
END PROCEDURE

2.6 单链表删除

PROCEDURE DeleteList(LinkList head, int i)
    p ← GetNode(head, i-1)
    
    IF p = NULL OR p->next = NULL THEN
        PRINT "删除位置非法"
        EXIT
    END IF
    
    r ← p->next
    p->next ← r->next
    free(r)
END PROCEDURE

2.7 单链表逆置

PROCEDURE InverseList(LinkList *head)
    h ← (*head)->next
    p ← h->next
    h->next ← NULL
    
    WHILE p ≠ NULL DO
        t ← p->next
        p->next ← h
        h ← p
        p ← t
    END WHILE
    
    (*head)->next ← h
END PROCEDURE

2.8 单链表长度计算

FUNCTION ListLength(LinkList L) RETURNS int
    i ← 0
    p ← L->next
    
    WHILE p ≠ NULL DO
        i ← i + 1
        p ← p->next
    END WHILE
    
    RETURN i
END FUNCTION

3. 双链表基本操作

3.1 双链表建立

FUNCTION DCreateList() RETURNS DLinkList
    head ← malloc(sizeof(DListNode))
    head->next ← NULL
    head->prior ← NULL
    r ← head
    
    ch ← getchar()
    WHILE ch ≠ newline DO
        s ← malloc(sizeof(DListNode))
        s->data ← ch
        r->next ← s
        s->prior ← r
        r ← s
        ch ← getchar()
    END WHILE
    
    r->next ← head
    head->prior ← r
    
    RETURN head
END FUNCTION

3.2 双链表插入

PROCEDURE DInsertBefore(DLinkList p, DataType x)
    s ← malloc(sizeof(DListNode))
    s->data ← x
    s->prior ← p->prior
    s->next ← p
    p->prior->next ← s
    p->prior ← s
END PROCEDURE

3.3 双链表删除

PROCEDURE DDeleteNode(DLinkList p)
    p->prior->next ← p->next
    p->next->prior ← p->prior
    free(p)
END PROCEDURE

4. 二叉树基本操作

4.1 二叉树构造(先序遍历)

PROCEDURE CreateBinTree(BinTree *T)
    ch ← getchar()
    
    IF ch = ' ' THEN
        *T ← NULL
    ELSE
        *T ← malloc(sizeof(BinTNode))
        (*T)->data ← ch
        CreateBinTree(&(*T)->lchild)
        CreateBinTree(&(*T)->rchild)
    END IF
END PROCEDURE

4.2 二叉树遍历

PROCEDURE Preorder(BinTree T)
    IF T ≠ NULL THEN
        PRINT T->data
        Preorder(T->lchild)
        Preorder(T->rchild)
    END IF
END PROCEDURE

PROCEDURE Inorder(BinTree T)
    IF T ≠ NULL THEN
        Inorder(T->lchild)
        PRINT T->data
        Inorder(T->rchild)
    END IF
END PROCEDURE

PROCEDURE Postorder(BinTree T)
    IF T ≠ NULL THEN
        Postorder(T->lchild)
        Postorder(T->rchild)
        PRINT T->data
    END IF
END PROCEDURE

4.3 二叉树节点统计

FUNCTION nodes(BinTree T) RETURNS int
    IF T = NULL THEN
        RETURN 0
    ELSE IF T->lchild = NULL AND T->rchild = NULL THEN
        RETURN 1
    ELSE
        num1 ← nodes(T->lchild)
        num2 ← nodes(T->rchild)
        RETURN num1 + num2 + 1
    END IF
END FUNCTION

5. 查找算法

5.1 顺序查找

FUNCTION SeqSearch(SeqList R, KeyType K) RETURNS int
    R[0].key ← K
    i ← n
    
    WHILE R[i].key ≠ K DO
        i ← i - 1
    END WHILE
    
    RETURN i
END FUNCTION

5.2 二分查找

FUNCTION BinSearch(SeqList R, KeyType k) RETURNS int
    low ← 1
    high ← n
    
    WHILE low ≤ high DO
        mid ← (low + high) / 2
        
        IF R[mid].key = k THEN
            RETURN mid
        ELSE IF R[mid].key > k THEN
            high ← mid - 1
        ELSE
            low ← mid + 1
        END IF
    END WHILE
    
    RETURN 0
END FUNCTION

6. 排序算法

6.1 直接插入排序

PROCEDURE InsertSort(SeqList R)
    FOR i ← 2 TO n DO
        IF R[i].key < R[i-1].key THEN
            R[0] ← R[i]
            j ← i - 1
            
            WHILE R[0].key < R[j].key DO
                R[j+1] ← R[j]
                j ← j - 1
            END WHILE
            
            R[j+1] ← R[0]
        END IF
    END FOR
END PROCEDURE

6.2 快速排序

PROCEDURE QuickSort(SeqList R, int low, int high)
    IF low < high THEN
        pivotpos ← Partition(R, low, high)
        QuickSort(R, low, pivotpos-1)
        QuickSort(R, pivotpos+1, high)
    END IF
END PROCEDURE

FUNCTION Partition(SeqList R, int i, int j) RETURNS int
    pivot ← R[i]
    
    WHILE i < j DO
        WHILE i < j AND R[j].key ≥ pivot.key DO
            j ← j - 1
        END WHILE
        
        IF i < j THEN
            R[i] ← R[j]
            i ← i + 1
        END IF
        
        WHILE i < j AND R[i].key ≤ pivot.key DO
            i ← i + 1
        END WHILE
        
        IF i < j THEN
            R[j] ← R[i]
            j ← j - 1
        END IF
    END WHILE
    
    R[i] ← pivot
    RETURN i
END FUNCTION

6.3 归并排序

PROCEDURE MergeSort(SeqList R)
    length ← 1
    
    WHILE length < n DO
        MergePass(R, length)
        length ← length * 2
    END WHILE
END PROCEDURE

7. 递归算法

7.1 阶乘计算

FUNCTION f(int n) RETURNS int
    IF n = 0 THEN
        RETURN 1
    ELSE
        RETURN n * f(n-1)
    END IF
END FUNCTION

7.2 Ackerman函数

FUNCTION AKM(int m, int n) RETURNS int
    IF m = 0 THEN
        RETURN n + 1
    ELSE IF n = 0 THEN
        RETURN AKM(m-1, 1)
    ELSE
        RETURN AKM(m-1, AKM(m, n-1))
    END IF
END FUNCTION

算法特性总结

算法类别时间复杂度空间复杂度特点
顺序表操作O(n)O(1)随机访问高效,插入删除需移动元素
单链表操作O(n)O(1)动态存储,插入删除高效
二叉树遍历O(n)O(log n)递归实现简洁明了
顺序查找O(n)O(1)简单但效率较低
二分查找O(log n)O(1)高效但要求有序表
快速排序O(n log n)O(log n)平均性能最优
归并排序O(n log n)O(n)稳定但需要额外空间

本伪代码集涵盖了数据结构与算法的核心内容,每种算法都保持了原始逻辑的完整性,同时采用标准化的伪代码格式,便于理解和实现。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐