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

C++静态链表

时间:2015-06-22 11:11:51      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:静态链表

//静态链表,我觉得删除,排序,插入有意思。
#include <iostream>
#define _MAX_ 0x7fffffff
using namespace std;

template<typename Type>
struct Node
{
    Type data;//保存的值
    int cour;//下标,只用一个下标来解决问题。
};

template<typename Type>
class GList
{
public:
    GList(int n ,Type a[])
    {
        node = new Node<Type>[n];
        size = n;
        space = n;//空间容量大小。
        int i = 0;
        for (; i < size; i++)
        {
            node[i].cour = i;//将下标赋值。
            node[i].data = a[i];//将值赋值。
        }
    }
    void Sort()//排序。
    {
        int *save = new int[size];//记录下标是否改变。
        int i = 0;
        for (; i < size; i++)
        {
            save[i] = 0;//记录的初始值都设置为0。
        }
        i = 0;
        int j;
        int tmp;
        int m = size - 1;
        int flags = 0;//记录最小位置。
        int k = 0;
        while (m>=0)
        {
            for (; i < size; i++)//找到剩余第一个没有排序的。
            {
                if (save[i] == 0)
                    break;
            }
            if (i >= size)return;//没有找到说明排序结束了。
            tmp = node[i].data;
            for (j = i + 1; j < size; j++)
            {
                if (tmp > node[j].data && save[j] == 0)
                {
                    flags = j;
                    tmp = node[j].data;//交换比较值。
                }
            }
            node[flags].cour = k++;//赋值下标。
            save[flags] = 1;//标记。
            flags = i;//这里必须让flags还原,如果它没有进入循环的话,那么这个就可以起作用了。
            i = 0;//从0位置开始找。
            m--;
        }
        delete[] save;
        save = NULL;
    }
    void GetSpace()
    {
        space *= 2;//开辟两倍的空间。
        Node<Type>* tmp = new Node<Type>[space];
        int i = 0;
        for (;i<size;i++)
        {
            tmp[i].data = node[i].data;
            tmp[i].cour = i;
        }
        delete[]node;
        node = NULL;
        node = tmp;
    }
    void Insert(int x)
    {
        //既然要插入元素,肯定是在静态链表后面插入,且第一次肯定空间是不足的,所以
        //在这里我选择开辟两倍的空间并且将原来的数据拷贝过来。
        if (space <= size)
            GetSpace();
        int i = 0;
        node[size].data = x;
        node[size].cour = size;
        size++;
        Sort();//这里直接调用这个函数,我感觉比较无耻。
        //如果不调用这个排序函数,应该怎么做呢?挺麻烦的。
    }
    void Delete(int x)
    {
        int i = 0;
        for (; i < size; i++)
        {
            if (x == node[i].data)
            {
                node[i].data = node[size - 1].data;
                node[i].cour = node[size - 1].cour;//用最后一个覆盖这个位置的值。
                size--;
            }
        }
        for (i = 0; i < size; i++)
        {
            node[i].cour = i;
        }
        Sort();
    }
    void Printf()//打印。
    {
        int i = 0;
        for (; i < size; i++)
        {
            cout << node[i].data << "    ";
        }
        cout << endl;
        for (i=0; i < size; i++)
        {
            cout << node[i].cour << "    ";
        }
        cout << endl;

    }
private:
    Node<Type> *node;
    int size;
    int space;
};

int main()
{

    int a[] = { 2, 8, 4,0, 1 };
    GList<int> gl(5 ,a);
    gl.Sort();
    gl.Printf();
    cout << "-----------------" << endl;
    gl.Insert(-1);
    gl.Insert(5);
    gl.Printf();
    cout << "-----------------" << endl;
    gl.Delete(4);
    gl.Printf();
    return 0;
}

C++静态链表

标签:静态链表

原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/46591459

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