码迷,mamicode.com
首页 > 编程语言 > 详细

c++数据结构之链表详情1(顺序链表)

时间:2018-11-26 00:02:27      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:cout   div   插入   ISE   顺序表   etl   span   clu   prot   

长大是人必经的溃烂        ---大卫塞林格

代码是年轻人的新生!!!!!!

程序 = 数据结构  + 算法   --Niklaus EmilWirth

这篇博客在参考一些书籍和教学视频的基础上整理而来,中间夹杂了一些自己写的代码

1、List

先贴一个基础的整型顺序链表list的c++代码

List.cpp

  1 #include <iostream>
  2 #include "List.h"
  3 
  4 using namespace std;
  5 
  6 //创建链表
  7 List::List(int Size)
  8 {
  9     m_iSize  =Size;
 10     m_pList = new int[m_iSize];
 11     m_iLength = 0;
 12 }
 13 List::~List()
 14 {
 15     delete []m_pList;
 16     m_pList = NULL;
 17 }
 18 //清空链表
 19 void List::ClearList()
 20 {
 21     m_iLength = 0;
 22 }
 23 bool List::IsEmpty()
 24 {
 25     if (m_iLength==0)
 26     {
 27         return true;
 28     }
 29     else
 30     {
 31         return false;
 32     }
 33 }
 34 int List::GetLength()
 35 {
 36     return m_iLength;
 37 }
 38 bool List::GetElement(int i,int *e)
 39 {
 40     if (i<0||i>m_iSize)
 41     {
 42         return false;
 43     }
 44     *e = m_pList[i];
 45     return true;
 46 }
 47 int List::LocateElement(int *e)
 48 {
 49     for (int i=0;i<m_iLength;i++)
 50     {
 51         if (m_pList[i] == *e)
 52         {
 53             return i;
 54         }
 55     }
 56 }
 57 /**********************************************************
 58 获取指定元素的前驱
 59 **********************************************************/
 60 bool List::PriorElement(int *PreElement,int *CurrentElement)
 61 {
 62     int temp = LocateElement(CurrentElement);
 63     if (temp == -1)
 64     {
 65         return false;
 66     }
 67     else 
 68     {
 69         if (temp == 0)
 70         {
 71             return false;
 72         }
 73         else
 74         {
 75             *PreElement = m_pList[temp-1];
 76             return true;
 77         }
 78     }
 79 }
 80 /*******************************************************
 81 获取指定元素的后继
 82 ********************************************************/
 83 bool List::NextElement(int *NeElment,int *CurrentElement)
 84 {
 85     int temp = LocateElement(CurrentElement);
 86     if (temp == -1)
 87     {
 88         return false;
 89     }
 90     else 
 91     {
 92         if (temp == m_iLength)
 93         {
 94             return false;
 95         }
 96         else
 97         {
 98             *NeElment = m_pList[temp+1];
 99             return true;
100         }
101     }
102 }
103 /************************************
104 在顺序表中的指定位置插入元素
105 *************************************/
106 bool List::ListInsert(int i,int *e)
107 {
108     if(i<0||i>m_iLength)
109     {
110         return false;
111     }
112     for (int k=m_iLength-1;k>=i;k--)
113     {
114         m_pList[k+1] = m_pList[k];
115     }
116     m_pList[i] = *e;
117     m_iLength++;
118 }
119 /***********************************
120 删除顺序表指定的元素
121 ************************************/
122 bool List::ListDelete(int i,int *e)
123 {
124     *e = m_pList[i];
125     if(i<0||i>m_iLength)
126     {
127         return false;
128     }
129     for (int k=i+1;k<m_iLength;i++)
130     {
131         m_pList[k-1] = m_pList[k];
132     }
133     m_iLength--;
134 }
135 /***********************************
136 遍历顺序表中的数据
137 ************************************/
138 void List::ListTranverse()
139 {
140     for (int i=0;i<m_iLength;i++)
141     {
142         cout<<m_pList[i]<<endl;
143     }
144 }
145 //bool List::ListInsertHead(int *e)
146 //{
147 //
148 //}
149 //bool List::ListInsertTail(int *e)
150 //{
151 //
152 //}

List.h

#ifndef LIST_H
#define LIST_H


class List
{
public:
    List(int Size);
    ~List();
    void ClearList();
    bool IsEmpty();
    int GetLength();
    bool GetElement(int i,int *e);
    int LocateElement(int *e);
    bool PriorElement(int *PreElement,int *CurrentElement);
    bool NextElement(int *NeElment,int *CurrentElement);
    bool ListInsert(int i,int *e);
    bool ListInsertHead(int *e);
    bool ListInsertTail(int *e);
    bool ListDelete(int i,int *e);
    void ListTranverse();
protected:
    int *m_pList;
    int m_iSize;
    int m_iLength;
};

#endif

主函数:

#include <stdio.h>
#include <stdlib.h>
#include "List.h"

using namespace std;

int main(void)
{
    int e1 = 3;
    List *list1 = new List(10);
    list1->ListInsert(0,&e1);
    list1->ListTranverse();
    system("pause");
    return 0;
}

以上代码为整型的顺序list链表,加入一个模板(ps:由于vs中模板的定义个声明不能分开写,我的代码做了一点小小的修改),

修改以上代码,如下所示:

List.h

 1 #ifndef LIST_H
 2 #define LIST_H
 3 
 4 
 5 template<typename T1> 
 6 class List
 7 {
 8 public:
 9     List(int Size);
10     ~List();
11     void ClearList();
12     bool IsEmpty();
13     int GetLength();
14     bool GetElement(int i,T1 *e);
15     int LocateElement(T1 *e);
16     bool PriorElement(T1 *PreElement,T1 *CurrentElement);
17     bool NextElement(T1 *NeElment,T1 *CurrentElement);
18     bool ListInsert(int i,T1 *e);
19     bool ListInsertHead(T1 *e);
20     bool ListInsertTail(T1 *e);
21     bool ListDelete(int i,T1 *e);
22     void ListTranverse();
23 protected:
24     T1 *m_pList;
25     int m_iSize;
26     int m_iLength;
27 };
28 
29 #endif

List.cpp

  1 #include <iostream>
  2 #include "List.h"
  3 
  4 using namespace std;
  5 
  6 //创建链表
  7 template<typename T1> List<T1>::List(int Size)
  8 {
  9     m_iSize  =Size;
 10     m_pList = new T1[m_iSize];
 11     m_iLength = 0;
 12 }
 13 template<typename T1> List<T1>::~List()
 14 {
 15     delete []m_pList;
 16     m_pList = NULL;
 17 }
 18 //清空链表
 19 template<typename T1> void List<T1>::ClearList()
 20 {
 21     m_iLength = 0;
 22 }
 23 template<typename T1> bool List<T1>::IsEmpty()
 24 {
 25     if (m_iLength==0)
 26     {
 27         return true;
 28     }
 29     else
 30     {
 31         return false;
 32     }
 33 }
 34 template<typename T1> int List<T1>::GetLength()
 35 {
 36     return m_iLength;
 37 }
 38 template<typename T1> bool List<T1>::GetElement(int i,T1 *e)
 39 {
 40     if (i<0||i>m_iSize)
 41     {
 42         return false;
 43     }
 44     *e = m_pList[i];
 45     return true;
 46 }
 47 template<typename T1> int List<T1>::LocateElement(T1 *e)
 48 {
 49     for (int i=0;i<m_iLength;i++)
 50     {
 51         if (m_pList[i] == *e)
 52         {
 53             return i;
 54         }
 55     }
 56 }
 57 /**********************************************************
 58 获取指定元素的前驱
 59 **********************************************************/
 60 template<typename T1> bool List<T1>::PriorElement(T1 *PreElement,T1 *CurrentElement)
 61 {
 62     int temp = LocateElement(CurrentElement);
 63     if (temp == -1)
 64     {
 65         return false;
 66     }
 67     else 
 68     {
 69         if (temp == 0)
 70         {
 71             return false;
 72         }
 73         else
 74         {
 75             *PreElement = m_pList[temp-1];
 76             return true;
 77         }
 78     }
 79 }
 80 /*******************************************************
 81 获取指定元素的后继
 82 ********************************************************/
 83 template<typename T1> bool List<T1>::NextElement(T1 *NeElment,T1 *CurrentElement)
 84 {
 85     int temp = LocateElement(CurrentElement);
 86     if (temp == -1)
 87     {
 88         return false;
 89     }
 90     else 
 91     {
 92         if (temp == m_iLength)
 93         {
 94             return false;
 95         }
 96         else
 97         {
 98             *NeElment = m_pList[temp+1];
 99             return true;
100         }
101     }
102 }
103 /************************************
104 在顺序表中的指定位置插入元素
105 *************************************/
106 template<typename T1> bool List<T1>::ListInsert(int i,T1 *e)
107 {
108     if(i<0||i>m_iLength)
109     {
110         return false;
111     }
112     for (int k=m_iLength-1;k>=i;k--)
113     {
114         m_pList[k+1] = m_pList[k];
115     }
116     m_pList[i] = *e;
117     m_iLength++;
118 }
119 /***********************************
120 删除顺序表指定的元素
121 ************************************/
122 template<typename T1> bool List<T1>::ListDelete(int i,T1 *e)
123 {
124     *e = m_pList[i];
125     if(i<0||i>m_iLength)
126     {
127         return false;
128     }
129     for (int k=i+1;k<m_iLength;i++)
130     {
131         m_pList[k-1] = m_pList[k];
132     }
133     m_iLength--;
134 }
135 /***********************************
136 遍历顺序表中的数据
137 ************************************/
138 template<typename T1> void List<T1>::ListTranverse()
139 {
140     for (int i=0;i<m_iLength;i++)
141     {
142         cout<<m_pList[i]<<endl;
143     }
144 }
145 //bool List::ListInsertHead(int *e)
146 //{
147 //
148 //}
149 //bool List::ListInsertTail(int *e)
150 //{
151 //
152 //}

main.cpp

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "List.h"
 4 #include "List.cpp"
 5 
 6 using namespace std;
 7 
 8 int main(void)
 9 {
10     float e1 = 3.2;
11     List<float> *list1 = new List<float>(10);
12     list1->ListInsert(0,&e1);
13     list1->ListTranverse();
14     system("pause");
15     return 0;
16 }

好了,完整实现,以上是一个顺序链表,换句话说就是一个数组的源码。接下来继续分享链表的源码

 

c++数据结构之链表详情1(顺序链表)

标签:cout   div   插入   ISE   顺序表   etl   span   clu   prot   

原文地址:https://www.cnblogs.com/yiqinari/p/10017822.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!