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

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

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生态繁荣发展。

更多推荐