您的位置:首页 > 理论基础 > 数据结构算法

数据结构之线性表(顺序表)的基本操作

2017-09-18 20:41 691 查看
今天学了一下数据结构,看的是线性表中的顺序表,把自己对线性表的了解,给大家分享一下。

线性表是什么?

线性表是 n 个元素的有限序列,线性表中的数据元素的个数成为线性表的长度。

顺序表是什么?

顺序表就是线性表的顺序储存结构。其基本思想就是用一段地址连续的储存单元依次储存线性表的数据元素。

       读到基本思想这里我们很容易想到,顺序表和我们所学的数组的是基本一样的,但是又不完全一样,数组在存储数据时数据元素可以在数组的任何位置,两个元素之间允许存在空值。但是顺序表就不能了,顺序表的两个元素之间是不允许有空值的。我感觉这就是顺序表和数组之间的差别之一吧?

好了,不说没有用的了。直接写实现过程。

首先定义一个储存结构:

typedef struct node
{
int data[50];//存放数据的数组或叫数据域
int length;//顺序表的长度
}Node;
在上述代码中定义了一个数据储存结构,在这个结构中我们定义了数据域和顺序表的长度。

初始化线性表。C语言实现如下:

//初始化顺序表
void InitList(Node *L)
{
L->length = 0;
printf("初始话成功\n");
}
初始化顺序表还是比较简单的,我们只需要把表的长度初始化为 0,就可以了。

创建顺序表。C语言实现如下:

bool CreatList(Node *L ,int a[],int n)
{
if(n > MaxSize)//MaxSize是线性表的最大长度
{
printf("顺序表的储存空间不足\n");
return false;
}
for(int i = 0;i < n;i++)
{
L->data[i] = a[i];
}
L->length = n;
printf("顺序表创建成功\n");
return true;
}
在上述代码中是创建线性表,开始我们传入参数 线性表结构,数据元素a[]和数据元素的长度n。然后判断数据元素的长度是否大于顺序表的最大长度,如果大于线性表的最大长度,证明线性表容不下所有的数据元素,返回false,建表失败。如果能存下就通过for循环依次把数据元素的每一个值,传入的线性表中,并把线性表的长度改成数据元素的长度,返回true 表示创建成功。

判空操作。C语言实现如下:

bool Empty(Node *L)
{
if(L->length == 0)//线性表为空返回true
{
return true;
}
else
{
return false;
}
}
在上述代码中进行的是判空操作,我们只需要判断length是否等于0 就可以了,如果等于0 证明线性表中没有元素,所以为空。

按值查找。C语言实现如下:

//按值查找
int Locate(Node *L ,int x)
{
for(int i = 0; i < L->length; i++)
{
if(L->data[i] == x)
{
return i + 1;
}
}
return 0;
}
在上述代码中我们按值进行查询,输入你想要查询的值 X ,然后通过for循环拿线性表中的每一个元素与X进行对比如果相等 证明查到了你想要的值,并返回X的所在位置。等到循环结束如果没有查到你想要的结果证明查询失败,返回结果 0。

按位查找。C语言实现如下:

//按位查找
bool Get(Node *L,int i,int *ptr)
{
if(i < 1||i >L->length)
{
printf("查找位不和法,查找失败");
return false;
}
else
{
*ptr = L->data[i - 1];
return true;
}
}
在上述代码中我们实现按位查找,传入 i  表示你要查找第 i 位置元素的值,然后把元素的值赋给ptr 。首先我们对 i 进行判断,看他是否在我们线性表的范围内,如果 i 小于 1 或者 i 大于线性表的长度,表示 i 不再线性表的范围内,输出查找失败,返回false。否则把线性表中的下标是 i - 1 的元素赋值给 ptr 。(为什么是i - 1 因为数组中的下标是从0开始的,而我们的线性表是在 1 开始的)

插入操作。C语言实现如下:

//插入操作
bool Insert(Node *L,int i,int x)
{
if(L->length >= MaxSize)
{
printf("上溢错误,插入失败。");
return false;
}
if(i < 1 || i > L->length+1)
{
printf("位置错位,插入失败");
return false;
}
for(int j = L->length; j >= i; j--)
{
L->data[j] = L->data[j-1];
}
L->data[i-1] = x;
L->length++;
printf("插入成功\n");
return true;
}

在上述代码中实现线性表的插入操作。插入数据还是比较好理解的,举一个简单的例子就是:在售票口前站了一排密且整齐的6人队伍,如果你想插入到队伍中第3个人的后面第4个人的前面,那会进行一个怎样的过程?是不是4,5,6三个人都需要向后倒退一个位置然后你就可以加入进来了。顺序表的插入过程和刚才的例子是一回事,我们首先传入参数i 和 参数 x ,其中 i 表示在顺序表的第几个位置进行插入数据,x就表示所要插入的数据。然后判断顺序表的长度,如果顺序表的长度大于或等于
顺序表的长度,那证明顺序表已经满不能在加入。在判断你需要在什么位置加入数据,如果 位置i 的位置不在线性表的范围内,那就证明输入不合法,返回false。for循环的意思就是“让其他人向后倒退”的一个操作。然后你加入到顺序表中,顺序表的长度增加一个。返回true。

删除操作。C语言实现如下:

//删除操作
bool Delete(Node *L,int i,int *ptr)
{
if(L->length == 0)
{
printf(
4000
"下溢错误。删除错误\n");
return false;
}
if(i < 1 || i > L->length)
{
printf("位置错误,删除操作\n");
return false;
}
*ptr = L->data[i-1];//把顺序表中需要删除的元素赋值给 ptr
for(int j = i;j < L->length; j++)//弥补空缺的位置
{
L->data[j-1] = L->data[j];
}
L->length--;
printf("顺序表删除成功\n");
return true;
} 上述代码中我们实现顺序表的删除操作。删除操作更好理解,还是上面的一个例子,当你在队伍中走出来,队伍会发生什么样的一个过程?你出来之后,你后面的每一个人,都向前走一个人的位置,来弥补你空缺出来的位置。好吧,上面代码就是这样一个过程。输入 i 表示你要删除 位置 i 上的数据。并用 ptr 来返回你删除元素的值。两个判断和插入中的判断是一个意思,首先把你需要删除的元素赋值给 ptr ,然后通过for循环弥补被删除元素空缺出来的位置,然后顺序表的长度减一,返回true,表示删除成功。
求顺序表的长度。C语言实现如下:

//求顺序表的长度
int Length(Node *L)
{
return L->length;
} 在上述代码中实现求顺序表的长度,刚才我们在定义储存结构时,就定义length就代表顺序表的长度,所以这里我们直接返回 length就可以知道顺序表的长度了。
遍历操作。C语言实现如下:

//遍历操作
void PrintList(Node *L)
{
for(int i = 0;i < L->length; i++)
{
printf("%d ",L->data[i]);
}
printf("\n输出完毕\n");
} 在上述代码中实现顺序表的遍历操作,顺序表的遍历和数组的遍历可以简单的理解成就是一回事。

写到这里我已经把顺序表的一些简单操作都简单叙述完了。上面说的都是顺序表的部分操作,如果想要全部代码点击链接

数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息