线性表之单链表 图解和代码实现

来源:互联网 发布:充电宝排行知乎 编辑:程序博客网 时间:2024/05/23 00:44

线性表的链接存储结构---单链表

图解:

 

 

 

 

 

LinkList.h文件

 

[cpp] view plaincopy
  1. //LinkList.h  声明类LinkList  
  2. #ifndef LinkList_H  
  3. #define LinkList_H  
  4. template <class T>  
  5. struct Node  
  6. {  
  7.   T data;  
  8.   Node<T> *next;  //此处<T>也可以省略  
  9. };  
  10.   
  11. template <class T>  
  12. class LinkList  
  13. {  
  14.   public:  
  15.     LinkList( );  //建立只有头结点的空链表  
  16.     LinkList(T a[ ], int n);  //建立有n个元素的单链表  
  17.     ~LinkList();             //析构函数  
  18.     int Length();          //求单链表的长度  
  19.     T Get(int i);           //取单链表中第i个结点的元素值  
  20.     int Locate(T x);       //求单链表中值为x的元素序号  
  21.     void Insert(int i, T x);   //在单链表中第i个位置插入元素值为x的结点  
  22.     T Delete(int i);        //在单链表中删除第i个结点  
  23.     void PrintList( );           //遍历单链表,按序号依次输出各元素  
  24.  private:  
  25.    Node<T> *first;  //单链表的头指针  
  26. };  
  27.   
  28. #endif  


 

LinkList.cpp文件

[cpp] view plaincopy
  1. //LinkList.cpp  
  2. #include "LinkList.h"  
  3. /* 
  4. *前置条件:单链表不存在 
  5. *输    入:无 
  6. *功    能:构建一个单链表 
  7. *输    出:无 
  8. *后置条件:构建一个单链表 
  9. */  
  10. template <class T>  
  11. LinkList<T>:: LinkList( )  
  12. {  
  13.  first=new Node<T>; first->next=NULL;  
  14. }  
  15. /* 
  16. *前置条件:单链表不存在 
  17. *输    入:顺序表信息的数组形式a[],单链表长度n 
  18. *功    能:将数组a[]中元素建为长度为n的单链表 
  19. *输    出:无 
  20. *后置条件:构建一个单链表 
  21. */  
  22.    
  23. template <class T>    
  24. LinkList<T>:: LinkList(T a[ ], int n)  
  25.  {  
  26.     first=new Node<T>;   //生成头结点  
  27.     Node<T> *r,*s;  
  28.      r=first;          //尾指针初始化  
  29.     for (int i=0; i<n; i++)  
  30.     {   
  31.       s=new Node<T>; s->data=a[i];  //为每个数组元素建立一个结点  
  32.       r->next=s; r=s;      //插入到终端结点之后  
  33.     }  
  34.     r->next=NULL;    //单链表建立完毕,将终端结点的指针域置空  
  35.  }  
  36.   
  37.   
  38. /* 
  39. *前置条件:无 
  40. *输    入:无 
  41. *功    能:无 
  42. *输    出:无 
  43. *后置条件:无 
  44. */  
  45. template <class T>  
  46. LinkList<T>:: ~LinkList()  
  47. {  
  48. }  
  49. /* 
  50. *前置条件:单链表存在 
  51. *输    入:查询元素位置i 
  52. *功    能:按位查找位置为i的元素并输出值 
  53. *输    出:查询元素的值 
  54. *后置条件:单链表不变 
  55. */  
  56. template <class T>  
  57. T LinkList<T>::Get(int i)   
  58. {     
  59.   Node<T> *p; int j;  
  60.   p=first->next;  j=1;  //或p=first;  j=0;  
  61.   while (p && j<i)      
  62.   {  
  63.     p=p->next;       //工作指针p后移  
  64.     j++;  
  65.   }  
  66.   if (!p) throw "位置";  
  67.   else return p->data;  
  68. }  
  69.   
  70. /* 
  71. *前置条件:单链表存在 
  72. *输    入:查询元素值x 
  73. *功    能:按值查找值的元素并输出位置 
  74. *输    出:查询元素的位置 
  75. *后置条件:单链表不变 
  76. */  
  77. template <class T>   
  78. int LinkList<T>::Locate(T x)  
  79. {  
  80.     Node<T> *p; int j;  
  81.     p=first->next; j=1;  
  82.     if(p&&p->next){  
  83.       while(p->data!=x)  
  84.       {  
  85.          p=p->next;  
  86.          j++;  
  87.       }  
  88.     return j;  
  89.     }  
  90.     else throw "位置";  
  91.       
  92. }  
  93.   
  94. /* 
  95. *前置条件:单链表存在 
  96. *输    入:插入元素x,插入位置i 
  97. *功    能:将元素x插入到单链表中位置i处 
  98. *输    出:无 
  99. *后置条件:单链表插入新元素 
  100. */  
  101. template <class T>    
  102. void LinkList<T>::Insert(int i, T x)  
  103. {    
  104.    Node<T> *p; int j;  
  105.    p=first ; j=0;    //工作指针p初始化  
  106.    while (p && j<i-1)  
  107.    {  
  108.      p=p->next;   //工作指针p后移  
  109.      j++;  
  110.    }  
  111.    if (!p) throw "位置";  
  112.     else {   
  113.       Node<T> *s;  
  114.       s=new Node<T>;   
  115.       s->data=x;  //向内存申请一个结点s,其数据域为x  
  116.       s->next=p->next;       //将结点s插入到结点p之后  
  117.       p->next=s;  
  118.     }  
  119. }  
  120.   
  121. /* 
  122. *前置条件:单链表存在 
  123. *输    入:无 
  124. *功    能:输出单链表长度 
  125. *输    出:单链表长度 
  126. *后置条件:单链表不变 
  127. */  
  128. template <class T>   
  129. int LinkList<T>::Length( )  
  130. {  
  131.   Node <T> *p = first->next;  
  132.   int i = 0;  
  133.   while(p)  
  134.   {  
  135.     p = p->next;  
  136.     i++;  
  137.   }  
  138.   return i;  
  139. }  
  140. /* 
  141. *前置条件:单链表存在 
  142. *输    入:要删除元素位置i 
  143. *功    能:删除单链表中位置为i的元素 
  144. *输    出:无 
  145. *后置条件:单链表删除元素 
  146. */  
  147. template <class T>    
  148. T LinkList<T>::Delete(int i)  
  149. {   
  150.   Node<T> *p; int j;  
  151.   p=first ; j=0;  //工作指针p初始化  
  152.   while (p && j<i-1)  //查找第i-1个结点  
  153.   {  
  154.     p=p->next;  
  155.     j++;  
  156.   }  
  157.   if (!p || !p->next) throw "位置";  //结点p不存在或结点p的后继结点不存在  
  158.     else {  
  159.           Node<T> *q; int x;  
  160.           q=p->next; x=q->data;  //暂存被删结点  
  161.           p->next=q->next;  //摘链  
  162.           delete q;   
  163.           return x;  
  164.     }  
  165. }  
  166. /* 
  167. *前置条件:单链表存在 
  168. *输    入:无 
  169. *功    能:单链表遍历 
  170. *输    出:输出所有元素 
  171. *后置条件:单链表不变 
  172. */  
  173. template <class T>   
  174. void LinkList<T>::PrintList( )  
  175. {  
  176.     Node<T> *p;  
  177.     p=first->next;  
  178.     while (p)  
  179.     {  
  180.       cout<<p->data<<endl;  
  181.       p=p->next;  
  182.     }  
  183.       
  184. }  
0 0
原创粉丝点击