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