線性表是一種線性結構,它是具有相同類型的n(n≥0)個數據元素組成的有限序列。
一、數組
數組有上界和下界,數組的元素在上下界內是連續的。
存儲10,20,30,40,50的數組的示意圖如下:
數組的特點:數據是連續的;隨機訪問速度快。
數組中稍微複雜一點的是多維數組和動態數組。對於C語言而言,多維數組本質上也是通過一維數組實現的。至於動態數組,是指數組的容量能動態增長的數組;對於C語言而言,若要提供動態數組,需要手動實現;而對於C++而言,STL提供了Vector;對於Java而言,Collection集合中提供了ArrayList和Vector。
二、單向鍊錶<br />單向鍊錶(單鍊錶)是鍊錶的一種,它由節點組成,每個節點都包含下一個節點的指針。
單鍊錶的示意圖如下:
表頭為空,表頭的後繼節點是"節點10"(數據為10的節點),"節點10"的後繼節點是"節點20"(數據為10的節點),...
單鍊錶刪除節點
刪除"節點30"
刪除之前:"節點20" 的後繼節點為"節點30",而"節點30" 的後繼節點為"節點40"。
刪除之後:"節點20" 的後繼節點為"節點40"。
單鍊錶添加節點
在"節點10"與"節點20"之間添加"節點15"
添加之前:"節點10" 的後繼節點為"節點20"。
添加之後:"節點10" 的後繼節點為"節點15",而"節點15" 的後繼節點為"節點20"。
單鍊錶的特點是:節點的鏈接方向是單向的;相對於數組來說,單鍊錶的的隨機訪問速度較慢,但是單鍊錶刪除/添加數據的效率很高。
三、雙向鍊錶
雙向鍊錶(雙鍊錶)是鍊錶的一種。和單鍊錶一樣,雙鍊錶也是由節點組成,它的每個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向循環鍊錶。
雙鍊錶的示意圖如下:
表頭為空,表頭的後繼節點為"節點10"(數據為10的節點);"節點10"的後繼節點是"節點20"(數據為10的節點),"節點20"的前繼節點是"節點10";"節點20"的後繼節點是"節點30","節點30"的前繼節點是"節點20";...;末尾節點的後繼節點是表頭。
雙鍊錶刪除節點
刪除"節點30"
刪除之前:"節點20"的後繼節點為"節點30","節點30" 的前繼節點為"節點20"。 "節點30"的後繼節點為"節點40","節點40" 的前繼節點為"節點30"。
刪除之後:"節點20"的後繼節點為"節點40","節點40" 的前繼節點為"節點20"。
雙鍊錶添加節點
在"節點10"與"節點20"之間添加"節點15"
添加之前:"節點10"的後繼節點為"節點20","節點20" 的前繼節點為"節點10"。
添加之後:"節點10"的後繼節點為"節點15","節點15" 的前繼節點為"節點10"。 "節點15"的後繼節點為"節點20","節點20" 的前繼節點為"節點15"。
下面介紹雙鍊錶的實現,分別介紹C/C++/Java三種實現。
1. C實現雙鍊錶
實現代碼雙向鍊錶頭文件(double_link.h)
#ifndef _DOUBLE_LINK_H#define _DOUBLE_LINK_H// 新建“雙向鍊錶”。成功,返回表頭;否則,返回NULLextern int create_dlink();// 撤銷“雙向鍊錶”。成功,返回0;否則,返回-1extern int destroy_dlink();// “雙向鍊錶是否為空”。為空的話返回1;否則,返回0。 extern int dlink_is_empty();// 返回“雙向鍊錶的大小”extern int dlink_size();// 獲取“雙向鍊錶中第index位置的元素”。成功,返回節點指針;否則,返回NULL。 extern void* dlink_get(int index);// 獲取“雙向鍊錶中第1個元素”。成功,返回節點指針;否則,返回NULL。 extern void* dlink_get_first();// 獲取“雙向鍊錶中最後1個元素”。成功,返回節點指針;否則,返回NULL。 extern void* dlink_get_last();// 將“value”插入到index位置。成功,返回0;否則,返回-1。 extern int dlink_insert(int index, void *pval);// 將“value”插入到表頭位置。成功,返回0;否則,返回-1。 extern int dlink_insert_first(void *pval);// 將“value”插入到末尾位置。成功,返回0;否則,返回-1。 extern int dlink_append_last(void *pval);// 刪除“雙向鍊錶中index位置的節點”。成功,返回0;否則,返回-1extern int dlink_delete(int index);// 刪除第一個節點。成功,返回0;否則,返回-1extern int dlink_delete_first();// 刪除組後一個節點。成功,返回0;否則,返回-1extern int dlink_delete_last();#endif
雙向鍊錶實現文件(double_link.c)
#include <stdio.h>#include <malloc.h>/*** C 語言實現的雙向鍊錶,能存儲任意數據。 ** @author skywang* @date 2013/11/07*/// 雙向鍊錶節點typedef struct tag_node{struct tag_node *prev;struct tag_node *next;void* p;}node;// 表頭。注意,表頭不存放元素值! ! ! static node *phead=NULL;// 節點個數。 static int count=0;// 新建“節點”。成功,返回節點指針;否則,返回NULL。 static node* create_node(void *pval){node *pnode=NULL;pnode = (node *)malloc(sizeof(node));if (!pnode){printf("create node error!/n");return NULL ;}// 默認的,pnode的前一節點和後一節點都指向它自身pnode->prev = pnode->next = pnode;// 節點的值為pvalpnode->p = pval;return pnode;}/ / 新建“雙向鍊錶”。成功,返回0;否則,返回-1。 int create_dlink(){// 創建表頭phead = create_node(NULL);if (!phead)return -1;// 設置“節點個數”為0count = 0;return 0;}// “雙向鍊錶是否為空”int dlink_is_empty(){return count == 0;}// 返回“雙向鍊錶的大小”int dlink_size() {return count;}// 獲取“雙向鍊錶中第index位置的節點”static node* get_node( int index){if (index<0 || index>=count){printf("%s failed! index out of bound!/n", __func__);return NULL;}// 正向查找if (index <= (count/2)){int i=0;node *pnode=phead->next;while ((i++) < index)pnode = pnode->next;return pnode;}// 反向查找int j=0; int rindex = count - index - 1;node *rnode=phead->prev;while ((j++) < rindex)rnode = rnode->prev;return rnode;}// 獲取“第一個節點”static node* get_first_node (){return get_node(0);}// 獲取“最後一個節點”static node* get_last_node(){return get_node(count-1);}// 獲取“雙向鍊錶中第index位置的元素”。成功,返回節點值;否則,返回-1。 void* dlink_get(int index){node *pindex=get_node(index);if (!pindex){printf("%s failed!/n", __func__);return NULL;}return pindex->p;}//獲取“雙向鍊錶中第1個元素的值”void* dlink_get_first(){return dlink_get(0);}// 獲取“雙向鍊錶中最後1個元素的值”void* dlink_get_last(){return dlink_get(count- 1);}// 將“pval”插入到index位置。成功,返回0;否則,返回-1。 int dlink_insert(int index, void* pval){// 插入表頭if (index==0)return dlink_insert_first(pval);// 獲取要插入的位置對應的節點node *pindex=get_node(index);if ( !pindex)return -1;// 創建“節點”node *pnode=create_node(pval);if (!pnode)return -1;pnode->prev = pindex->prev;pnode->next = pindex;pindex- >prev->next = pnode;pindex->prev = pnode;// 節點個數+1count++;return 0;}// 將“pval”插入到表頭位置int dlink_insert_first(void *pval){node *pnode= create_node(pval);if (!pnode)return -1;pnode->prev = phead;pnode->next = phead->next;phead->next->prev = pnode;phead->next = pnode;count++; return 0;}// 將“pval”插入到末尾位置int dlink_append_last(void *pval){node *pnode=create_node(pval);if (!pnode)return -1;pnode->next = phead;pnode-> prev = phead->prev;phead->prev->next = pnode;phead->prev = pnode;count++;return 0;}// 刪除“雙向鍊錶中index位置的節點”。成功,返回0;否則,返回-1。 int dlink_delete(int index){node *pindex=get_node(index);if (!pindex){printf("%s failed! the index in out of bound!/n", __func__);return -1;}pindex- >next->prev = pindex->prev;pindex->prev->next = pindex->next;free(pindex);count--;return 0;}// 刪除第一個節點int dlink_delete_first(){return dlink_delete(0);}// 刪除組後一個節點int dlink_delete_last(){return dlink_delete(count-1);}// 撤銷“雙向鍊錶”。成功,返回0;否則,返回-1。 int destroy_dlink(){if (!phead){printf("%s failed! dlink is null!/n", __func__);return -1;}node *pnode=phead->next;node *ptmp=NULL;while (pnode != phead){ptmp = pnode;pnode = pnode->next;free(ptmp);}free(phead);phead = NULL;count = 0;return 0;}
雙向鍊錶測試程序(dlink_test.c)
#include <stdio.h>#include "double_link.h"/*** C 語言實現的雙向鍊錶的測試程序。 ** (01) int_test()* 演示向雙向鍊錶操作“int數據”。 * (02) string_test()* 演示向雙向鍊錶操作“字符串數據”。 * (03) object_test()* 演示向雙向鍊錶操作“對象”。 ** @author skywang* @date 2013/11/07*/// 雙向鍊錶操作int數據void int_test(){int iarr[4] = {10, 20, 30, 40};printf("/n-- --%s----/n", __func__);create_dlink(); // 創建雙向鍊錶dlink_insert(0, &iarr[0]); // 向雙向鍊錶的表頭插入數據dlink_insert(0, &iarr[ 1]); // 向雙向鍊錶的表頭插入數據dlink_insert(0, &iarr[2]); // 向雙向鍊錶的表頭插入數據printf("dlink_is_empty()=%d/n", dlink_is_empty() ); // 雙向鍊錶是否為空printf("dlink_size()=%d/n", dlink_size()); // 雙向鍊錶的大小// 打印雙向鍊錶中的全部數據int i;int *p;int sz = dlink_size();for (i=0; i<sz; i++){p = (int *)dlink_get(i);printf("dlink_get(%d)=%d/n", i, *p) ;}destroy_dlink();}void string_test(){char* sarr[4] = {"ten", "twenty", "thirty", "forty"};printf("/n----%s-- --/n", __func__);create_dlink(); // 創建雙向鍊錶dlink_insert(0, sarr[0]); // 向雙向鍊錶的表頭插入數據dlink_insert(0, sarr[1]); //向雙向鍊錶的表頭插入數據dlink_insert(0, sarr[2]); // 向雙向鍊錶的表頭插入數據printf("dlink_is_empty()=%d/n", dlink_is_empty()); // 雙向鍊錶是否為空printf("dlink_size()=%d/n", dlink_size()); // 雙向鍊錶的大小// 打印雙向鍊錶中的全部數據int i;char *p;int sz = dlink_size(); for (i=0; i<sz; i++){p = (char *)dlink_get(i);printf("dlink_get(%d)=%s/n", i, p);}destroy_dlink();} typedef struct tag_stu{int id;char name[20];}stu;static stu arr_stu[] ={{10, "sky"},{20, "jody"},{30, "vic"},{40, "dan"},};#define ARR_STU_SIZE ( (sizeof(arr_stu)) / (sizeof(arr_stu[0])) )void object_test(){printf("/n----%s----/n ", __func__);create_dlink(); // 創建雙向鍊錶dlink_insert(0, &arr_stu[0]); // 向雙向鍊錶的表頭插入數據dlink_insert(0, &arr_stu[1]); // 向雙向鍊錶的表頭插入數據dlink_insert(0, &arr_stu[2]); // 向雙向鍊錶的表頭插入數據printf("dlink_is_empty()=%d/n", dlink_is_empty()); // 雙向鍊錶是否為空printf ("dlink_size()=%d/n", dlink_size()); // 雙向鍊錶的大小// 打印雙向鍊錶中的全部數據int i;int sz = dlink_size();stu *p;for (i= 0; i<sz; i++){p = (stu *)dlink_get(i);printf("dlink_get(%d)=[%d, %s]/n", i, p->id, p-> name);}destroy_dlink();}int main(){int_test(); // 演示向雙向鍊錶操作“int數據”。 string_test(); // 演示向雙向鍊錶操作“字符串數據”。 object_test(); // 演示向雙向鍊錶操作“對象”。 return 0;}
運行結果
----int_test----dlink_is_empty()=0dlink_size()=3dlink_get(0)=30dlink_get(1)=20dlink_get(2)=10----string_test----dlink_is_empty()=0dlink_size()= 3dlink_get(0)=thirtydlink_get(1)=twentydlink_get(2)=ten----object_test----dlink_is_empty()=0dlink_size()=3dlink_get(0)=[30, vic]dlink_get(1)=[20 , jody]dlink_get(2)=[10, sky]
2. C++實現雙鍊錶
實現代碼雙向鍊錶文件(DoubleLink.h)
#ifndef DOUBLE_LINK_HXX#define DOUBLE_LINK_HXX#include <iostream>using namespace std;template<class T>struct DNode{public:T value;DNode *prev;DNode *next;public:DNode() { }DNode(T t, DNode * prev, DNode *next) {this->value = t;this->prev = prev;this->next = next;}};template<class T>class DoubleLink{public:DoubleLink();~DoubleLink(); int size();int is_empty();T get(int index);T get_first();T get_last();int insert(int index, T t);int insert_first(T t);int append_last(T t) ;int del(int index);int delete_first();int delete_last();private:int count;DNode<T> *phead;private:DNode<T> *get_node(int index);};template<class T> DoubleLink<T>::DoubleLink() : count(0){// 創建“表頭”。注意:表頭沒有存儲數據! phead = new DNode<T>();phead->prev = phead->next = phead;// 設置鍊錶計數為0//count = 0;}// 析構函數template<class T>DoubleLink<T> ::~DoubleLink(){// 刪除所有的節點DNode<T>* ptmp;DNode<T>* pnode = phead->next;while (pnode != phead){ptmp = pnode;pnode=pnode->next ;delete ptmp;}// 刪除"表頭"delete phead;phead = NULL;}// 返回節點數目template<class T>int DoubleLink<T>::size(){return count;}// 返回鍊錶是否為空template<class T>int DoubleLink<T>::is_empty(){return count==0;}// 獲取第index位置的節點template<class T>DNode<T>* DoubleLink<T>::get_node (int index){// 判斷參數有效性if (index<0 || index>=count){cout << "get node failed! the index in out of bound!" << endl;return NULL;}//正向查找if (index <= count/2){int i=0;DNode<T>* pindex = phead->next;while (i++ < index) {pindex = pindex->next;}return pindex;}/ / 反向查找int j=0;int rindex = count - index -1;DNode<T>* prindex = phead->prev;while (j++ < rindex) {prindex = prindex->prev;}return prindex;}/ / 獲取第index位置的節點的值template<class T>T DoubleLink<T>::get(int index){return get_node(index)->value;}// 獲取第1個節點的值template<class T >T DoubleLink<T>::get_first(){return get_node(0)->value;}// 獲取最後一個節點的值template<class T>T DoubleLink<T>::get_last(){return get_node(count -1)->value;}// 將節點插入到第index位置之前template<class T>int DoubleLink<T>::insert(int index, T t){if (index == 0)return insert_first(t );DNode<T>* pindex = get_node(index);DNode<T>* pnode = new DNode<T>(t, pindex->prev, pindex);pindex->prev->next = pnode;pindex-> prev = pnode;count++;return 0;}// 將節點插入第一個節點處。 template<class T>int DoubleLink<T>::insert_first(T t){DNode<T>* pnode = new DNode<T>(t, phead, phead->next);phead->next->prev = pnode ;phead->next = pnode;count++;return 0;}// 將節點追加到鍊錶的末尾template<class T>int DoubleLink<T>::append_last(T t){DNode<T>* pnode = new DNode <T>(t, phead->prev, phead);phead->prev->next = pnode;phead->prev = pnode;count++;return 0;}// 刪除index位置的節點template<class T>int DoubleLink<T>::del(int index){DNode<T>* pindex = get_node(index);pindex->next->prev = pindex->prev;pindex->prev->next = pindex->next; delete pindex;count--;return 0;}// 刪除第一個節點template<class T>int DoubleLink<T>::delete_first(){return del(0);}// 刪除最後一個節點template<class T>int DoubleLink<T>::delete_last(){return del(count-1);}#endif
雙向鍊錶測試文件(DlinkTest.cpp)
#include <iostream>#include "DoubleLink.h"using namespace std;// 雙向鍊錶操作int數據void int_test(){int iarr[4] = {10, 20, 30, 40};cout << "/n ----int_test----" << endl;// 創建雙向鍊錶DoubleLink<int>* pdlink = new DoubleLink<int>();pdlink->insert(0, 20); // 將20 插入到第一個位置pdlink->append_last(10); // 將10 追加到鍊錶末尾pdlink->insert_first(30); // 將30 插入到第一個位置// 雙向鍊錶是否為空cout << "is_empty ()=" << pdlink->is_empty() <<endl;// 雙向鍊錶的大小cout << "size()=" << pdlink->size() <<endl;// 打印雙向鍊錶中的全部數據int sz = pdlink->size();for (int i=0; i<sz; i++)cout << "pdlink("<<i<<")=" << pdlink->get(i) <<endl;}void string_test(){string sarr[4] = {"ten", "twenty", "thirty", "forty"};cout << "/n----string_test----" << endl;// 創建雙向鍊錶DoubleLink<string>* pdlink = new DoubleLink<string>();pdlink->insert(0, sarr[1]); // 將sarr中第2個元素插入到第一個位置pdlink->append_last(sarr[0]); // 將sarr中第1個元素追加到鍊錶末尾pdlink->insert_first(sarr[2]); // 將sarr中第3個元素插入到第一個位置// 雙向鍊錶是否為空cout << "is_empty()=" << pdlink->is_empty() <<endl;// 雙向鍊錶的大小cout << "size()=" << pdlink-> size() <<endl;// 打印雙向鍊錶中的全部數據int sz = pdlink->size();for (int i=0; i<sz; i++)cout << "pdlink("<<i< <")=" << pdlink->get(i) <<endl;}struct stu{int id;char name[20];};static stu arr_stu[] ={{10, "sky"},{20 , "jody"},{30, "vic"},{40, "dan"},};#define ARR_STU_SIZE ( (sizeof(arr_stu)) / (sizeof(arr_stu[0])) )void object_test(){ cout << "/n----object_test----" << endl;// 創建雙向鍊錶DoubleLink<stu>* pdlink = new DoubleLink<stu>();pdlink->insert(0, arr_stu[1 ]); // 將arr_stu中第2個元素插入到第一個位置pdlink->append_last(arr_stu[0]); // 將arr_stu中第1個元素追加到鍊錶末尾pdlink->insert_first(arr_stu[2 ]); // 將arr_stu中第3個元素插入到第一個位置// 雙向鍊錶是否為空cout << "is_empty()=" << pdlink->is_empty() <<endl;// 雙向鍊錶的大小cout << "size()=" << pdlink->size() <<endl;// 打印雙向鍊錶中的全部數據int sz = pdlink->size();struct stu p;for (int i =0; i<sz; i++){p = pdlink->get(i);cout << "pdlink("<<i<<")=[" << p.id << ", " << p .name <<"]" <<endl;}}int main(){int_test(); // 演示向雙向鍊錶操作“int數據”。 string_test(); // 演示向雙向鍊錶操作“字符串數據”。 object_test(); // 演示向雙向鍊錶操作“對象”。 return 0;}
示例說明
在上面的示例中,我將雙向鍊錶的"聲明"和"實現"都放在頭文件中。而編程規範告誡我們:將類的聲明和實現分離,在頭文件(.h文件或.hpp)中盡量只包含聲明,而在實現文件(.cpp文件)中負責實現!
那麼為什麼要這麼做呢?這是因為,在雙向鍊錶的實現中,採用了模板;而C++編譯器不支持對模板的分離式編譯!簡單點說,如果在DoubleLink.h中聲明,而在DoubleLink.cpp中進行實現的話;當我們在其他類中創建DoubleLink的對象時,會編譯出錯。具體原因,可以參考"為什麼C++編譯器不能支持對模板的分離式編譯"。
運行結果
----int_test----is_empty()=0size()=3pdlink(0)=30pdlink(1)=20pdlink(2)=10----string_test----is_empty()=0size()= 3pdlink(0)=thirtypdlink(1)=twentypdlink(2)=ten----object_test----is_empty()=0size()=3pdlink(0)=[30, vic]pdlink(1)=[20 , jody]pdlink(2)=[10, sky]
3. Java實現雙鍊錶
實現代碼雙鍊錶類(DoubleLink.java)
/*** Java 實現的雙向鍊錶。 * 注:java自帶的集合包中有實現雙向鍊錶,路徑是:java.util.LinkedList** @author skywang* @date 2013/11/07*/public class DoubleLink<T> {// 表頭private DNode<T> mHead;// 節點個數private int mCount;// 雙向鍊錶“節點”對應的結構體private class DNode<T> {public DNode prev;public DNode next;public T value;public DNode(T value , DNode prev, DNode next) {this.value = value;this.prev = prev;this.next = next;}}// 構造函數public DoubleLink() {// 創建“表頭”。注意:表頭沒有存儲數據! mHead = new DNode<T>(null, null, null);mHead.prev = mHead.next = mHead;// 初始化“節點個數”為0mCount = 0;}// 返回節點數目public int size() { return mCount;}// 返回鍊錶是否為空public boolean isEmpty() {return mCount==0;}// 獲取第index位置的節點private DNode<T> getNode(int index) {if (index<0 || index>=mCount)throw new IndexOutOfBoundsException();// 正向查找if (index <= mCount/2) {DNode<T> node = mHead.next;for (int i=0; i<index; i++)node = node.next;return node;}// 反向查找DNode<T> rnode = mHead.prev;int rindex = mCount - index -1;for (int j=0; j<rindex; j++)rnode = rnode. prev;return rnode;}// 獲取第index位置的節點的值public T get(int index) {return getNode(index).value;}// 獲取第1個節點的值public T getFirst() {return getNode (0).value;}// 獲取最後一個節點的值public T getLast() {return getNode(mCount-1).value;}// 將節點插入到第index位置之前public void insert(int index, T t) {if (index==0) {DNode<T> node = new DNode<T>(t, mHead, mHead.next);mHead.next.prev = node;mHead.next = node;mCount++;return ; }DNode<T> inode = getNode(index);DNode<T> tnode = new DNode<T>(t, inode.prev, inode);inode.prev.next = tnode;inode.next = tnode;mCount++;return ;}// 將節點插入第一個節點處。 public void insertFirst(T t) {insert(0, t);}// 將節點追加到鍊錶的末尾public void appendLast(T t) {DNode<T> node = new DNode<T>(t, mHead.prev , mHead);mHead.prev.next = node;mHead.prev = node;mCount++;}// 刪除index位置的節點public void del(int index) {DNode<T> inode = getNode(index);inode.prev .next = inode.next;inode.next.prev = inode.prev;inode = null;mCount--;}// 刪除第一個節點public void deleteFirst() {del(0);}// 刪除最後一個節點public void deleteLast() {del(mCount-1);}}
測試程序(DlinkTest.java)
/*** Java 實現的雙向鍊錶。 * 注:java自帶的集合包中有實現雙向鍊錶,路徑是:java.util.LinkedList** @author skywang* @date 2013/11/07*/public class DlinkTest {// 雙向鍊錶操作int數據private static void int_test() {int[] iarr = {10, 20, 30, 40};System.out.println("/n----int_test----");// 創建雙向鍊錶DoubleLink<Integer > dlink = new DoubleLink<Integer>();dlink.insert(0, 20); // 將20 插入到第一個位置dlink.appendLast(10); // 將10 追加到鍊錶末尾dlink.insertFirst(30 ); // 將30 插入到第一個位置// 雙向鍊錶是否為空System.out.printf("isEmpty()=%b/n", dlink.isEmpty());// 雙向鍊錶的大小System .out.printf("size()=%d/n", dlink.size());// 打印出全部的節點for (int i=0; i<dlink.size(); i++)System.out .println("dlink("+i+")="+ dlink.get(i));}private static void string_test() {String[] sarr = {"ten", "twenty", "thirty", "forty "};System.out.println("/n----string_test----");// 創建雙向鍊錶DoubleLink<String> dlink = new DoubleLink<String>();dlink.insert(0, sarr [1]); // 將sarr中第2個元素插入到第一個位置dlink.appendLast(sarr[0]); // 將sarr中第1個元素追加到鍊錶末尾dlink.insertFirst(sarr[2 ]); // 將sarr中第3個元素插入到第一個位置// 雙向鍊錶是否為空System.out.printf("isEmpty()=%b/n", dlink.isEmpty());/ / 雙向鍊錶的大小System.out.printf("size()=%d/n", dlink.size());// 打印出全部的節點for (int i=0; i<dlink.size() ; i++)System.out.println("dlink("+i+")="+ dlink.get(i));}// 內部類private static class Student {private int id;private String name;public Student(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "["+id+", "+name+"]";}}private static Student[] students = new Student[]{new Student(10, "sky"),new Student(20, "jody"),new Student(30, "vic"),new Student(40, "dan"),};private static void object_test() {System.out.println("/n----object_test----");// 創建雙向鍊錶DoubleLink<Student> dlink = new DoubleLink<Student>();dlink.insert(0, students[1]); // 將students中第2個元素插入到第一個位置dlink.appendLast(students[0]); // 將students中第1個元素追加到鍊錶末尾dlink.insertFirst(students[ 2]); // 將students中第3個元素插入到第一個位置// 雙向鍊錶是否為空System.out.printf("isEmpty()=%b/n", dlink.isEmpty()); // 雙向鍊錶的大小System.out.printf("size()=%d/n", dlink.size());// 打印出全部的節點for (int i=0; i<dlink.size( ); i++) {System.out.println("dlink("+i+")="+ dlink.get(i));}}public static void main(String[] args) {int_test(); // 演示向雙向鍊錶操作“int數據”。 string_test(); // 演示向雙向鍊錶操作“字符串數據”。 object_test(); // 演示向雙向鍊錶操作“對象”。 }}
運行結果
----int_test----isEmpty()=falsesize()=3dlink(0)=30dlink(1)=20dlink(2)=10----string_test----isEmpty()=falsesize()= 3dlink(0)=thirtydlink(1)=twentydlink(2)=ten----object_test----isEmpty()=falsesize()=3dlink(0)=[30, vic]dlink(1)=[20 , jody]dlink(2)=[10, sky]
以上就是本文的全部內容,希望大家能夠理解,對大家有所幫助。