顺序表的初始化
class List
{
public:
int size;//最多可容纳元素
int count;//当前的元素
int* data;
List() {
size = 10;
data = new int[10];
count = 0;
}
~List()
{
delete data;
count = 0;
}
};
1,顺序表的插入
//输入位置是从0开始
void insert(int pos,int value)
{
if (pos < 0 || pos >= count)
{
cout << "插入失败" << endl;
return;
}
if (size == count)
{
cout << "插入失败" << endl;
return;
}
for (int i = count - 1; i >= pos; i--)
{
data[i + 1] = data[i];
}
data[pos] = value;
count++;
return;
}
2,顺序表的删除
void del(int pos)
{
if (pos < 0 || pos >= count)
{
cout << "删除失败" << endl;
return;
}
for (int i = pos + 1; i < count; i++)
{
data[i - 1] = data[i];
}
count--;
return;
}
3,有趣的输出操作
void display()
{
//这是一个非常有意思的输出方式
int len = 0;
for (int i = 0; i < count; i++)
{
len += printf("%5d", i);
//len是用来记录总共的长度,i代表的是下标顺序
}
cout << endl;
for (int i = 0; i < len; i++)
{
cout << "-";
}
cout << endl;
for (int i = 0; i < count; i++)
{
printf("%5d", data[i]);
}
cout << endl;
}
4,顺序表的扩容
//顺序表的的扩容操作
int expand()
{
//2倍扩容法
//1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
//2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
//3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
//最害怕就是最后一种情况,会返回空地址,原来的数据会丢失
cout << "扩容操作启动" << endl;
int *p = (int *)realloc(data, sizeof(int) * 2 * size);
if (p == NULL)
{
return 0;
cout << "失败" << endl;
}
data = p;
size *= 2;
return 1;
}