静态链表代码设计

静态链表在我看来是一种比较高级的线性存储结构,融合了顺序表和链表的优点,既能快速访问元素,又能快速增加或删除数据元素。静态链表存储数据,数据全部存储在数组中(此处类似顺序表),但存储位置是随机的,数据之间"的逻辑关系通过一个整形变量——next进行维持(此处理类似链表)。

功能如下:

  • initLinkedList() :初始化静态链表。
  • printList():打印静态链表数据。
  • insertElement():向静态链表指定位置插入数据。
  • deleteElement():删除静态链表中的数据。
  • 新增outputMemory():打印链表结点的数据和地址。
  • **
     * Print the address of the list.
     * @param paraListPtr The pointer to the list.
     */
    void outputMemory(ListPtr paraListPtr) {
        int p = 0;
        while (p != -1) {
            cout << "The position " << p << "'node'value is " << paraListPtr->nodes[p].data << ",the position " << p
                 << "'node'address is " << &paraListPtr->nodes[p] << endl;
            p = paraListPtr->nodes[p].next;
        }// Of while
        cout << endl;
    }// Of printList
    完整代码如下:
    //
    // Created by Caka on 2023/4/5.
    //
    #include <iostream>
    
    using namespace std;
    
    const int DEFAULT_SIZE = 6;
    
    typedef struct StaticLinkedNode {
        char data;
        int next;
    } *NodePtr;
    
    typedef struct StaticLinkedList {
        NodePtr nodes;
        int *used;
    } *ListPtr;
    
    /**
     * Initialize the list with a header.
     * @return The pointer to the header.
     */
    ListPtr initLinkedList() {
        // The pointer to the whole list space.
        ListPtr tempPtr = (ListPtr) malloc(sizeof(struct StaticLinkedList));
    
        // Allocate total space.
        tempPtr->nodes = (NodePtr) malloc(sizeof(struct StaticLinkedNode) * DEFAULT_SIZE);
        tempPtr->used = (int *) malloc(sizeof(int) * DEFAULT_SIZE);
    
        // The first node is the header.
        tempPtr->nodes[0].data = '\0';
        tempPtr->nodes[0].next = -1;
    
        // Only the first node is used.
        tempPtr->used[0] = 1;
        for (int i = 1; i < DEFAULT_SIZE; i++) {
            tempPtr->used[i] = 0;
        }// Of for i
    
        return tempPtr;
    }// Of initLinkedList
    
    /**
     * Print the list.
     * @param paraListPtr The pointer to the list.
     */
    void printList(ListPtr paraListPtr) {
        int p = 0;
        while (p != -1) {
            cout << paraListPtr->nodes[p].data;
            p = paraListPtr->nodes[p].next;
        }// Of while
        cout << endl;
    }// Of printList
    
    /**
     * Print the address of the list.
     * @param paraListPtr The pointer to the list.
     */
    void outputMemory(ListPtr paraListPtr) {
        int p = 0;
        while (p != -1) {
            cout << "The position " << p << "'node'value is " << paraListPtr->nodes[p].data << ",the position " << p
                 << "'node'address is " << &paraListPtr->nodes[p] << endl;
            p = paraListPtr->nodes[p].next;
        }// Of while
        cout << endl;
    }// Of printList
    
    /**
     * Insert an element to the given position.
     * @param paraListPtr The position of the list.
     * @param paraChar The given char.
     * @param paraPosition The given position.
     */
    void insertElement(ListPtr paraListPtr, char paraChar, int paraPosition) {
        int p, q, i;
    
        // Step 1. Search to the position.
        p = 0;
        for (i = 0; i < paraPosition; i++) {
            p = paraListPtr->nodes[p].next;
            if (p == -1) {
                cout << "The position " << paraPosition << "is beyond the scope of the list." << endl;
                return;
            }// Of if
        } // Of for i
    
        // Step 2. Construct a new node.
        for (i = 1; i < DEFAULT_SIZE; i++) {
            if (paraListPtr->used[i] == 0) {
                // This is identical to malloc.
                cout << "Space at " << i << " allocated..." << endl;
                paraListPtr->used[i] = 1;
                q = i;
                break;
            }// Of if
        }// Of for i
        if (i == DEFAULT_SIZE) {
            cout << "No space." << endl;
            return;
        }// Of if
    
        paraListPtr->nodes[q].data = paraChar;
    
        // Step 3. Now link.
        cout << "linking " << paraChar << "..." << endl;
        paraListPtr->nodes[q].next = paraListPtr->nodes[p].next;
        paraListPtr->nodes[p].next = q;
    }// Of insertElement
    
    /**
     * Delete an element from the list.
     * @param paraHeader The header of the list.
     * @param paraChar The given char.
     */
    void deleteElement(ListPtr paraListPtr, char paraChar) {
        int p, q;
        p = 0;
        while ((paraListPtr->nodes[p].next != -1) && (paraListPtr->nodes[paraListPtr->nodes[p].next].data != paraChar)) {
            p = paraListPtr->nodes[p].next;
        }// Of while
    
        if (paraListPtr->nodes[p].next == -1) {
            cout << "Cannot delete " << paraChar << endl;
            return;
        }// Of if
    
        q = paraListPtr->nodes[p].next;
        paraListPtr->nodes[p].next = paraListPtr->nodes[paraListPtr->nodes[p].next].next;
    
        // This statement is identical to free(q)
        paraListPtr->used[q] = 0;
    }// Of deleteElement
    
    /**
     * The entrance.
     */
    int main() {
        cout << "---- StaticLinkedListTest begins. ---- " << endl;
    
        // Step 1. Initialize an empty list.
        ListPtr tempList = initLinkedList();
        printList(tempList);
        outputMemory(tempList);
    
        // Step 2. Add some characters.
        insertElement(tempList, 'H', 0);
        insertElement(tempList, 'e', 1);
        insertElement(tempList, 'l', 2);
        insertElement(tempList, 'l', 3);
        insertElement(tempList, 'o', 4);
        insertElement(tempList, '!', 5);
        printList(tempList);
        outputMemory(tempList);
    
        // Step 3. Delete some characters (the first occurrence).
        cout << "Deleting 'e'." << endl;
        deleteElement(tempList, 'e');
        cout << "Deleting 'a'." << endl;
        deleteElement(tempList, 'a');
        cout << "Deleting 'o'." << endl;
        deleteElement(tempList, 'o');
        printList(tempList);
        outputMemory(tempList);
    
        insertElement(tempList, 'x', 1);
        printList(tempList);
        outputMemory(tempList);
    
        cout << "---- StaticLinkedListTest begins. ---- " << endl;
        return 0;
    }// Of main
    

    运行结果如下:

    ---- StaticLinkedListTest begins. ----
    
    The position 0'node'value is  ,the position 0'node'address is 0x6a1670
    
    Space at 1 allocated...
    linking H...
    Space at 2 allocated...
    linking e...
    Space at 3 allocated...
    linking l...
    Space at 4 allocated...
    linking l...
    Space at 5 allocated...
    linking o...
    No space.
     Hello
    The position 0'node'value is  ,the position 0'node'address is 0x6a1670
    The position 1'node'value is H,the position 1'node'address is 0x6a1678
    The position 2'node'value is e,the position 2'node'address is 0x6a1680
    The position 3'node'value is l,the position 3'node'address is 0x6a1688
    The position 4'node'value is l,the position 4'node'address is 0x6a1690
    The position 5'node'value is o,the position 5'node'address is 0x6a1698
    
    Deleting 'e'.
    Deleting 'a'.
    Cannot delete a
    Deleting 'o'.
     Hll
    The position 0'node'value is  ,the position 0'node'address is 0x6a1670
    The position 1'node'value is H,the position 1'node'address is 0x6a1678
    The position 3'node'value is l,the position 3'node'address is 0x6a1688
    The position 4'node'value is l,the position 4'node'address is 0x6a1690
    
    Space at 2 allocated...
    linking x...
     Hxll
    The position 0'node'value is  ,the position 0'node'address is 0x6a1670
    The position 1'node'value is H,the position 1'node'address is 0x6a1678
    The position 2'node'value is x,the position 2'node'address is 0x6a1680
    The position 3'node'value is l,the position 3'node'address is 0x6a1688
    The position 4'node'value is l,the position 4'node'address is 0x6a1690
    
    ---- StaticLinkedListTest begins. ----
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值