概述
文章目录
- 线性表的顺序存储
- 线性表的定义
- 顺序存储的相关操作实现
- 初始化
- 依次对L的每个数据元素输出
- 返回线性表L中元素的个数
- 在L中第i个位置之前插入新的数据元素e,L的长度加1
- 删除L的第i个数据元素,并用e返回其值
- 返回L中第1个与e满足关系的数据元素的位序。
- 返回指定位置的值
- 将L重置为空表
- 将所有的在线性表Lb中但不在La中的数据元素插入到La中
- 顺序存储的代码实现
- 样例测试输出
- 顺序存储的优缺点
- 彩蛋
线性表的顺序存储
这里是数据结构个人学习的笔记记录,如有问题欢迎指正说明
线性表的定义
线性表的顺序存储结构,指的就是用一段地址连续的存储单元一次存储线性表的数据元素。
顺序存储的相关操作实现
初始化
/* 初始化 */
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
依次对L的每个数据元素输出
/* 依次对L的每个数据元素输出 */
Status ListTraverse(SqList L)
{
int i;
for(i=0;i<L.length;i++)
visit(L.data[i]);
printf("n");
return OK;
}
返回线性表L中元素的个数
/* 返回L中数据元素个数 */
int ListLength(SqList L)
{
return L.length;
}
在L中第i个位置之前插入新的数据元素e,L的长度加1
/* 在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if (L->length==MAXSIZE) /* 顺序线性表已经满 */
return ERROR;
if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
return ERROR;
if (i<=L->length) /* 若插入数据位置不在表尾 */
{
for(k=L->length-1;k>=i-1;k--) /* 将要插入位置之后的数据元素向后移动一位 */
L->data[k+1]=L->data[k];
}
L->data[i-1]=e; /* 将新元素插入 */
L->length++;
return OK;
}
删除L的第i个数据元素,并用e返回其值
/* 删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(SqList *L,int i,ElemType *e)
{
int k;
if (L->length==0) /* 线性表为空 */
return ERROR;
if (i<1 || i>L->length) /* 删除位置不正确 */
return ERROR;
*e=L->data[i-1];
if (i<L->length) /* 如果删除不是最后位置 */
{
for(k=i;k<L->length;k++)/* 将删除位置后继元素前移 */
L->data[k-1]=L->data[k];
}
L->length--;
return OK;
}
返回L中第1个与e满足关系的数据元素的位序。
/* 返回L中第1个与e满足关系的数据元素的位序。 */
int LocateElem(SqList L,ElemType e)
{
int i;
if (L.length==0)
return 0;
for(i=0;i<L.length;i++)
{
if (L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
返回指定位置的值
/* 用e返回L中第i个数据元素的值 */
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0 || i<1 || i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
将L重置为空表
/*将L重置为空表 */
Status ClearList(SqList *L)
{
L->length=0;
return OK;
}
将所有的在线性表Lb中但不在La中的数据元素插入到La中
/*将所有的在线性表Lb中但不在La中的数据元素插入到La中*/
void unionL(SqList *La,SqList Lb)
{
int La_len,Lb_len,i;
ElemType e; /*声明与La和Lb相同的数据元素e*/
La_len=ListLength(*La); /*求线性表的长度 */
Lb_len=ListLength(Lb);
for (i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e); /*取Lb中第i个数据元素赋给e*/
if (!LocateElem(*La,e)) /*La中不存在和e相同数据元素*/
ListInsert(La,++La_len,e); /*插入*/
}
}
顺序存储的代码实现
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 初始分配量的存储空间 */
typedef int ElemType; /* ElemType为需要存储数据的类型,使用typedef使代码通用性更好*/
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int length;/*线性*/
}SqList;
/* 初始化顺序线性表 */
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
int visit(int i)
{
printf("%d ",i);
return 0;
}
/* 将L重置为空表 */
Status ClearList(SqList *L)
{
L->length=0;
return OK;
}
/* 返回L中数据元素个数 */
int ListLength(SqList L)
{
return L.length;
}
/* 用e返回L中第i个数据元素的值 */
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0||i<1||i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
/* 返回L中第1个与e满足关系的数据元素的位序。 */
int LocateElem(SqList L,ElemType e)
{
int i;
if(L.length==0)
return 0;
for(i=0;i<L.length;i++)
{
if(L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
/* 在L中第i个位置之前插入新的数据元素e */
Status ListInsert(SqList *L,int i,ElemType e)
{
if(L->length==MAXSIZE||i<1||i>L->length+1)
return ERROR;
if(i<=L->length)
{
for(int k=L->length-1;k>=i-1;k--)
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;
L->length++;
return OK;
}
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(SqList *L,int i,ElemType *e)
{
int k;
if(L->length==0||i<1||i>L->length)
return ERROR;
*e=L->data[i-1];
if(i<L->length)
{
for(int k=i-1;k<L->length-1;k++)
{
L->data[k]=L->data[k-1];
}
}
L->length--;
return OK;
}
/* 依次对L的每个数据元素输出 */
Status ListTraverse(SqList L)
{
for(int i=0;i<L.length;i++)
visit(L.data[i]);
printf("n");
return OK;
}
/*将所有的在线性表Lb中但不在La中的数据元素插入到La中*/
void unionL(SqList *La,SqList Lb)
{
ElemType e;
int La_len=ListLength(*La);
int Lb_len=ListLength(Lb);
for (int i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e);
if (!LocateElem(*La,e))
ListInsert(La,++La_len,e);
}
}
void SqListTest()
{
SqList L;
SqList Lb;
ElemType e;
Status i;
i=InitList(&L);
printf("After initialization:L.length=%dn",L.length);
for(int t=1;t<7;t++)
i=ListInsert(&L,1,t);
printf("After insert 1 ~ 6 in the header of L:L.data=");
ListTraverse(L);
printf("L.length=%d n",L.length);
i=ClearList(&L);
printf("After emptying L:L.length=%dn",L.length);
for(int t=1;t<7;t++)
ListInsert(&L,t,t);
printf("After insert 1 ~ 6 at the end of L :L.data=");
ListTraverse(L);
printf("L.length=%d n",L.length);
ListInsert(&L,1,0);
printf("After inserting 0 into the header of L:L.data=");
ListTraverse(L);
printf("L.length=%d n",L.length);
GetElem(L,3,&e);
printf("The value of the third element is:%dn",e);
for(int t=6;t<=7;t++)
{
int m=LocateElem(L,t);
if(m)
printf("The value of the %d element is %dn",m,t);
else
printf("No element with value% dn",t);
}
int j=ListLength(L); /* j为表长 */
for(int t=j+1;t>=j;t--)
{
i=ListDelete(&L,t,&e); /* 删除第t个数据 */
if(i==ERROR)
printf("Failed to delete data% dn",t);
else
printf("The value of element %d deleted is:% dn",t,e);
}
printf("Output the elements of L in turn:");
ListTraverse(L);
//构造一个有10个数的Lb
i=InitList(&Lb);
for(int t=3;t<=13;t++)
i=ListInsert(&Lb,1,t);
printf("Output the values in L in turn:n");
ListTraverse(L);
printf("Output the values in Lb in turn:n");
ListTraverse(Lb);
unionL(&L,Lb);
printf("The elements of L combined with LB are output in turn:n");
ListTraverse(L);
}
int main()
{
SqListTest();
return 0;
}
样例测试输出
顺序存储的优缺点
优点:可以快速地存取表中任一位置的元素
缺点:插入和删除需要移动大量的元素,难以确定存储空间的容量,存储空间“碎片”化
彩蛋
还有一篇结构体定义会用上指针,欢迎来看https://blog.csdn.net/AHuRui/article/details/124415271?utm_source=app&app_version=5.3.1
最后
以上就是洁净钢笔为你收集整理的数据结构之线性表线性表的顺序存储的全部内容,希望文章能够帮你解决数据结构之线性表线性表的顺序存储所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复