《数据结构》c语言版学习笔记——线性表的顺序存储结构

线性表的顺序存储结构

第一章 线性表的顺序存储结构



前言

数据结构是大学里计算机专业类必掌握的一门课程,它很重要,尤其是对一些考研的计算机类学生来说,通常为专业课。数据结构并不是哪种编程语言所设定的,它可以用c语言来写,也可以用c++、java、python等等,学会了一门编程语言,仅仅只是掌握一些,而学会了数据结构可以掌握很多技巧和算法并不断提高编程能力,这对将来很重要。


提示:本系列文章均使用Visual Studio 2019编程,编程语言为c语言。

一、顺序存储结构的建立

1.条件

设顺序线性表L,n为数据元素,则1 ≦ n ≦ ListLength(L),这里解释一下这个闭区间,首先我们知道线性表是从1开始的,而不是像数组从0开始,这点要知道,所以n的值不能小于1,并且不能大于该线性表的长度。
我们设该线性表的存储空间为20,即#define MAXSIZE 20,然后假设ElemType为int类型,使用一个结构体,定义一个data数组来存储数据元素,length为当前长度。
即,我们可知道建立一个顺序线性表有三个要点:
①首先要定义其最大存储量
②存储空间
③线性表的当前长度

2.代码

#include <stdio.h>
#define MAXSIZE 20            //设定存储空间初始分配量
//顺序存储结构的建立
typedef int ElemType;
typedef struct
{
    
    
	ElemType data[MAXSIZE];   //数组存储数据元素,最大值为MAXSIZE
	int length;               //线性表当前长度
}SqList;

二、顺序存储结构的获得元素

1.条件

首先这里返回值类型Status是一个int整型,返回OK代表1,返回ERROR代表0。我们要实行GetElem操作,即将顺序线性表L的第i个元素值返回,因为数组是从0开始的,代码中只要n的数值在所定义的数组下标的范围内,把数组n-1下标的值返回。
即,我们可知道顺序线性表获得元素有两个要点:
①判断语句
②返回值

2.代码

#include <stdio.h>
#define MAXSIZE 20            //设定存储空间初始分配量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
//顺序结构的获得元素操作
Status GetElem(SqList L, int n, ElemType* e)    //Status是函数类型,其值是函数结果状态代码,例OK等;
{
    
                                                   //SqList L为该线性表;int n为索引位置;ElemType*e为指针直接访问地址
	if (L.length == 0 || n<1 || n>L.length)     //线性表的长度不为0;线性表是从1访问的,而不是0;索引位置不能大于线性表的长度
		return ERROR;        //以上均返回错误
	*e = L.data[n-1];        //若满足以上条件,则将线性表L中的第n个位置元素值返回,即只要n的数值在数组下标范围内,就将数组第n-1下标的值返回
	return OK;
}

三、顺序存储结构的插入

1.条件

设k为当前位置,首先判断线性表是否已满,再对插入位置进行判断,然后判断插入位置是否在表尾,从而执行不同操作,若不在表尾,通过for语句遍历,将要插入的位置后的数据元素向后移动一位;若在表尾,则直接插入新元素,当前长度++。
即,顺序线性表插入元素有五个要点:
①若插入位置不合理,抛出异常
②判断语句
③从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
④将要插入元素插入位置i处
⑤表长加1

2.代码

//顺序结构的插入操作
typedef int Status;
Status ListInsert(SqList* L, int n, ElemType e)
{
    
    
	int k;                          //k为当前位置
	if (L->length == MAXSIZE)       //当顺序线性表存储已满返回错误  
		return ERROR; 	 
	if (n<1 || n>L->length + 1)    //插入位置小于1、大于当前长度加一则返回错误
		return ERROR;
	if (n <= L->length)            //若插入位置不在线性表表尾,执行以下操作,将要插入的位置后数据元素向后移动一位
	{
    
    
		for (k = L->length - 1; k >= n - 1; k--)    //遍历从i索引位置到线性表长度的每个数据元素,将其全部向后移动一位
			L->data[k + 1] = L->data[k];           
	}
	//若插入位置在表尾,执行插入新元素操作
	L->data[n - 1] = e;             //[i-1]是因为顺序表位置-1=数组下标,数组从0开始,顺序表从1开始
	L->length++;
	return OK;
}

四、顺序存储结构的删除

1.条件

