线性表的顺序存储方式的实现
前言:
线性表:较为常用简单的一种数据结构,一个线性表是n个数据元素的有序序列,每个数据元素的具体含义可由自身的结构体来决定。
稍复杂的线性表,一个数据元素可以由若干个数据项组成,这种情况下通常将数据元素称为记录,含有大量记录的线性表又称为文件。
线性表的顺序表示:用地址连续的存储单元一次存储线性表的数据元素---数组。
定义结构体
typedef struct List{
int data[MAX_SIZE];//数组
int length;//长度
}SqList;
构造函数
//构造函数
void Init_List(SqList *L)
{
L->length = 0;//元素个数
printf("enter the 5 numbers:\n");
for(int i= 0; i < 5 ;i++)
{
scanf("%d", &L->data[i]);
L->length++;//长度增加
}
}
插入函数(实现较为简单,没有考虑增加空间的方法)
//插入函数
void Insert_List(SqList *L, int i, int e)
{
int loc = i-1;
if (i<1 || i>L->length+1) return exit(OVERFLOW);//判断位置合法
for (int j = L->length; j >= loc; j--)
L->data[j+1] = L->data[j];//向后移动
L->data[loc] = e;//赋值
L->length++;//长度加一
}
插入元素
这个时候就要开始判断了,既然是插入元素。那么我们需要告诉函数,所需要插入的线性表,插入元素的位置,和插入元素的值。我们还要判断插入的位置是否合理,还要判断容量空间是否够,如果不足需要增补空间。
在数组里面插入元素,需要将以后的元素后移,腾出位置再进行插入元素赋值后,表的的长度加一。
- 输入表,位置,元素
- 判断位置是否合适
- 判断长度是否够
- 是否增添空间
- 元素后移
- 元素插入
- 表长增加
删除函数
//删除函数
void Delete_List(SqList *L, int i)
{
int e;
int loc = i-1;
if (i<1 || i>L->length) return exit(OVERFLOW);//判断位置合法
e = L->data[loc];//保留删除值
for (int j = loc; j <= L->length; j++)
L->data[j] = L->data[j+1];//向前移动
L->length--; //长度减一
}
在数组里面删除元素,需要将以后的元素前移,表的的长度减一。
- 输入表,位置,元素
- 判断位置是否合适
- 元素保留
- 元素前移
- 表长减一
根据位置返回值
//根据位置返回值
int GetElem_List(SqList *L, int i)
{
int e;
if (i<1 || i>L->length) return 0;
e = L->data[i-1];
return e;
}
返回表长
//返回长度
int Length_List(SqList *L)
{
return L->length;
}
毁坏表
void Destroy_List(SqList *L)
{
L->length = 0;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -1
#define MAX_SIZE 100
typedef struct List{
int data[MAX_SIZE];
int length;
}SqList;
//构造函数
void Init_List(SqList *L)
{
L->length = 0;//元素个数
printf("enter the 5 numbers:\n");
for(int i= 0; i < 5 ;i++)
{
scanf("%d", &L->data[i]);
L->length++;
}
}
//插入函数
void Insert_List(SqList *L, int i, int e)
{
int loc = i-1;
if (i<1 || i>L->length+1) return exit(OVERFLOW);
for (int j = L->length; j >= loc; j--)
L->data[j+1] = L->data[j];
L->data[loc] = e;
L->length++;
}
//删除函数
void Delete_List(SqList *L, int i)
{
int e;
int loc = i-1;
if (i<1 || i>L->length) return exit(OVERFLOW);
e = L->data[loc];
for (int j = loc; j <= L->length; j++)
L->data[j] = L->data[j+1];
L->length--;
}
//返回长度
int Length_List(SqList *L)
{
return L->length;
}
//展示函数
void Show_List(SqList *L)
{
for (int i=0; i < L->length; i++)
printf("%d ", L->data[i]);
}
//返回值
int GetElem_List(SqList *L, int i)
{
int e;
if (i<1 || i>L->length) return 0;
e = L->data[i-1];
return e;
}
void Destroy_List(SqList *L)
{
L->length = 0;
}
void menu()
{
printf("----------------------------------------------------------------------\n");
printf("Choice a number:\n");
printf("1.Init_List 2.Insert_List \n");
printf("3.Delete_List 4.Length_List \n");
printf("5.GetElem_List 6.List_List \n");
printf("6.Destroy_List 7.Show_List \n");
printf("----------------------------------------------------------------------\n");
}
//主函数
int main()
{
menu();
int i, e;
int n,n1,n2,n3,n4;
SqList L;
while (1)
{
printf("Choice a number:\n");
scanf("%d", &n);
switch(n)
{
case 1:
Init_List(&L); break;
case 2:
printf("enter the location and the elem:");
scanf("%d%d", &i, &e);
Insert_List(&L, i, e);
Show_List(&L);break;
case 3:
printf("enter the the location:");
scanf("%d", &i);
Delete_List(&L, i);
Show_List(&L);break;
case 4:
printf("%d",Length_List(&L)); break;
case 5:
printf("enter the the location:");
scanf("%d", &i);
printf("%d",GetElem_List(&L,i)); break;
case 6:
Destroy_List(&L);
Show_List(&L); break;
case 7:
Show_List(&L); break;
default:printf("please enter the numbers in certain:\n"); break;
}
}
return 0;
}
运行结果
希望对你们有帮助