zoukankan      html  css  js  c++  java
  • 数据结构_顺序表

    线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表。

    顺序表实现的头文件SeqList.h:

      1 #ifndef SEQLIST_H
      2 #define SEQLIST_H
      3 
      4 #include <iostream>
      5 
      6 using namespace std;
      7 
      8 template<class T>
      9 class SeqList
     10 {
     11 public:
     12     SeqList(int size = 3);
     13     ~SeqList();
     14     int getSLSize();
     15     int getCurrentSize();
     16     bool isEmpty();
     17     T get(int index);
     18     bool slInsert(int index, T t);
     19     bool slDelete(int index);
     20 private:
     21     T *pdata;
     22     int size;
     23     int last;
     24 };
     25 
     26 template<class T>
     27 SeqList<T>::SeqList(int size)
     28 {
     29     pdata = new T[size];
     30     this->size = size;
     31     last = -1;
     32 }
     33 
     34 template<class T>
     35 SeqList<T>::~SeqList()
     36 {
     37     delete [] pdata;
     38     pdata = NULL;
     39 }
     40 
     41 template<class T>
     42 int SeqList<T>::getSLSize()
     43 {
     44     return this->size;
     45 }
     46 
     47 template<class T>
     48 int SeqList<T>::getCurrentSize()
     49 {
     50     return this->last;
     51 }
     52 
     53 template<class T>
     54 bool SeqList<T>::isEmpty()
     55 {
     56     if(last == -1) return true;
     57     else return false;
     58 }
     59 
     60 template<class T>
     61 T SeqList<T>::get(int index)
     62 {
     63     if(index < 0 || index > last)
     64     {
     65         cout << "Get value failed! The index is out of bound!" << endl;
     66 //        return ;
     67     }
     68 
     69     return pdata[index];
     70 }
     71 
     72 //Element t is at index(start from 0) after inserting
     73 template<class T>
     74 bool SeqList<T>::slInsert(int index, T t)
     75 {
     76     if(last == size - 1)
     77     {
     78         cout << "Table is full!" << endl;
     79         return false;
     80     }
     81 
     82     if(index < 0 || index > last + 1)
     83     {
     84         cout << "Location error!" << endl;
     85         return false;
     86     }
     87 
     88     //If the table is empty
     89     if(last == -1)
     90     {
     91         pdata[0] = t;
     92         last++;
     93         return true;
     94     }
     95 
     96     //If the location is at last
     97     if(index == last + 1)
     98     {
     99         pdata[index] = t;
    100         last++;
    101         return true;
    102     }
    103 
    104     //For common situation
    105     for(int j = last; j >= index; j--)
    106     {
    107         pdata[j + 1] = pdata[j];
    108     }
    109     pdata[index] = t;
    110     last++;
    111     return true;
    112 }
    113 
    114 template<class T>
    115 bool SeqList<T>::slDelete(int index)
    116 {
    117     if(index < 0 || index > last)
    118     {
    119         cout << "Location error!" << endl;
    120         return false;
    121     }
    122 
    123     if(last == -1)
    124     {
    125         cout << "Table is empty!" << endl;
    126         return false;
    127     }
    128 
    129     //If the location is at last
    130     if(index == last)
    131     {
    132         last--;
    133         return true;
    134     }
    135 
    136     //For common situation
    137     for(int j = index; j < last; j++)
    138     {
    139         pdata[j] = pdata[j + 1];
    140     }
    141     last--;
    142     return true;
    143 }
    144 
    145 #endif

    顺序表的测试文件TSeqList.cpp:

      1 #include <iostream>
      2 #include <SeqList.h>
      3 #include <string>
      4 
      5 using namespace std;
      6 
      7 struct Student
      8 {
      9     string name;
     10     int id;
     11 };
     12 
     13 class A
     14 {
     15 public:
     16     A()
     17     {
     18         f = 0;
     19     }
     20     void setv(int v = 1);
     21     int f;
     22 };
     23 
     24 //void A::setv(int v = 3) //Compile error
     25 void A::setv(int v)
     26 {
     27     this->f = v;
     28 }
     29 
     30 void ObjectTest()
     31 {
     32     Student stu[] =
     33     {
     34         {"Sky", 11},
     35         {"Rose", 12},
     36         {"Jack", 13},
     37     };
     38 
     39     cout << endl << "----object test----" << endl;
     40     SeqList<Student> *pslist = new SeqList<Student>();
     41     cout << "size = " << pslist->getSLSize() << endl;
     42 
     43     cout << "Check location:" << endl;
     44     pslist->slInsert(-1, stu[0]);
     45 
     46     cout << "Insert when table is empty" << endl;
     47     pslist->slInsert(0, stu[0]);
     48 
     49     cout << "Insert at last" << endl;
     50     pslist->slInsert(1, stu[1]);
     51 
     52     cout << "Insert at first" << endl;
     53     pslist->slInsert(0, stu[2]);
     54 
     55     Student p;
     56     int cuSize = pslist->getCurrentSize();
     57     for(int i = 0; i <= cuSize; i++)
     58     {
     59         p = pslist->get(i);
     60         cout << "pslist[" << i << "] = " << p.name << ", " << p.id << endl;
     61     }
     62 
     63     cout << "Check overflow:" << endl;
     64     pslist->slInsert(0, stu[0]);
     65 
     66     cout << "Check deleting location:" << endl;
     67     pslist->slDelete(3);
     68 
     69     cout << "Delete the first one:" << endl;
     70     pslist->slDelete(0);
     71     cuSize = pslist->getCurrentSize();
     72     for(int i = 0; i <= cuSize; i++)
     73     {
     74         p = pslist->get(i);
     75         cout << "pslist[" << i << "] = " << p.name << ", " << p.id << endl;
     76     }
     77 
     78     cout << "Check deleting the last one" << endl;
     79     pslist->slDelete(1);
     80     cuSize = pslist->getCurrentSize();
     81     for(int i = 0; i <= cuSize; i++)
     82     {
     83         p = pslist->get(i);
     84         cout << "pslist[" << i << "] = " << p.name << ", " << p.id << endl;
     85     }
     86 
     87     int k = 0;
     88     while(!pslist->isEmpty())
     89     {
     90         pslist->slDelete(0);
     91         k++;
     92     }
     93     cout << "After deleting size = " << k << endl;
     94 
     95     A a;
     96     a.setv();
     97 //    a.setv(6);
     98     cout << "f = " << a.f << endl;
     99 
    100     delete pslist;
    101     return;
    102 }
    103 
    104 int main()
    105 {
    106     ObjectTest();
    107     return 0;
    108 }

    输出结果:

     1 ----object test----
     2 size = 3
     3 Check location:
     4 Location error!
     5 Insert when table is empty
     6 Insert at last
     7 Insert at first
     8 pslist[0] = Jack, 13
     9 pslist[1] = Sky, 11
    10 pslist[2] = Rose, 12
    11 Check overflow:
    12 Table is full!
    13 Check deleting location:
    14 Location error!
    15 Delete the first one:
    16 pslist[0] = Sky, 11
    17 pslist[1] = Rose, 12
    18 Check deleting the last one
    19 pslist[0] = Sky, 11
    20 After deleting, size = 1
    21 f = 1

    顺序表插入操作注意事项:

    1)判断表是否满,若满了不作插入;

    2)检验插入位置的有效性;

    3)若为空表,直接插入首位置;

    4)若在表末端插入,无需移动元素。

    顺序表删除操作注意事项:

    1)判断表是否为空;

    2)检验删除位置的有效性;

    3)若删除最后一个元素,则无需移动其它元素。

  • 相关阅读:
    Codeforces Round #172 (Div. 2) B. Nearest Fraction
    什么是DWR
    1310 N皇后问题
    ural Bus Routes(dfs深搜)
    ural Russian Pipelines(最短路)
    ural Graph Decomposition
    ural Network ( 最小生成树)
    poj 1579 Function Run Fun ( 记忆化搜索 )
    计算某一天的前一天的日期
    DataStructGraphpart1
  • 原文地址:https://www.cnblogs.com/pursuiting/p/7466483.html
Copyright © 2011-2022 走看看