线性表的逻辑结构是线性结构,采用顺序存储和链式存储。线性表包括顺序表、链表(单向链表、双向链表、单向循环链表、双向循环链表)、栈(顺序栈、链式栈)、队列(顺序队列、链式队列)。
顺序表
顺序表即数组,其在内存空间内是连续的,即顺序存储。
数组的插入和删除操作
对于数组元素的插入和删除,有以下代码:
#include <stdio.h>
void insertIntoA(int *p, int n, int post, int data)
{
for (int i = n - 1; i >= post; i--)
p[i + 1] = p[i];
p[post] = data;
}
void show(int *p, int n)
{
for (int i = 0; i < n; i++)
printf(%d , p[i]);
printf(\n);
}
void deleteFromA(int *p, int n, int post)
{
for(int i=post+1;i<n;i++)
p[i-1]=p[i];
}
int main(int argc, char const *argv[])
{
int a[100] = {1, 2, 3, 4, 5, 6, 7, 8};
show(a, 8);
insertIntoA(a, 8, 3, 100);
show(a, 9);
deleteFromA(a,9,5);
show(a,8);
return 0;
}
定义函数insertIntoA,调用该函数可以对数组插入元素,其中需要传入参数int *p(数组首地址)、int n(数组有效元素个数)、int post(插入位置的下标)、int data(插入的数据),插入时,需要先将插入位置及以后的所有数据往后挪一位,但是数组所占内存空间是连续的,不能对地址进行操作,所以只能对值进行修改,而且只能从最后一个元素开始“挪动”,否则会使原始数据被覆盖。
函数deleteFromA是对数组元素的删除操作,但只需要传入三个参数,即数组首地址、数组有效元素个数、需要删除的元素下标。删除操作和插入操作相反,只需要从需要删除的元素的下一个元素开始依次往前一位进行赋值,即可达到删除的目的
其中要注意的是,在进行插入和删除操作后,有效元素的个数会发生改变,在调用show函数对数组进行遍历输出时,传入的有效元素个数(int n)要及时修改,以免输出无效元素。
代码改进
上述代码中,我们需要随时关注有效元素的个数,这样不仅麻烦还容易出错,所以对代码进行改进:
#include <stdio.h>
int last = 9;
void insertInto(int *p, int post, int data)
{
for (int i = last; i >= post; i--)
p[i + 1] = p[i];
p[post] = data;
last++;
}
void show(int *p)
{
for (int i = 0; i <=last; i++)
printf(%d , p[i]);
printf(\n);
}
void delete(int *p,int post)
{
for (int i = post; i <=last; i++)
p[i] = p[i + 1];
last--;
}
int main()
{
int arr[32] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
show(arr);
insertInto(arr, 4, 100);
show(arr);
delete (arr, 5);
show(arr);
return 0;
}
此处定义了全局变量last,表示数组最后一个元素的下标,这样一来,只需要在插入函数和删除函数内最后对last进行自增或自减操作,这样就能保证last的值是最后一个有效元素的下标,而且last是全局变量,在该文件所有函数中均可使用,插入、遍历输出和删除函数便不再需要传入数组的有效元素个数,大大减少工作量。