学习笔记——线性表:顺序结构

学习笔记——线性表:顺序结构_第1张图片

——请先看图5秒以维持良好心情

线性表:顺序结构

  • 一介绍
  • 二步骤
    • 1.头文件
    • 2.枚举线性表的状态与定义线性表的类型
    • 3.建立线性表的结构声明
    • 4.函数声明
    • 5.主体
    • 6.为线性表分配存储空间
    • 7.线性表扩大总存储空间,与可变数组类似
    • 8.销毁线性表
    • 9.使线性表的使用空间变为0
    • 10.判断线性表的储存状态
    • 11.(为了方便理解所设置的函数)读出该位置数据
    • 12.搜索数据的位置
    • 13.线性表插入操作
    • 14.删除某一位置的数据
    • 15.求某一位置的后驱数据(元素)
    • 16.求某一位置的后驱数据(元素)
    • 17.打印线性表的数据
    • 18.将输入的临时数组输入到线性表中
    • 19.清除线性表的所有数据
    • 20.输出某一位置的数据(元素)和其前(后)驱的数据(元素)
    • 21.寻找某一数据位置
    • 22.输出线性表的长度
  • 总结

一介绍

二步骤

1.头文件

#include 
#include 

2.枚举线性表的状态与定义线性表的类型

enum Status{
	success,fail,fatal,range_error
};//枚举线性表的状态(后期有用,主要为了方便理解程序)
//定义线性表的类型
typedef int ElemType; 

3.建立线性表的结构声明

//声明线性表的大小
#define LIST_INIT_SIZE 100

typedef struct
{
//结构的主体,线性表内容的存储;
	ElemType *elem;
//线性表已被占用的空间大小
	int length;
//线性表的总空间大小
	int list_size;
}SqList, *Ptr, *SqListPtr;//建立线性表的结构

4.函数声明

Status List_Init(SqListPtr L);
void List_Destory(SqListPtr L);
void List_Clear(SqListPtr L);
bool List_Empty(SqListPtr L);
int List_Size(SqListPtr L);
Status List_Retrival(SqListPtr L, int pos, ElemType *elem);
Status List_Locate(SqListPtr L, ElemType elem, int *pos);
Status List_Insert(SqListPtr L, int pos,ElemType elem);
Status List_delete(SqListPtr L, int pos);
Status List_Prior(SqListPtr L, int pos, ElemType *elem);
Status List_Next(SqListPtr L, int pos, ElemType *elem); 
Status List_Print(SqListPtr L);

5.主体

int main()
{
	//定义一个名称为“list”的线性表
	SqList list;
	//初始化线性表的储存状态
	list.length = 0;
	printf("创建线性表输入1\n");
	printf("删除线性表中数据输入2\n");
	printf("销毁线性表输入3\n");
	while(1){
	int opt;
	//选择对线性表的操作
	scanf("%d",&opt);
	switch(opt)
	{
		case 1:{//读入数据
	int i;
	int size;
	int d;//输入将存储的数据大小
	scanf("%d",&size);
	//建立临时的数组储存数据
	int *a=(int*)malloc(sizeof(int)*size);
	
	for(i=0;i<size;i++)
	{
		//输入数据
		scanf("%d",&d);
		a[i]=d;
	}
//将临时存储数据的数组和线性表“list”的结构的地址输出到编号18函数中;
	Test_CreateList(&list, a,size);
	free(a);释放临时函数占据的内存空间;
	}break;
	//删除操作
		case 2:{
	//判断线性表“list”是否为空,如果为空则先进行读入数据的操作;
		if(List_Empty(&list)){
			printf("不存在,请输入数组\n");
	int i;
	int size;
	int d;
	scanf("%d",&size);
	int *a=(int*)malloc(sizeof(int)*size);
	for(i=0;i<size;i++)
	{
		scanf("%d",&d);
		a[i]=d;
	}
	Test_CreateList(&list, a,size);
	free(a);
		}
		int pos;
		//输入待删除的数据在表中的位置
		scanf("%d",&pos);
		//将待删除的数据在表中的位置和线性表的地址输出到186行的函数中;
		List_delete(&list, pos);
		List_Print(&list);//输出线性表的数据,查看操作结构;
		}break;
	default:{
		s=0;
		if(!List_Empty(&list)){//判断如果线性表不为空,销毁线性表;
			List_Destory(&list);
		}
		printf("结束");};
	}
	}
	return 0;
}  

6.为线性表分配存储空间

Status List_Init(SqListPtr L)
{
	Status s=fail;//先将其操作状态定义为失败
	if(L != NULL)//判断线性表是否存在
	{
		L->elem = ( ElemType* )malloc(LIST_INIT_SIZE*sizeof(ElemType));//为线性表分配LIST_INIT_SIZE个单位的空间;
		{
			L->list_size = LIST_INIT_SIZE;//申明线性表的总空间大小;
			L->length = 0;初始化线性被使用的空间;
			s = success;将操作状态变为成功;
		}	
	}
	return s;
}

7.线性表扩大总存储空间,与可变数组类似

void List_Add(SqListPtr L,int nums){
	SqListPtr news;
	news->elem  = ( ElemType* )malloc(nums*10*sizeof(ElemType));
	for(int i=0;i<L->length ;i++){
		news->elem  [i]=L->elem [i];
	}
	free(L->elem );
	L->elem = news->elem  ;
}

8.销毁线性表

void List_Destory(SqListPtr L)
{
	
	if (L)
	{
		if (L->elem)
		{
			free(L->elem);//释放线性表占据的空间
			L->elem = NULL;//指针置为空
			L->length = 0;
		}
	}
}

