线性表--顺序表--数组(三)

哈喽,大家好,我是花狗Fdog,今天给大家介绍线性表中的顺序表,废话不多说,直奔主题。

一.何为线性表以及如何实现

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。而且线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素。由于博主是先学习的C语言,而线性表的顺序存储结构可借助于C语言的一维数组来实现,而一维数组的下标与元素在线性表中的序号相对应。

二.线性表基本定义及操作运算

1.顺序表顺序储存结构的定义
2.顺序表初始化
3.顺序表赋值
4.顺序表取值
5.顺序表显示值
6.顺序表插入
7.顺序表删除
8.顺序表归并
9.销毁内存

三.开始操作

顺序表结构的定义
typedef struct
{
 int * elem;  //这里的泛型定义为整型,在实际应用中,可根据实际需要来具体定义表中元素的数据类型。
 int last;    //记录线性表有效数据的长度。
}Seqlist;
顺序表初始化
#define MAXSIZE 100  
void InitList(Seqlist * L)
{
 L->elem = (int *)malloc(sizeof(int)*MAXSIZE); //线性表占用的数组空间。
 if (!L->elem)
 {
  return ;
 }
 L->last = 0;
}

这里说一下,有些人使用malloc申请内存的时候,编译器会提示该函数未定义,加入#include<malloc.h>即可解决该问题。

顺序表赋值
#define OK 1
#define ERROR 0
int SetElem(Seqlist *L ,int e) //e代表要赋的值。
{
 if (L->last == MAXSIZE)
 {
  return ERROR;
 }
 L->elem[L->last] = e;
 L->last++;
 return OK;
}
顺序表取值
int GetElem(Seqlist *L, int e)//第e个位置的元素。
{
 return L->elem[e - 1];//由于数组从0开始,所以e-1。
}
顺序表显示值
void ShowElem(Seqlist * L)
{
 for (int i = 0; i < L->last; i++)
 {
  printf("%d\n", L->elem[i]);//将表中数据显示
 }
}
顺序表按内容查找运算
int Locate(Seqlist L, int e) //e代表要查找的元素。
{
 int i = 0;
 while ((i <= L.last) && (L.elem[i]) != e)
 {
  i++;
 }
 if (i <= L.last)
 {
  printf("已找到\n");//这里可根据实际要求自行添加输出内容。
  return (i + 1);
 }
 else
 {
  printf("未找到\n");//这里可根据实际要求自行添加输出内容。
  return (-1);
 }
}
插入运算
int InsList(Seqlist*L, int i, int e)//i代表插入位置,e代表插入元素。
{
 int k;
 if ((i<1) || (i>L->last + 2))
 {
  printf("插入位置i值不合法");
  return (ERROR);
 }
 if (L->last >= MAXSIZE - 1)
 {
  printf("表已满,无法插入");
  return 0;
 }
 for (k = L->last; k >= i ; k--)
 {
  L->elem[k + 1] = L->elem[k];
 }
 L->elem[i] = e; 
 L->last++;
 return (OK);
}
删除运算
int DelList(Seqlist* L, int i)//i代表删除位置。
{
 int k;
 if ((i<1) || (i>L->last + 1))
 {
  printf("删除位置不合法!");
  return (ERROR);
 }
 //*e = L->elem[i - 1];
 for (k = i+1; k <= L->last; k++)
 {
  L->elem[k - 1] = L->elem[k];
 }
 L->last--;
 return (OK);
}
顺序表的归并
void MergeList(Seqlist* LA, Seqlist*LB, Seqlist*LC)//线性表的合并运算
{
 int i, j, k;
 i = 0;
 j = 0;
 k = 0;
 while (i < LA->last && j < LB->last)
 {
  if (LA->elem[i] <= LB->elem[j])
  {
   LC->elem[k] = LA->elem[i];
   i++;
   k++;
  }
  else
  {
   LC->elem[k] = LB->elem[j];
   j++;
   k++;
  }
 }
 while (i+1 <= LA->last)
 {
  LC->elem[k] = LA->elem[i];
  i++; k++;
 }
 while (j+1 <= LB->last)
 {
  LC->elem[k] = LB->elem[j];
  j++; k++;
 }
 LC->last = LA->last + LB->last;
}

这里做一下说明:
假设 LA为{1,2,3,3,4,5}, 非递减有序排列
        LB为{1,1,2,2,3,3},非递减有序排列
则    LC为{1,1,1,2,2,2,3,3,3,3,4,5}。非递减有序排列

销毁内存
void DesList(Seqlist * L)
{
 free(L);
 L = NULL;
}

看完不要走,看完以后的你可能还会有一些疑问,比如如何应用这些函数,不知道自己应用的对不对,你的问题,曾经也是我的问题,我当初也是想了很久,百度了很多博客,这些他人认为没必要写出来的东西,我写下来,来填充空白,因为我也是小白走过来的。所以我知道你当时的内心。不妨一起往下看。

int main()
{
 Seqlist  L1;//首先我们可以先声明一个该数据类型的变量
 //要初始化这样做
  InitList(&L1);
  
  
  //要赋值这样做
    for (int i = 0; i < 5; i++)
  {
   SetElem(&L1, i);
  }
  //这里赋值并不一定要用循环自动赋值,也可根据实际需求选择,比如使用scanf等等
 

 //要显示数组内容,这样做
    ShowElem(&L1);
    
  //要取值,这样做
printf("%d",GetElem(&L, 4));
//因为取值函数只有返回值,当然,如有需求,尽可更改该函数


//查找内容这样做
Locate(L, 19);


//删除内容这样做
DelList(&L, 2);


//插入内容这样做
InsList(&L, 2);

//要执行归并这样做
MergeList(&L1, &L2, &L3);//注意要先为L1,L2赋值哦
return 0;
}

好了,我已经尽可能的把该知识点说明白的,如还不懂,可在关键行加入printf,或者使用调试模式,一步一步的来运行。如有错误,欢迎指点。

每文一句:一个人有了远大的理想,就是在最艰苦困难的时候,也会感到幸福。

发布了15 篇原创文章 · 获赞 41 · 访问量 6141

猜你喜欢

转载自blog.csdn.net/Fdog_/article/details/103455966