标签:静态链表
//静态链表,我觉得删除,排序,插入有意思。
#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;
}
标签:静态链表
原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/46591459