您的位置:首页 > 其它

"《算法导论》之‘线性表’":基于数组实现的单链表

2014-10-27 19:32 615 查看
  对于单链表,我们大多时候会用指针来实现(可参考基于指针实现的单链表)。现在我们就来看看怎么用数组来实现单链表。

  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/.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: