数据布局练手01 线性表实现

    添加时间:2013-5-22 点击量:

    C++的常识点很零散繁琐,只是总结没啥感化,更多的应当是在实践中找题目。今天我去编写《数据布局,算法与应用 C++说话描述》中线性表的实现代码,感触感染写代码才能陌生了很多多少。


    编写过程中,我发了然几个题目,很值得存眷:


    1、我的代码是经由过程类模板编写的。很多人写代码的时辰,都把声明和实现放在一个头文件里,primer中说要借用export才干实现分别编译,对于这点,我也不是很懂得,然则我取巧了下,经由过程两个 #ifndef....#endif 达到了声明放在.h, 实现放在了.cpp中。


    2、模板类中关于<<的重载,须要在声明中参加 <> ,要不然编译不经由过程。


    3、cout 的刷新题目。 如 fun(int& x), 若我们这么用  cout << fun(y) << y ;  屏幕上显示的不是y更新后的值,而是调用y前的值。而将它分成两个cout来输出,或者刷新后输出,那么将是正确的。


    好的,贴代码:  实现景象 vs2010



    // linearlist.h
    
    #ifndef MY_LINEARLIST_H // 在头文件中做保护头
    #define MY_LINEARLIST_H
    #include
    <ostream>
    using namespace std;
    template
    <class T>
    class LinearList{
    public:
    LinearList(
    int cap = 100);
    ~LinearList();
    bool isEmpty();
    int length();
    bool find(int pos, T& hold) const;
    int search(const T& x) const;
    LinearList
    <T>& drop(int pos, T& hold);
    LinearList
    <T>& (int pos, const T& x);
    void printt(ostream& os)const;
    friend ostream
    & operator << <>(ostream& os, const LinearList<T>& x); // 题目二的失足,模板不好把握呀
    private:
    int size;
    int capacity;
    T
    element;
    };

    #endif
    #include
    LinearList.cpp // 这里包含实现文件,这个技能其实在 《C++ template》中有显现过。欲深切懂得模板,此书必读!



    // linearlist.cpp实现文件
    
    #ifndef MY_LINEARLIST_CPP // 这里又来个实现文件的保护头,如许就避免了多重定义,同时经由过程.h最后的#include实现了 实际上的头文件和实现文件在一个文件中。
    #define MY_LINEARLIST_CPP
    #include
    LinearList.h
    #include
    <cstdlib>
    #include
    <ostream>
    template
    <class T>
    LinearList
    <T>::LinearList(int cap)
    {
    size
    = 0;
    capacity
    = cap;
    element
    = new T[capacity];
    }

    template
    <class T>
    LinearList
    <T>::~LinearList(void
    {
    if (element != NULL) {
    [] element;
    }
    }

    template
    <class T>
    bool LinearList<T>::isEmpty ()
    {
    return size == 0;
    }

    template
    <class T>
    int LinearList<T>::length()
    {
    return size;
    }

    template
    <class T>
    bool LinearList<T>::find(int pos,T& hold) const
    {
    if (pos > size || pos < 1return false;
    hold
    = element[pos-1];
    return true;
    }

    template
    <class T>
    int LinearList<T>::search(const T& x) const
    {
    forint i=0; i<size; ++i) {
    if (element[i] = x) {
    return i+1;
    }
    }
    return 0;
    }

    template
    <class T>
    LinearList
    <T>& LinearList<T>::drop(int pos, T& hold)
    {
    if (pos > size || pos < 1) {
    exit(
    1);
    }
    hold
    = element[pos-1];
    forint i=pos; i<size; ++i){
    element[i
    -1] = element[i];
    }
    --size;
    return this;
    }

    template
    <class T>
    LinearList
    <T>& LinearList<T>::(int pos, const T& x)
    {
    if(size == capacity){
    T
    newElement = new T[capacity2];
    capacity
    <<= 1;
    forint i=1; i<pos; ++i) {
    newElement[i
    -1] = element[i-1];
    }
    newElement[pos]
    = x;
    forint i=pos; i<size; ++i){
    newElement[i
    +1] = element[i];
    }
    ++size;
    [] element;
    element
    = newElement;
    }
    else{
    forint i=size; i>=pos; --i){
    element[i]
    = element[i-1];
    }
    element[pos
    -1] = x;
    ++size;
    }
    return this;
    }
    template
    <class T>
    void LinearList<T>::printt(ostream& outconst
    {
    forint i=0; i<size; ++i) {
    out << element[i] << ;
    }
    }
    template
    <class T>
    ostream
    & operator<< <>(ostream& outconst LinearList<T>& x) // 题目2
    {
    x.printt(
    out); return out;
    }
    #endif



     1 int main()
    
    2 {
    3 LinearList<int> L(5);
    4
    5 int y=0;
    6 L. (11);
    7 cout << L << endl;
    8 L. (22);
    9 cout << L << endl;
    10 L. (33);
    11 cout << L << endl;
    12 cout << y before: << y << endl;
    13 cout << Find << L.find(2,y) << << y << endl; // 题目3
    14 cout << y after << y << endl;
    15
    16 }




    所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
    分享到: