线性表顺序存储结构占用一片连续的存储空间,知道某个元素的存储位置就可以计算其他元素的存储位置。
对于顺序表,查找某个数据花费常数时间,顺序表的打印以线性时间执行,但对于插入和删除操作的花费是巨大的。对于插入操作,需要将插入位置后面的数据后移一个位置一空出空间;对于删除操作,需要将删除位置之后的数据前移一个位置 ,最坏情况下的时间复杂度为O(N)。因此顺序表的缺陷为:插入和删除操作运行时间缓慢,并且表的大小必须事先已知。
以下的代码全部由C语言实现。
一、头文件和宏定义
MAXSIZE 大小根据需求可以自己定义。
#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 10 //数组的最大长度
二、顺序表的结构体
typedef struct{ //顺序表的初始化
int *data; //定义顺序表中元素类型的数组指针
int length; //当前顺序表的长度
}SqList;
三、 顺序表的初始化
exit(EXIT_FAILURE)是一种常见的用法,它使用了C标准库中定义的宏常量EXIT_FAILURE作为exit()函数的参数。EXIT_FAILURE是一个表示程序执行失败的宏常量,其值通常为非零值。根据标准,EXIT_FAILURE的值可以是1。所以, exit(EXIT_FAILURE)等效于exit(1)。
void InitList_sq(SqList *L){
L->data=(int *)malloc(sizeof(int)*MAXSIZE);
if(!L->data) //判断分配是否成功
exit(EXIT_FAILURE);
L->length=0;
}
四、给顺序表添加元素
输入时数据之间以空格隔开。
void WriteList(SqList *L){
int i,j;
printf("请输入你要输入的数据元素个数:");
scanf("%d",&j);
printf("请输入%d个数据元素:",j);
for(i=L->length;i<L->length+j;i++){
scanf("%d",&L->data[i]);
}
L->length=L->length+j;
printf("添加完成!!!\n");
}
五、求顺序表的长度
int GetLength(SqList *L){ //求顺序表的长度
return L->length;
}
六、判断顺序表是否为空
int IsEmpty(SqList *L){ //判断顺序表是否为空
if(L->length==0){
return 0;
}
else {
return 1;
}
}
七、从顺序表中取值 (由序号找数据)
void GetElem(SqList *L){ //从顺序表中取值 (由序号找数据)
int i;
printf("请输入要查找的数据的位置:");
scanf("%d",&i);
if(i<1||i>L->length){
printf("不存在第%d个数据!!!\n",i);
}
else{
printf("第%d个数据为:%d\n",i,L->data[i-1]);
}
}
八、从顺序表中查找(由数据找序号)
void LocateElem(SqList *L){ //从顺序表中查找(由数据找序号)
int i,j;
printf("请输入要查找的数据:");
scanf("%d",&i);
for(j=0;j<L->length;j++){
if(i==L->data[j]){
printf("%d的位置为:%d\n",i,j+1); //查找成功,返回序号
break; //满足则跳出循环,防止执行下面的if语句
}
else if(j+1==L->length){ //查找失败
printf("数据不存在!!\n");
}
}
}
九、顺序表的插入操作
void InsertList(SqList *L){ //顺序表的插入
int i,j,x;
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要插入的数据:");
scanf("%d",&x);
if(i<1||i>L->length+1){ //插入位置不合法
printf("插入位置不存在I!!\n");
}
else if(L->length==MAXSIZE){ //当前存储空间已满
printf("当前顺序表已满,请删除部分数据后在插入!!\n");
}
else{
for(j=L->length;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1]=x;
printf("插入成功!!!\n");
L->length++;
}
}
十、顺序表的删除操作
void DeleteList(SqList *L) { //删除元素
int i,j;
printf("请输入要删除元素的位置:");
scanf("%d",&i);
if(i<1||i>L->length){
printf("要删除元素不存在!!!\n");
}
else{
for(j=i;j<L->length;j++){
L->data[j-1]=L->data[j];
}
printf("删除成功!!!\n");
L->length--;
}
}
十一、顺序表的打印
void PrintList(SqList *L){ //打印顺序表
int i;
for(i=0;i<L->length;i++){
printf("%d\t",L->data[i]);
}
if(L->length>0) {
printf("\n");
printf("打印完成\n");
}
else{
printf("顺序表为空!!\n");
}
}
十二、清空顺序表
void ClearList(SqList *L){ //清空顺序表
L->length=0;
}
十三、销毁顺序表
void DestoryList(SqList *L){ //销毁顺序表
free(L->data);
L->length=0;
L->data=NULL;
}
十四、菜单
void menu(){
printf( "**********************************************************************\n");
printf( "**************** 1.输入1 给顺序表添加元素 *******************\n");
printf( "**************** 2.输入2 求顺序表的长度 ********************\n");
printf( "**************** 3.输入3 判断表是否为空 ********************\n");
printf( "**************** 4.输入4 从顺序表中取值 ********************\n");
printf( "**************** 5.输入5 从顺序表中查找 ********************\n");
printf( "**************** 6.输入6 顺序表的插入 *********************\n");
printf( "**************** 7.输入7 删除元素 ***********************\n");
printf( "**************** 8.输入8 打印顺序表 **********************\n");
printf( "**************** 9.输入9 清空顺序表 **********************\n");
printf( "**************** 10.输入10 销毁顺序表 ********************\n");
printf( "**************** 11.输入11 退出程序 *********************\n");
printf( "********************************************************************\n");
}
十五、主函数
int main()
{
SqList L;
int n;
InitList_sq(&L);
menu();
printf("请输入要进行的操作序号:");
while(scanf("%d",&n)){
if(n==11){
printf("已退出程序!!!\n");
free(L.data);
break;
}
else{
switch(n){
case 1:
WriteList(&L);
printf("请输入要进行的操作序号:");
break;
case 2:
printf("顺序表长度为:%d\n",GetLength(&L));
printf("请输入要进行的操作序号:");
break;
case 3:
if(0==IsEmpty(&L)){
printf("顺序表为空!!\n");
}
else{
printf("顺序表不为空!!\n");
}
printf("请输入要进行的操作序号:");
break;
case 4:
GetElem(&L);
printf("请输入要进行的操作序号:");
break;
case 5:
if(L.length==0){
printf("顺序表为空!!\n");
}
else{
LocateElem(&L);
}
printf("请输入要进行的操作序号:");
break;
case 6:
InsertList(&L);
printf("请输入要进行的操作序号:");
break;
case 7:
DeleteList(&L);
printf("请输入要进行的操作序号:");
break;
case 8:
PrintList(&L);
printf("请输入要进行的操作序号:");
break;
case 9:
ClearList(&L);
printf("清空成功!!\n");
printf("请输入要进行的操作序号:");
break;
case 10:
DestoryList(&L);
printf("销毁成功!!\n");
printf("请输入要进行的操作序号:");
break;
default:
printf("您的输入有误,请重新输入!!!\n");
printf("请输入要进行的操作序号:");
}
}
}