向顺序表中增数据
插入到顺序表头
插入到顺序表中间部分
插入到顺序表尾部,作为最后一个元素
插入元素的特点
步骤:
-
检查传入的索引是否合法
-
判断顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请
-
将元素整体向后移动一格或者直接在后一位直接插入
插入元素图示:
由上诉可知可以写三个方法和一个调用方法来实现:
检查插入位置是否合法:
int checkInt(int index)
{
//判断插入的位置本身是否由问题
if(index>t.length+1||index<1)
{
printf("插入位置有问题!!!");
return 0;
}
return index;
}
判断顺序表空间是否足够插入:
table checkSize(Table t)
{
if(t.length == t.size)
{
//扩容
t.head = (int *)realloc(t.head, (t.size+1)*sizeof(int));
return t;
}
return t;
}
实现插入元素的方法:
table addTable(table t, int element, int index)
{
//先判断传入的index
checkInt(index);
//如果传入的index>t.length直接扩容然后插入在最后一位
if(index>t.length)
{
t.head = (int *)realloc(t.head, (t.size+1)*sizeof(int));
index = t.length+1;
t.head[index] = element;
}else
{
//判断当前的顺序表是否有空间
checkSize(t);
//插入操作,需要将从插入位置开始的后续元素,逐个后移
for(int j=t.length-1; j>=index-1; j++)
{
t.head[j+1] = t.head[j];
}
//后移完成后,直接将所需插入元素,添加到顺序表的相应位置
t.head[index-1] = element;
//让长度+1
t.length++;
//返回顺序表对象
return t;
}
}
动态数组额外申请更多物理空间使用的是 realloc 函数。并且,在实现后续元素整体后移的过程,目标位置其实是有数据的,还是 3,只是下一步新插入元素时会把旧元素直接覆盖。--->所以是将原来的该位置往后的数据整体的向后复制了一遍
删除元素的特点
步骤:
-
找到目标元素
-
并将其后续所有元素整体前移 1 个位置
删除元素图示:
代码示例:
table delTable(table t, int index)
{
//判断索引是否违法
checkInt(index);
//删除操作--->从传入的位置开始,将传入的位置后面的元素复制到传入的位置处
for(int i=index; i<t.length; i++)
{
t.head[i-1] = t.head[i];
}
//位置缩短
t.length--;
return t;
}
顺序表改元素
步骤:
-
找到目标元素
-
直接赋值
示例代码:
table changeTable(table t, int element, int newElement)
{
//判断索引是否合法
checkInt(index);
//循环找位置
for(int i=0; i<t.length; i++)
{
if(t.head[i] == element)
{
t.head[i] = newElement;
}else
{
printf("元素有误");
exit(0);
}
}
}
顺序表查找元素
步骤:
-
传入表格和需要查找的元素
-
循环进行查找
int selectEle(table t, int element)
{
//循环查找
for(int j=0; j<t.length; j++)
{
if(t.head[j] == element)
{
printf("值是:");
printf(element);
}else
{
printf("找不到该值!")
}
}
}