簡略引見線性表和若何完成雙鏈表。本站提示廣大學習愛好者:(簡略引見線性表和若何完成雙鏈表)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略引見線性表和若何完成雙鏈表正文
線性表是一種線性構造,它是具有雷同類型的n(n≥0)個數據元素構成的無限序列。
1、數組
數組有上界和下界,數組的元素在高低界內是持續的。
存儲10,20,30,40,50的數組的表示圖以下:
數組的特色:數據是持續的;隨機拜訪速度快。
數組中略微龐雜一點的是多維數組和靜態數組。關於C說話而言,多維數組實質上也是經由過程一維數組完成的。至於靜態數組,是指數組的容量能靜態增加的數組;關於C說話而言,若要供給靜態數組,須要手動完成;而關於C++而言,STL供給了Vector;關於Java而言,Collection聚集中供給了ArrayList和Vector。
2、單向鏈表
單向鏈表(單鏈表)是鏈表的一種,它由節點構成,每一個節點都包括下一個節點的指針。
單鏈表的表示圖以下:
表頭為空,表頭的後繼節點是"節點10"(數據為10的節點),"節點10"的後繼節點是"節點20"(數據為10的節點),...
單鏈表刪除節點
刪除"節點30"
刪除之前:"節點20" 的後繼節點為"節點30",而"節點30" 的後繼節點為"節點40"。
刪除以後:"節點20" 的後繼節點為"節點40"。
單鏈表添加節點
在"節點10"與"節點20"之間添加"節點15"
添加上前:"節點10" 的後繼節點為"節點20"。
添加上後:"節點10" 的後繼節點為"節點15",而"節點15" 的後繼節點為"節點20"。
單鏈表的特色是:節點的鏈接偏向是單向的;絕對於數組來講,單鏈表的的隨機拜訪速度較慢,然則單鏈表刪除/添加數據的效力很高。
3、雙向鏈表
雙向鏈表(雙鏈表)是鏈表的一種。和單鏈表一樣,雙鏈表也是由節點構成,它的每一個數據結點中都有兩個指針,分離指向直接後繼和直接先驅。所以,從雙向鏈表中的隨意率性一個結點開端,都可以很便利地拜訪它的先驅結點和後繼結點。普通我們都結構雙向輪回鏈表。
雙鏈表的表示圖以下:
表頭為空,表頭的後繼節點為"節點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 // 新建“雙向鏈表”。勝利,前往表頭;不然,前往NULL extern int create_dlink(); // 撤消“雙向鏈表”。勝利,前往0;不然,前往-1 extern 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;不然,前往-1 extern int dlink_delete(int index); // 刪除第一個節點。勝利,前往0;不然,前往-1 extern int dlink_delete_first(); // 刪除組後一個節點。勝利,前往0;不然,前往-1 extern 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; // 節點的值為pval pnode->p = pval; return pnode; } // 新建“雙向鏈表”。勝利,前往0;不然,前往-1。 int create_dlink() { // 創立表頭 phead = create_node(NULL); if (!phead) return -1; // 設置“節點個數”為0 count = 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; // 節點個數+1 count++; 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()=0 dlink_size()=3 dlink_get(0)=30 dlink_get(1)=20 dlink_get(2)=10 ----string_test---- dlink_is_empty()=0 dlink_size()=3 dlink_get(0)=thirty dlink_get(1)=twenty dlink_get(2)=ten ----object_test---- dlink_is_empty()=0 dlink_size()=3 dlink_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()=0 size()=3 pdlink(0)=30 pdlink(1)=20 pdlink(2)=10 ----string_test---- is_empty()=0 size()=3 pdlink(0)=thirty pdlink(1)=twenty pdlink(2)=ten ----object_test---- is_empty()=0 size()=3 pdlink(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; // 初始化“節點個數”為0 mCount = 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; } @Override public 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()=false size()=3 dlink(0)=30 dlink(1)=20 dlink(2)=10 ----string_test---- isEmpty()=false size()=3 dlink(0)=thirty dlink(1)=twenty dlink(2)=ten ----object_test---- isEmpty()=false size()=3 dlink(0)=[30, vic] dlink(1)=[20, jody] dlink(2)=[10, sky]
以上就是本文的全體內容,願望年夜家可以或許懂得,對年夜家有所贊助。