当前位置:   article > 正文

数据结构 :线性表中顺序表的建立和基本操作(C)_c语言顺序表的建立与基本操作

c语言顺序表的建立与基本操作

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

目录

建立 

基本操作

1.取值

2.查找

 3.插入

4.删除

5.修改

6.遍历

代码测试


建立 

  1. //顺序表
  2. #include<stdio.h>
  3. #define size 101
  4. typedef int Elemtype;
  5. typedef struct
  6. {
  7. Elemtype data[size];
  8. int len;
  9. }SqList;

首先通过typedef进行顺序表中的元素类型进行初定义(表中的数据类型默认为int类型,使用typedef定义的好处是方便表中元素类型的整体的修改)。

其次定义一个顺序表的结构体, 内容包括顺序表中的元素以及表长。

顺序表需提前分布好最大容量,由于定义的size为101,故该表从下标从1开始,表长最多依旧为100,方便后续运算。

这个结构体就相当于一个模子,每需要一个线性结构时,就要调用这个结构体。

  1. //初始化
  2. void Init(SqList &s)
  3. {s.len=0;}

通过函数Init进行顺序表的初始化。
 

  1. //判断是否为空
  2. bool IsEmpty(SqList s)
  3. { if(s.len==0) return true;
  4. return false;
  5. }

定义一个布尔类型的函数判断是否为空表。


基本操作

1.取值

  1. //取值
  2. void GetElem(SqList s,int i,Elemtype &e)
  3. {
  4. if(i<1||i>s.len) return 0; //判断i是否合法
  5. e=s.data[i];
  6. }

定义一个GetElem函数来完成取值操作,其中i为顺序表中的下标。

把表中的数据存入e中需寻址,&不可丢掉。

函数内部首先判断下标是否合法,如果合法将表中该下标的元素赋值给e,即可通过scanf进行输出。

2.查找

  1. //查找(下标)
  2. int Find(SqList s,Elemtype e)
  3. {
  4. for(int i=1;i<=s.len;i++)
  5. if(s.date[i]==e] return i;
  6. return 0;
  7. }

定义一个Find函数来完成查找操作,此函数需返回一个整形值,定义时用int类型来定义。

函数内部采用一个for循环从表头(下标为1的元素)开始遍历顺序表,当发现e中的值与某个元素相等时输出该元素的下标i。

 3.插入

  1. //插入
  2. void Insert(SqList &s,int i,Elemtype e)
  3. {
  4. if(s.len==size-1) return; //判断表是否满
  5. if(i<1||i>s.len+1) return; //判断i是否合法
  6. for(int j=s.len;j>=i;j--)
  7. s.data[j+1]=s.data[j]; //移动 整体右移
  8. s.data[i]=e; //插入
  9. s.len++; //表长+1
  10. return 0;
  11. }

定义一个Insert函数来完成插入操作,i为表中下标。

在函数内部,首先判断表中元素是否满,若满则无法插入,返回。

其次判断下标i是否合法。

满足上述条件即可完成插入,首先将表中元素[j]位置的值赋给[j+1],即表整体右移。

最后完成表长+1.。

4.删除

  1. //删除
  2. void Del(SqList &s,int i)
  3. {
  4. if(i<1||i>s.len) return; //判断i合法
  5. for(int j=i;j<s.len;j++)
  6. s.data[j]=s.data[j+1]; //删除 整体左移
  7. s.len--; //表长-1
  8. }

定义Del函数来完成删除操作。

首先判断i是否合法。

若i合法,则可以进行删除操作,与插入不同的是,删除是将表中数据集体右移,即for中的第一个循环就是将所删除元素的值进行了覆盖,随后多次循环完成删除。

最后完成表长-1。

5.修改

  1. //修改
  2. void Revise(SqList &s,int i,Elemtype e)
  3. {
  4. if(i<1||i>s.len) return;
  5. s.data[i]=e;
  6. }

定义Revise函数完成修改操作。

首先判断i是否合法。

其次将所修改的值赋给i所对应的存储空间。

6.遍历

  1. //遍历
  2. void Display(SqList s)
  3. {
  4. for(int i=1;i<=s.len;i++)
  5. printf("%3d",s.data[i]);
  6. printf("\n");
  7. }

输出列表的值。


代码测试

  1. int main()
  2. {
  3. SqList a1;
  4. Elemtype e;
  5. Init(a1);
  6. Insert(a1,1,100);Insert(a1,2,89);
  7. Insert(a1,3,60);Insert(a1,4,25);
  8. GetElem(a1,2,e);printf("%d\n",e);
  9. printf("%d\n",Find(a1,25));
  10. Revise(a1,4,5);
  11. Display(a1);
  12. return 0;
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/700710
推荐阅读
相关标签
  

闽ICP备14008679号