数据结构之线性表

/*
 * Copyright (c) 2012 Fang Ying (Y. Fang), NEU Electric Engineering 20092725 ,fangying712@gmail.com
 * 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;
}

 

posted @ 2012-06-15 17:50  fangying  阅读(186)  评论(0编辑  收藏  举报