笔者也开始学习数据结构啦,开始记录一些关于数据结构的笔记,本次记录一下线性表的类型定义以及用C语言实现一些顺序表基本操作的实现。
1.抽象数据类型
ADT List {
数据对象:D = { ai | ai属于元素集,(i = 1,2,...,n,n>=0)}
数据关系:R = { <ai-1,ai> | ai-1,ai属于D,(i = 2,3,...,n)}
基本操作:
InitList(&L);
DestroyList(&L);
ListInsert(&L,i,e);
.....
}ADT List
2.基本操作的定义与实现
1 InitList(Sqlist *L);
作用:构造一个空的线性表L
InitList(*L)函数实现:
typedef int ElemType;
typedef struct{
ElemType *elem;
int len;
}Sqlist;
ElemType LnitList(Sqlist *L) //构建一个空的顺序表L;
{
L->elem = malloc(sizeof(Sqlist)); //为顺序表分配空间;
if ( !L->elem )
exit(0); //判断是否空间分配成功;
L->len = 0; //初始空表长度为0;
return 0;
}
2 DestroyList(Sqlist *L);
作用:销毁线性表L
DestroyList(Sqlist *L)函数实现:
void DestroyList(Sqlist *L)
{
if ( L->elem ) //释放存储空间
free(L->elem);
}
3 ClearList(Sqlist *L);
作用:清空线性表L
ClearList(Sqlist *L)函数实现:
void ClearList(Sqlist *L)
{
L->len = 0; //将线性表长度重置为0;
}
这里会有一点疑问,我将L.len 赋值为0之后线性表的数据不是还存在吗。
笔者的理解是,len被赋值为0,后面的遍历判定后不会进行输出,可视作线性表清空,而下一次用表时会再次赋值。
4 GetLength(Sqlist L);
作用:求得线性表的长度
GetLength(Sqlist *L)函数实现:
ElemType GerLength(Sqlist L)
{
return L.len; //返回长度;
}
5 IsEmpty(SqList L);
作用:判断线性表L是否为空
IsEmpty (SqList L) 函数实现:
ElemType IsEmpty(Sqlist L)
{
if ( L.len == 0) //判断长度是否为0;
return 1;
else
return 0;
}
6 GetElem(Sqlist L,ElemType i,ElemType *e);
作用:取出顺序表位于第i哥位置的值传给e
GetElem (Sqlist L,ElemType i,ElemType *e) 函数实现:
ElemType GetElem(Sqlist L,ElemType i,ElemType *e)
{
if ( i < 1 || i > L.len )
return 0; //判断输入的i值是否合理;
*e = L.elem[i-1]; //将第i个数据赋值给e;
return 1;
}
⭐7 LocateElem(SqList L, ElemType e);
作用:在线性表L中查找与指定值e相同的数据元素的位置,从表的一段开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0
LocateElem (SqList L, ElemType e) 函数实现:
ElemType LocateElem(Sqlist L,char e)
{
//在线性表L中查找值为e数据元素,返回其序号(即第几个元素)
for (int i = 0; i < L.len; i++ )
{
if ( L.elem[i] == e )
return i+1; //查找成功,返回其序号(i+1就不用解释了叭!);
}
return 0; //查找失败,返回0;
}
⭐8 ListInsert_Sq(SqList *L,ElemTypei,char e);
作用:向顺序表位置为i的地方插入数据e
ListInsert_Sq (SqList *L,ElemTypei,char e) 函数实现:
ElemType ListInsert_Sq(Sqlist *L,ElemType i,char e)
{
if ( i < 1 || i > L->len+1 ) //判断输入的i值是否合法;
return 0;
if ( L->len == MAX ) //MAX为define的函数,即初始上限表长;
return 0; //判断存储空间是否已满;
for ( int j = L->len-1; j >= i-1; j-- )
{
L->elem[j+1] = L->elem[j]; //从位置i开始腾出空间,依次向后移动;
}
L->elem[i-1] = e; //将插入数据放入;
L->len++; //表长增加一;
return 1;
}
⭐9 ElemType ListDelete_Sq(Sqlist *L,ElemType i);
作用:将顺序表中位置i的元素删除
ElemType ListDelete_Sq (Sqlist *L,ElemType i) 函数实现:
ElemType ListDelete_Sq(Sqlist *L,ElemType i)
{
if ( i < 1 || i > L->len ) //判断输入i是否合法;
return 0;
for ( int j = i; j <= L->len-1; j++ )
{
L->elem[j-1] = L->elem[j]; //从i+1位置开始,整体往前移动一格,此时会覆盖i位置的值,相当于删除
}
L->len--; //表长减一;
return 1;
}
这里暂时就是常用的一些基本操作啦,如果有什么错误请各位指出来,笔者会及时修改~~
请多多担待~