9.使线性表的使用空间变为0

void List_Clear(SqListPtr L){
	if(L)
	{
		L->length = 0;
	}
}

10.判断线性表的储存状态

bool List_Empty(SqListPtr L)
{
	return (L->length == 0);
}

11.(为了方便理解所设置的函数)读出该位置数据


Status List_Retrival(SqListPtr L, int pos, ElemType *elem)
{
//使操作状态定义为失败
	Status s = range_error;
 	if(L)
	{
		if( pos >=0 && pos<  L->length)
		{
			*elem = L->elem[pos];
		//使操作状态变为成功;			
			s = success;
		}
	}
	return s;
}

12.搜索数据的位置

Status List_Locate(SqListPtr L, ElemType elem, int *pos)
{
	Status s = range_error;
 	int i = 0;
	if (L)
	{
	//遍历表中的数组(元素)
		for (i = 0; i < L->length; i++)
		{
			if (L->elem[i]==elem)//比较
			{
				*pos = i;
				s = success;
				break;
			}
		}
	}
	return s;
}

13.线性表插入操作

Status List_Insert(SqListPtr L, int pos,ElemType elem)
{
	Status s = range_error;
	int i;
	if (L)
	{
	//使线性表被使用空间加一
		L->length++;
		//判断该位置是否存在
		if(pos <= L->length)
		{
			int nums=L->length /10 + 1;
			List_Add( L, nums);
		}
		if(pos>=0 && pos < L->length)//
		{
			if (L->length < L-> list_size)
			{
				for( i=L->length-1;i>=pos;i--){
				L->elem[i+1]=L->elem[i];
				}
				L->elem[pos]=elem;
				s= success;
			}
		}
	}
	return s;
}

14.删除某一位置的数据

Status List_delete(SqListPtr L, int pos){
	Status s=range_error;
	int i;
	if(L){
	//判断位置是否被使用
		if(pos>=0&&pos<L->length){
		//判断存储空间是否不足
			if (L->length < L-> list_size){
		//将该位置之后一个的数据覆盖此位置的数据,并将往后的数据依次前移
		 		for(i=pos;i<L->length-1;i++){
					L->elem[i]=L->elem[i+1];
				}
				//占用空间数目减一
				L->length--;
				s=success;
			}
		}
	}
	return s;
}

15.求某一位置的后驱数据(元素)

Status List_Prior(SqListPtr L, int pos, ElemType *elem)
{
	Status s;
	//判断线性表是否存在
	if(L){
	//判断该位置的存储空间是否被使用
		if(pos > 0 && pos < L->length){
		*elem = L->elem[pos - 1];
		s =success;
		}
	}
	return s;
}

16.求某一位置的后驱数据(元素)

Status List_Next(SqListPtr L, int pos, ElemType *elem)
{
	Status s;
	//判断线性表是否存在
	if(L){
	//判断该位置的存储空间是否被使用
		if(pos >= 0 && pos < L->length){
		*elem = L->elem[pos + 1];
		s =success;
		}
	}
	return s;
}

17.打印线性表的数据

void List_Print(SqListPtr L)
{

	int i;
	if(L){
		for(i=0;i<L->length;i++){
			printf("%d ",L->elem[i]);
			if((i+1) %10 == 0){
			printf("\n");
		}
	}
	}
}

18.将输入的临时数组输入到线性表中

Status Test_CreateList(SqListPtr list,ElemType data[],int n)
{
	Status s = fail;
	int i;
	s = List_Init(list);
	if (s == success)
	{
		//遍历数组的每个数据元素并依次输入到线性表中
		for(i=0; i<n;i++)
		{
			s = List_Insert(list, i, data[i]);
			if (s!=success){
				break;
			}
		}
		List_Print(list);
	}
	return s;
}

19.清除线性表的所有数据

Status Test_ClearList(SqListPtr list)
{
	Status s = fail;
	if(!List_Empty(list))
	{
		List_Clear(list);
		if(List_Empty(list)){
			s = success;
		}
	}
	return s;
}

20.输出某一位置的数据(元素)和其前(后)驱的数据(元素)

Status Test_RetrivalPriorNext(SqListPtr list,int pos){
	Status s = range_error;
	ElemType e;
	s = List_Retrival(list, pos, &e);
	if (s == success)
	{
		printf("%d的元素是%d\n",pos,&e);
		s=List_Prior(list,pos,&e);
		if(s==success){
			printf("%d的直接前驱元素%d\n",pos,e);
		}
		else{
			printf("没有直接前驱\n");
		}
		s=List_Next(list, pos, &e);
		if(s==success){
		printf("%d的直接后继元素是%d\n", pos, e);
		}else{
		printf("没有直接后继\n");
		}
	}else{
		printf("位置不合法\n");
	}
	return s;
}

21.寻找某一数据位置

Status Test_Locate(SqListPtr list,ElemType e)
{
	Status s;
	int pos;
	s=List_Locate(list, e, &pos);

	if (s==success)
	{
		printf("%d的位置是%d\n",e,pos);
	}
          else{
		printf("无法找到");
	}
	return s;
}

22.输出线性表的长度

int List_Size(SqListPtr L)//(为了方便理解所设置的函数)
{
	return L->length;
}
void Test_Size(SqListPtr list)
{
	int len;
	len = List_Size(list);
	printf("线性表的长度%d\n",len);
}

总结

这里没有将所有操作在主函数中写出,但是列出了所需要的函数,
看到这里你应该心有所感了吧,自己试试实现剩余操作,检验学习成果。

你可能感兴趣的:(学习,c语言)