线性表的顺序存储方式的实现(C语言实现)

线性表的顺序存储方式的实现 

前言:

线性表:较为常用简单的一种数据结构,一个线性表是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;
}

运行结果

希望对你们有帮助

猜你喜欢

转载自blog.csdn.net/weixin_46272577/article/details/110322227