设k为当前位置,首先判断线性表是否为空表,再判断删除元素长度,用指针取出所要删除的数据元素,然后再判断删除位置是否在表尾,若不在表尾,通过for语句遍历,将要删除的位置后数据元素向前移动一位;若在表尾,则删除该元素,当前长度- -。
顺序线性表删除元素有四个要点:
①若删除位置不合理,抛出异常
②取出删除元素
③从删除元素位置开始遍历到最后一个元素位置,将它们向前移动一位
④表长减1

2.代码

//顺序结构的删除操作
typedef int Status;
Status ListDelete(SqList* L, int n, ElemType* e)
{
    
    
	int k;                    //k为当前位置
	if (L->length == 0)       //若线性表为空,即空表,则返回错误
		return ERROR;
	if (n<1 || n>L->length)   //当删除元素小于1,大于当前长度,删除位置不正确返回错误
		return ERROR;
	*e = L->data[n - 1];      //e相当于回收站,将要删除的元素位置放到e中;*e表示取指针e所指地址存储的值;线性表中第n个值相当于数组data[n-1]
	if (n < L->length)        //若删除操作不是最后位置,执行以下操作,将要删除的位置后数据元素向前移动一位
	{
    
    
		for (k = n; k < L->length; k++)    //遍历从n索引位置到线性表长度的每个数据元素,将其全部向后移动一位
			L->data[k - 1] = L->data[k];
	}
	L->length--;             
	return OK;
}

五、总代码

//线性表顺序存储结构
#include <stdio.h>
#define MAXSIZE 20            //设定存储空间初始分配量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

//顺序存储结构的建立
typedef int Status;
typedef int ElemType;
typedef struct
{
    
    
	ElemType data[MAXSIZE];   //数组存储数据元素,最大值为MAXSIZE
	int length;               //线性表当前长度
}SqList;

//顺序结构的获得元素操作
Status GetElem(SqList L, int n, ElemType* e)    //Status是函数类型,其值是函数结果状态代码,例OK等;
{
    
                                                   //SqList L为该线性表;int n为索引位置;ElemType*e为指针直接访问地址
	if (L.length == 0 || n<1 || n>L.length)     //线性表的长度不为0;线性表是从1访问的,而不是0;索引位置不能大于线性表的长度
		return ERROR;        //以上均返回错误
	*e = L.data[n-1];        //若满足以上条件,则将线性表L中的第n个位置元素值返回,即只要n的数值在数组下标范围内,就将数组第n-1下标的值返回
	return OK;
}

//顺序结构的插入操作
Status ListInsert(SqList* L, int n, ElemType e)
{
    
    
	int k;                          //k为当前位置
	if (L->length == MAXSIZE)       //当顺序线性表存储已满返回错误  
		return ERROR; 	 
	if (n<1 || n>L->length + 1)    //插入位置小于1、大于当前长度加一则返回错误
		return ERROR;
	if (n <= L->length)            //若插入位置不在线性表表尾,执行以下操作,将要插入的位置后数据元素向后移动一位
	{
    
    
		for (k = L->length - 1; k >= n - 1; k--)    //遍历从i索引位置到线性表长度的每个数据元素,将其全部向后移动一位
			L->data[k + 1] = L->data[k];           
	}
	//若插入位置在表尾,执行插入新元素操作
	L->data[n - 1] = e;             //[i-1]是因为顺序表位置-1=数组下标,数组从0开始,顺序表从1开始
	L->length++;
	return OK;
}

//顺序结构的删除操作
Status ListDelete(SqList* L, int n, ElemType* e)
{
    
    
	int k;               //k为当前位置
	if (L->length == 0)       //若线性表为空,即空表,则返回错误
		return ERROR;
	if (n<1 || n>L->length)   //当删除元素小于1,大于当前长度,删除位置不正确返回错误
		return ERROR;
	*e = L->data[n - 1];      //e相当于回收站,将要删除的元素位置放到e中;*e表示取指针e所指地址存储的值;线性表中第n个值相当于数组data[n-1]
	if (n < L->length)        //若删除操作不是最后位置,执行以下操作,将要删除的位置后数据元素向前移动一位
	{
    
    
		for (k = n; k < L->length; k++)    //遍历从n索引位置到线性表长度的每个数据元素,将其全部向后移动一位
			L->data[k - 1] = L->data[k];
	}
	L->length--;             
	return OK;
}

总结

以上就是本次的笔记内容,本文仅仅通过文字和代码简单介绍了顺序存储结构的各项操作,建议自己分析总结其各个操作并结合自己的编程能力选择编程语言再写一遍代码从而加深印象。


附:在下一文章会介绍线性表链式存储结构的各项操作,持续更新ing……

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43085848/article/details/113446703