在数据结构中,我们最先接触到的内容就是线性表,本片文章的内容就是线性表中对顺序表增删改查的c语言实现。(解释在代码中,建议边学习边看代码)
其中共包含:1、初始化 2、最后一位插入 3、遍历 4、特定位置插入数据元素 5、特定位置删除数据元素 6、查找数据元素e第一次出现的位置。
下面对函数进行解释:
1、下列代码中 我用Eelemtype 来对int 取别名,在本段代码中意义不明显,但是在大量数据中如果要改int 型为 double型,则取别名的有点就显现出来了。
2、顺序表最大值为 100
3、顺序表中包含 数据Data 和 长度 length(即位置)。
4、对结构体取别名 Sq
5、要注意顺序表的位置和在数组中序号的关系,length-1。
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
#define Max 100
typedef struct
{
Elemtype Data[Max];
int length;
}Sq;
void initList(Sq *L);//顺序表初始化,长度赋0
int addElem(Sq *L,int e);//顺序表最后一位插入
void listElem(Sq *L);//遍历顺序表
void insertElem(Sq *L,int location,int e);//在顺序表特定位置插入数据
void deleteElem(Sq *L,int location,Elemtype *e);//删除顺序表中指定位置及其值
int findElem(Sq *L,Elemtype e);//查找数据元素e第一次出现的位置
int main(int argc, char const *argv[])
{
Sq list;
initList(&list);
printf("初始化成功,长度为:%d\n",list.length);
printf("占用空间为:%ld\n",sizeof(list.Data));
addElem(&list,88);
addElem(&list,89);
addElem(&list,90);
addElem(&list,91);
addElem(&list,92);
addElem(&list,93);
addElem(&list,94);
addElem(&list,95);
addElem(&list,96);
listElem(&list);
insertElem(&list,4,100);
listElem(&list);
Elemtype *e=malloc(sizeof(Elemtype));
deleteElem(&list,3,e);
listElem(&list);
int f=findElem(&list,100);
printf("位置是%d\n",f);
return 0;
}
void initList(Sq *L)
{
L->length=0;//初始化长度为0
}
int addElem(Sq *L,Elemtype e)
{
if (L->length>=Max)//判断插入位置是否在合法范围
{
printf("顺序表已满");
}
else
{
L->Data[L->length]=e;//将数据e赋值到顺序表
L->length++;//长度因增加数据自增
}
return 1;
}
void listElem(Sq *L)
{
for (int i = 0; i < L->length; i++)//循环length次,将顺序表打印
{
printf("%d ",L->Data[i]);
}
printf("\n");
}
void insertElem(Sq *L,int location,int e)
{
if (location>=L->length+1||location<1)//判断插入位置是否在合法范围
{
printf("该位置不合法");
}
else
{
int temp=0;
L->length++;
for (int i = L->length-1; i >=location; i--)//从顺序表末尾开始,将数据元素移向下一个位置,将插入位置空出
{
L->Data[i]=L->Data[i-1];
}
L->Data[location-1]=e;
printf("插入元素完成\n");
}
}
void deleteElem(Sq *L,int location,Elemtype *e)
{
if (location>=L->length+1||location<1)
{
printf("该位置不合法");
}
else
{
*e=L->Data[location-1];
for (int i = location-1; i <=L->length; i++)//从删除位置开始,将后一项迁移
{
L->Data[i]=L->Data[i+1];
}
L->length--;//长度自减,在下次添加时,会将原有位置覆盖,达到删除效果(同steam删除游戏)
printf("删除元素完成\n");
printf("删除的元素是:%d\n",*e);
}
}
int findElem(Sq *L,Elemtype e)
{
for (int i = 0; i < L->length-1; i++)//从0开始遍历数组,找到第一个等于e的值
{
if (L->Data[i]==e)
{
return i+1;
}
}
return 0;
}