线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。
可以理解为一个数组:
元素 | a1 | a2 | a3 | a4 | a5 |
下标 | 0 | 1 | 2 | 3 | 4 |
首先定义数据元素:
//定义数据元素
typedef struct Element //typedef 相当于重命名
{
int id;
char name[50];
}Element;
//这样写,就可以直接 Element a;不用在 struct Element a;
然后定义顺序表结构:
define SIZE 255 //定义顺序表的长度
//定义顺序表结构
typedef struct Sequencelist //同样取别名
{
Elements datas[SIZE]; //数据元素组成的数组上面那个定义数据元素的Element
int length; //记录顺序表的长度
}Seqlist; //别名
然后开始实现顺序表:
实现几个功能:初始化,增删改查
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 255 //定义顺序表的长度
typedef struct Element
{
int id;
char name[50];
}Element;
//定义顺序表结构
typedef struct Sequencelist //同样取别名
{
Element datas[SIZE]; //数据元素组成的数组上面那个定义数据元素的Element
int length; //记录顺序表的长度
}Seqlist; //别名
//定义几个初始数据,一会用来初始化
Element datas[]={
{1,"大帅比1"},
{2,"大帅比2"},
{3,"大帅比3"},
{4,"大帅比4"}
};
//顺序表的初始化 传入顺序表,要插入的初始化的元素数组,和初始化元素的个数,也就是长度
void InitSeqlist(Seqlist* seqlist,Element* element,int length);
//顺序表的插入 传入顺序表,插入的元素,要插入的位置的下标 (增)
void InsertSeqlist(Seqlist* seqlist,Element element,int index);
//顺序表的删除 传入顺序表,要删除的元素的下标 (删)
void DeleteSeqlist(Seqlist* seqlist,int index);
//顺序表的插入 传入顺序表,要修改的元素的名字 (改)
void ModifySeqlist(Seqlist* seqlist,char delete_name[]);
//顺序表的打印 (查)
void PrintSeqlist(Seqlist* seqlist);
int main(void)
{
Seqlist seqlist;
InitSeqlist(&seqlist,datas,sizeof(datas)/sizeof(datas[0]));
PrintSeqlist(&seqlist);
printf("请输入要删除的元素的下标:");
int index;
scanf("%d",&index);
DeleteSeqlist(&seqlist,index);
PrintSeqlist(&seqlist);
printf("请输入要删除的元素名字:");
char delete_name[50];
scanf("%s",delete_name);
ModifySeqlist(&seqlist,delete_name);
PrintSeqlist(&seqlist);
return 0;
}
//顺序表的初始化 传入顺序表,要插入的初始化的元素数组,和初始化元素的个数,也就是长度
void InitSeqlist(Seqlist* seqlist,Element* element,int length)
{
seqlist->length = 0;//切记切记,长度要初始化为0,不然垃圾值
//检测插入的长度不能超过最大容量
if(length > SIZE)
{
return;
}
int i;
for(i = 0;i < length ;i++)
{
//插入要初始化的元素
InsertSeqlist(seqlist,element[i],i);
}
}
//顺序表的插入 传入顺序表,插入的元素,要插入的位置的下标
void InsertSeqlist(Seqlist* seqlist,Element element,int index)
{
//验证插入后的元素是否超过了最大程度
if(seqlist->length + 1 >= SIZE)
{
printf("数组已满,插入元素失败!\n");
return;
}
//下标位置是否合法
if(index < 0 || index > SIZE - 1)
{
printf("插入下标位置不对!\n");
return;
}
//下标在所在长度之内
if(index > seqlist->length)
{
printf("下标插入位置超过长度!\n");
return;
}
//实现插入
int i;
for(i = seqlist->length - 1;i >= index;i--)
{
seqlist->datas[i+1] = seqlist->datas[i];
}
//把要插入的值给index下标
seqlist->datas[index] = element;
//顺序表长度++
seqlist->length++;
}
//顺序表的打印
void PrintSeqlist(Seqlist* seqlist)
{
int i;
for(i = 0;i < seqlist->length;i++)
{
printf("%d %s\n",seqlist->datas[i].id,seqlist->datas[i].name);
}
}
//顺序表的删除 传入顺序表,要删除的元素的下标, (删)
void DeleteSeqlist(Seqlist* seqlist,int index)
{
//判断要删除的元素下标在不在长度范围之内
if(index < 0||index > seqlist->length-1)
{
printf("要删除的元素下标在不在长度范围之内\n");
return;
}
int i;
for(i = index;i < seqlist->length;i++)
{
seqlist->datas[i] = seqlist->datas[i+1];
}
seqlist->length--;
}
//顺序表的插入 传入顺序表,要修改的元素的名字 (改)
void ModifySeqlist(Seqlist* seqlist,char delete_name[])
{
int i;
for(i = 0;i < seqlist->length;i++)
{
if(strcmp(seqlist->datas[i].name,delete_name)==0)
{
printf("请输入要修改为什么名字:\n");
char modify_name[50];
scanf("%s",modify_name);
strcpy(seqlist->datas[i].name,modify_name);
printf("修改成功\n");
return;
}
printf("未找到要修改的元素!\n");
}
}
顺序表的基本的增删改查就完成了,喜欢的话,点个赞呗,啾咪!