"《算法导论》之‘线性表’":基于数组实现的单链表
2014-10-27 19:32
615 查看
对于单链表,我们大多时候会用指针来实现(可参考基于指针实现的单链表)。现在我们就来看看怎么用数组来实现单链表。
该结点包括了两个元素,其一是数据,另一个是指向下一个结点的“指针”(在这篇文章中实际上是指用于实现单链表的数组的下标。)
在内存中该数组的结构如下图:
BoostUnitTest.cpp
本篇博文的代码均托管到Taocode : http://code.taobao.org/p/datastructureandalgorithm/src/.
1. 定义单链表中结点的数据结构
typedef int ElementType; class NodeType { public: ElementType data; int next; };
该结点包括了两个元素,其一是数据,另一个是指向下一个结点的“指针”(在这篇文章中实际上是指用于实现单链表的数组的下标。)
2. 定义一个的数组
const int CAPACITY = 1024; NodeType node[CAPACITY];
在内存中该数组的结构如下图:
#define BOOST_TEST_MODULE LinkedList_Test_Module #include "stdafx.h" #include "D:\VSProject\Algorithm\List\LinkedList\SingleLinkedList_BasedOnArray\SingleLinkedList\SingleLinkedList\linkedlist.h" struct LinkedList_Fixture { public: LinkedList_Fixture() { testLinkedList = new LinkedList(); } ~LinkedList_Fixture() { delete testLinkedList; } LinkedList * testLinkedList; }; BOOST_FIXTURE_TEST_SUITE(LinkedList_Test_Suite, LinkedList_Fixture) BOOST_AUTO_TEST_CASE( LinkedList_Normal_Test ) { // isEmpty ------------------------------------------- BOOST_REQUIRE(testLinkedList->isEmpty() == true); // getLenOfList -------------------------------------- BOOST_REQUIRE(testLinkedList->getLenOfList() == 0); // findFreeNode -------------------------------------- BOOST_REQUIRE(testLinkedList->findFreeNode() == 0); // addNode & getNode --------------------------------- BOOST_REQUIRE(testLinkedList->addNode(0, 0) == true); BOOST_REQUIRE((testLinkedList->getNode(0)).data == 0); BOOST_REQUIRE((testLinkedList->getNode(0)).next == NULL_VALUE); BOOST_REQUIRE((testLinkedList->getNode(0)).isFree == false); BOOST_REQUIRE(testLinkedList->isEmpty() == false); BOOST_REQUIRE(testLinkedList->getLenOfList() == 1); BOOST_REQUIRE(testLinkedList->addNode(1, 2) == true); BOOST_REQUIRE((testLinkedList->getNode(1)).data == 2); BOOST_REQUIRE((testLinkedList->getNode(1)).next == NULL_VALUE); BOOST_REQUIRE((testLinkedList->getNode(1)).isFree == false); BOOST_REQUIRE(testLinkedList->isEmpty() == false); BOOST_REQUIRE(testLinkedList->getLenOfList() == 2); BOOST_REQUIRE(testLinkedList->addNode(1, 1) == true); BOOST_REQUIRE((testLinkedList->getNode(1)).data == 1); BOOST_REQUIRE((testLinkedList->getNode(1)).next != NULL_VALUE); BOOST_REQUIRE((testLinkedList->getNode(1)).isFree == false); BOOST_REQUIRE((testLinkedList->getNode(2)).next == NULL_VALUE); BOOST_REQUIRE(testLinkedList->isEmpty() == false); BOOST_REQUIRE(testLinkedList->getLenOfList() == 3); // deleteNode ----------------------------------------- BOOST_REQUIRE(testLinkedList->deleteNode(0) == true); BOOST_REQUIRE((testLinkedList->getNode(0)).data == 1); BOOST_REQUIRE(testLinkedList->getLenOfList() == 2); BOOST_REQUIRE(testLinkedList->deleteNode(1) == true); BOOST_REQUIRE((testLinkedList->getNode(0)).data == 1); BOOST_REQUIRE(testLinkedList->getLenOfList() == 1); BOOST_REQUIRE(testLinkedList->deleteNode(0) == true); BOOST_REQUIRE(testLinkedList->getLenOfList() == 0); // initList ------------------------------------------- int arr[] = { 0, 1, 2 }; int len = sizeof(arr) / sizeof(int); testLinkedList->initList(arr, len); BOOST_REQUIRE(testLinkedList->getLenOfList() == 3); BOOST_REQUIRE((testLinkedList->getNode(0)).data == 0); BOOST_REQUIRE((testLinkedList->getNode(0)).next == 1); BOOST_REQUIRE((testLinkedList->getNode(1)).data == 1); BOOST_REQUIRE((testLinkedList->getNode(1)).next == 2); BOOST_REQUIRE((testLinkedList->getNode(2)).data == 2); BOOST_REQUIRE((testLinkedList->getNode(2)).next == NULL_VALUE); } BOOST_AUTO_TEST_CASE(LinkedList_Abnormal_Test) { int arr[] = { 0, 1, 2 }; int len = sizeof(arr) / sizeof(int); testLinkedList->initList(arr, len); // addNode ------------------------------------------- BOOST_REQUIRE_THROW(testLinkedList->addNode(-1, 100), out_of_range); BOOST_REQUIRE_THROW(testLinkedList->addNode(10, 100), out_of_range); // deleteNode ---------------------------------------- BOOST_REQUIRE_THROW(testLinkedList->deleteNode(-1), out_of_range); BOOST_REQUIRE_THROW(testLinkedList->deleteNode(10), out_of_range); // getNode -------------------------------------------- BOOST_REQUIRE_THROW(testLinkedList->getNode(-1), out_of_range); BOOST_REQUIRE_THROW(testLinkedList->getNode(10), out_of_range); } BOOST_AUTO_TEST_SUITE_END()
BoostUnitTest.cpp
本篇博文的代码均托管到Taocode : http://code.taobao.org/p/datastructureandalgorithm/src/.
相关文章推荐
- "《算法导论》之‘线性表’":基于静态分配的数组的顺序表
- "《算法导论》之‘线性表’":基于动态分配的数组的顺序表
- "《算法导论》之‘线性表’":基于指针实现的单链表
- 基于数组和基于链表线性表C++实现
- "《算法导论》之‘栈’":栈的三种实现(静态数组、动态数组及指针)
- "《算法导论》之‘队列’":队列的三种实现(静态数组、动态数组及指针)
- "《算法导论》之‘线性表’":双向循环链表
- 队列基于链表和数组的实现方法(java)
- 基于数组和链表的队列实现
- 基于数组实现顺序存储的线性表
- mysql存储过程以"数组"形式入参实现表间复制 并实现回滚
- 基于数组和链表两种方式实现栈
- 基于数组和链表的栈实现
- Python 使用由单链表构建的数组实现有边际优先队列 (基于class, 包含迭代器)
- 线性表的2种实现方式:数组和链表
- [Android App]IFCTT,即:If Copy Then That,一个基于IFTTT的"This"实现
- 基于结构体数组的链表实现
- 栈基于数组和链表的实现方式(java)
- Objective-C实现一个基于数组下标[index]和字典[@"key"]的访问模式
- 基于数组或链表的堆栈实现