数据结构之线性表

/*

 * Copyright (c) 2012 Fang Ying (Y. Fang), NEU Electric Engineering 20092725 ,[email protected]

 * Copyright (c) GPLv3

 * All Rights Reserved.

 * This program is free software; 

 *you can redistribute it and/or modify it under the terms of the GNU General Public License V3 as published by the

 * Free Software Foundation, either version 2 or any later version.

 *

 * Redistribution and use in source and binary forms, with or without

 * modification, are permitted provided that the following conditions are met:

 *

 * 1. Redistributions of source code must retain the above copyright notice,

 *    this list of conditions and the following disclaimer.

 *

 * 2. Redistributions in binary form must reproduce the above copyright

 *    notice, this list of conditions and the following disclaimer in the

 *    documentation and/or other materials provided with the distribution.

 *

 * This program is distributed in the hope that it will be useful, but WITHOUT

 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for

 * more details. A copy of the GNU General Public License is available at:

 * http://www.fsf.org/licensing/licenses

 */

 

#ifndef _SQ_LIST_H_

#define _SQ_LIST_H_



#include <iostream>

using namespace std;



//定义一个类模版

template <class T>

class sq_list

{

private :

    int max;        //    存储空间长度

    int n;            //    顺序链表长度v

    T *v;            //    顺序链表存储空间首地址

    

public :

    sq_list(){max = 0; n = 0; return ;}

    sq_list(int);                    //    建立空链表,申请存储空间

    ~sq_list();                        //    析构函数

    void print();                    //    打印顺序链表的元素和长度

    int  flag();                    //    检测链表状态

    void insert(int , T);            //    在表中的指定位置插入新的元素

    void remove(int );                //    在表中的指定位置删除一个元素

    int  find(T );                    //  在表中查找一个指定的数据

    int  size();                    //  返回线性表的长度

    T      get(int);                    //  获得某个元素

    void sort();                    //    对顺序表进行排序,使用冒泡法

};



//建立一个空的顺序链表

template <class T>

sq_list<T>::sq_list(int max)

{

    this->max = max;                    //    存储空间容量

    v = new T[max];                        //    动态申请存储空间

    n = 0;                                //  初始长度为0

    return ;

}



//顺序输链表中的元素和顺序表的长度

template <class T>

void sq_list<T>::print()

{

    int i;

    cout<<"n = "<<n<<endl;

    for (i = 0; i < n; i++) 

        cout<<"v"<<"["<<i<<"]"<<"\t:"<<v[i]<<endl;        //    输出表中的元素

    return ;

}



//检测顺序链表的状态

template <class T>

int sq_list<T>::flag()

{

    if (n == max)    return -1;    //    存储空间已满,返回-1

    if (n == 0)        return 0;    //    链表为空,返回0

    return    1;                    //    正常,返回1

}



//在链表指定位置插入新的元素

template <class T>

void sq_list<T>::insert(int i, T b)

{

    int k;

    if (n == max)

        {cout<<"sq_list overflow !"<<endl; return;}

    if (i > n) i = n + 1;                    //    默认在最后一个元素之后插入

    if (i < 1)    i = 1;                        //    默认在第一个元素之后插入

    for (k = n; k >= i; k--)                

        v[k] = v[k-1];                        //    从最后一个元素直到第i个元素后移一位

    v[i-1] = b;                                //    插入新的元素

    n += 1;                                    //    链表长度加1

    return ;

}



//在顺序链表指定位置删除元素

template <class T>

void sq_list<T>::remove(int i) 

{

    int k;

    if (n == 0)

        {cout<<"sq_list underflow"; return ;}

    if ((i < 0)||(i > n))

    {

        cout<<"No this element in the list!"<<endl;        // 要删除的元素不存在

        return ;

    }

    for (k = i; k < n ; k++)

        v[k-1] = v[k];                        // 从第i个元素直到最后一个元素均向前移动一个位置

    n--;

    return ;

}



//顺序表中的元素进行排序,使用冒泡法,小泡泡在下面大泡泡在上面

template <class T>

void sq_list<T>::sort()

{

    int i,j;

    T temp;

    if(0 == n)

        {cout<<"sq_list is empty !"<<endl; return;}        // 顺序表为空的情况

    for(i = 0; i < n-1; i++ )

    {

        for(j = 0; j < n-i; j++)

        {

            //冒泡排序

            if(v[j] < v[j+1])

            {

                temp = v[j];

                v[j] = v[j+1];

                v[j+1] = temp;

            }

        }

    }

    return ;

}

//查找一个数

template <class T>

int sq_list<T>::find(T t)

{

    int i = 0;

    for(i; i < n; i++)

    {

        if(t == v[i])    return i;

    }

    return -1;

}





//返回线性表的长度

template <class T>

int sq_list<T>::size()

{

    return n;

}



//返回线性表的元素

template <class T>

T sq_list<T>::get(int i)

{

    return v[i];

}



//线性表空间回收

template <class T>

sq_list<T>::~sq_list()

{

    delete v;

}

#endif
#include "sq_list.h"



int main() 

{

	sq_list<double> s_double(10);		//建立一个容量为100的顺序链表

	cout<<"第一个输出顺序表对象 s_double:"<<endl;

	s_double.print();

	s_double.insert(0, 1.5);

	s_double.insert(1, 2.3);

	s_double.insert(2, 1.0);

	s_double.insert(3, 1.2);

	s_double.insert(4, 3.5);

	

	cout<<"第二次输出的顺序表对象:"<<endl;

	s_double.print();

	cout<<"对顺序表进行排序:"<<endl;

	s_double.sort();

	cout<<"第3次输出的顺序表对象:"<<endl;

	s_double.print();

	s_double.sort();

	cout<<"删除下列下列元素:"<<endl;

	s_double.remove(0);

	s_double.remove(1);

	cout<<"第三次输出的顺序表:"<<endl;

	s_double.print();

	

	return 0;

}

 

你可能感兴趣的:(数据结构)