插入的大体思路:将数组从最后一个数到需要插入的位置 一直往后移一个位置 再将这个数插入即可
#include<stdio.h>
#define max 10
typedef struct {
int date[max];//表示出这个需要操作的数组
int length;//用其表示数组的长度
}sqlist;
void listinsert(sqlist &l,int i ,int e)//将e插入顺序表第i个位置
{
for (int k = l.length; k >= i; k--)//及那个i及i个位置后面的数往后推一个 注意:从最后一个数开始 否则可能会导致覆盖
l.date[k ] = l.date[k-1];//注意位置 位序和下标的关系
l.date[i-1] = e;//给空出来的位置赋值
l.length++;//数组的长度加1
}
void initlist(sqlist &l)
{
l.length = 5;//先给出长度
for (int i = 1; i < l.length; i++)
{
l.date[i-1] = i;//给顺序表中数组赋值
}
}
int main()
{
sqlist l;//建立一个顺序表l
initlist(l);//给顺序表赋初值
listinsert(l, 2, 5);//将5插入第二个位置 注意:第二个位置在数组中的表达是l.date[1]
for (int i = 0; i <= l.length; i++)
printf("%d\n", l.date[i]);
return 0;
}
同时,为了增加使用的健壮性,我们可以使用一个bool型的函数
若输入i不符合条件 反馈false 符合条件 反馈true
#include<stdio.h>
#define max 10
typedef struct {
int date[max];//表示出这个需要操作的数组
int length;//用其表示数组的长度
}sqlist;
bool listinsert(sqlist& l, int i, int e)//将e插入顺序表第i个位置
{
if (i<1 || i>l.length)
return false;//顺序表 必须按序插入 即只有4个元素的情况下 若想插入到第8个位置是无效的 这样就会有空值出现
if (l.length >= max)
return false;//如果数组长度太大 也是不行的
for (int k = l.length; k >= i; k--)//及那个i及i个位置后面的数往后推一个 注意:从最后一个数开始 否则可能会导致覆盖
l.date[k] = l.date[k - 1];//注意位置 位序和下标的关系
l.date[i - 1] = e;//给空出来的位置赋值
l.length++;//数组的长度加1
return true;//可行操作下 反馈true
}
void inlist(sqlist& l)
{
l.length = 5;//先给出长度
for (int i = 1; i < l.length; i++)
{
l.date[i - 1] = i;//给顺序表中数组赋值
}
}
int main()
{
sqlist l;//建立一个顺序表l
inlist(l);//给顺序表赋初值
if(listinsert(l, 2, 5))//将5插入第二个位置 注意:第二个位置在数组中的表达是l.date[1]
for (int i = 0; i <= l.length; i++)
printf("%d\n", l.date[i]);
return 0;
}
练习:参考数组增加一个数,尝试编码 删除数组中的一个数
提示:
同数组增加数一样 不过有一些小小的变化 数组的增加数是将数组的最后一个数往后移动 直到需要增加的这个数 。
而这里 数组的减小 在于将i的后一个数向前一个覆盖 还有&e可以确保将删除的值传回来 有一个可视性。
代码如下:
#define max 10
#include<stdio.h>
typedef struct {
int date[max];
int length;
}sqlist;
bool listdelete(sqlist &l,int i,int &e)
{
if (i > l.length || i < 1)
return false;
int k;
e = l.date[i];//记录删除值
for (k = i - 1; k < l.length - 1; k++)
l.date[k] = l.date[k + 1];
l.length--;
return true;
}
void inlist(sqlist& l)
{
l.length = 5;
for (int i = 0; i < l.length; i++)
l.date[i] = i;
}
int main()
{
sqlist l;
int e = -1;
inlist(l);
if (listdelete(l, 3, e))
printf("删除值为%d", e);
else printf("失效值");
}