线性表实现
线性表的顺序存储结构
• 线性表作为一种基本的数据结构类型,在计算机存储器中的映象(或表示)一般有两
种形式,一种是顺序映象,一种是链式映象。
线性表的定义
– 线性表就是零个或多个相同数据元素的有限序列。
• 若将线性表L=(a 0 ,a 1 , ……,a n-1 )中的各元素依次存储于计算机一片连续的存储空间,
如图所示。这种机内表示为线性表的顺序存储结构。
顺序存储的特点
顺序存储结构的特点:
– (1)逻辑上相邻的元素 ai, ai+1,其存储位置也是相邻的;
– (2)对数据元素ai的存取为随机存取或按地址存取。
– (3)存储密度高。存储密度D=(数据结构中元素所占存储空间)/(整个数据结构所占空间)。
顺序存储结构的不足:
– 对表的插入和删除等运算的时间复杂度较差。
顺序存储实现
//定义顺序表的大小
#define MAXSIEZE (100)
#define ERROR (-1)
#define SUCCESS (0)
typedef int data_t;
typedef struct
{
data_t data[MAXSIEZE];//表的存储空间
int last; //当前表尾指针
}SEQLIST_T; // 顺序表类型
线性表操作
1. 线性表操作- --创建
sqlink_t L;
L = (sqlist_t *)malloc(sizeof(sqlist_t));
L->last =-1;
指针L指向一个顺序表,如图所示。
a i 表示为L->data[i] (0 ≤ i ≤L->last)
SEQLIST_T* Create_Seqlist(void)
{
SEQLIST_T *L = NULL;
L = (SEQLIST_T*)malloc(sizeof(SEQLIST_T));
if(NULL == L)
{
puts(" no memory ");
return NULL;
}
L->last = -1;
return L;
}
2. 顺序表操作- --清空、求表长、查询
-置空线性表:
void Set_Empty_Seqlist(SEQLIST_T *L)
{
if(L == NULL)
{
puts(" Seqlist *L is NULL ");
return;
}
L->last = - 1;
return ;
}
– 求线性表长:
int Get_Length_Seqlist(SEQLIST_T *L)
{
if(L == NULL)
{
puts(" Seqlist *L is NULL ");
return ERROR;
}
return (L->last + 1);
}
– 求线性表中第i个元素的值
int Search_Seqlist_POS(SEQLIST_T *L, int pos)
{
if((pos<0) || (pos>L->last))
{
puts(" input pos is invalid ");
return ERROR;
}
return (L->data[pos]);
}
线性表操作- --插入
插入: 将一给定值x插在元素a i 之前,即实现Insert(L, x, i)。
算法思路:若表存在空闲空间,且参数i满足:0≤i≤L->last+1,则可进行正常插入。插入前,将
表中(L->data[L->last]~L->data[i])部分顺序下移一个位置,然后将x插入L->data[i]处即可。
算法对应的表结构如图所示。
int Insert_Seqlist(SEQLIST_T *L, data_t x,int pos)
{
int i = 0;
if( (IS_Full_Seqlist(L)) || (pos<0) || (pos > L->last+1))
{
puts(" input error ");
return ERROR;
}
for(i=L->last; i>=pos; i--)
{
L->data[i+1] = L->data[i];
}
L->data[pos] = x;
L->last++;
return SUCCESS;
}
线性表操作 —删除
• 删除 : 将表中第i个元素a i 从表中删除,即实现DeleteSqlist(L, i)。
• 算法思路: 若参数i满足:0≤i≤L->last, 将表中L->data[i+1]∽L->data[L->last]
部分顺序向上移动一个位置,覆盖L->data[i]
int Delete_Seqlist(SEQLIST_T *L, int pos)
{
int i = 0;
if((pos<0) || (pos>L->last ))
{
puts(" input pos is invalid ");
return ERROR;
}
for(i=pos; i<Get_Length_Seqlist(L);i++)
{
L->data[i] = L->data[i+1];
}
L->last--;
return SUCCESS;
}
线性表操作 —定位
定位:确定给定元素x在表L中第一次出现的位置(或序号)。即实现Locate(L,x)。算法对应的存
储结构如图所示。
• 算法思路:设一扫描变量i(初值=0),判断当前表中元素a i 是否等于x,若相等,则返回当前i值
(表明x落在表的第i位置);否则i加1,继续往下比较。若表中无一个元素与x相等,则返回-1
int Search_Seqlist(SEQLIST_T *L, data_t x)
{
int i=0;
for(i=0; i<=L->last; i++)
{
if(L->data[i] == x)
return i;
}
return ERROR;
}
线性表操作 —去重运算
算法思路:
• 对当前表L中的每个a i (0≤i≤n-2),依次与a j (i+1≤j≤n-1) 比较,若与a i 相等,则删除之。
void Delete_Repeat( SEQLIST_T *L )
{
data_t x,y;
int i=0,j;
while(i < Get_Length_Seqlist(L)-1 )
{
x = Search_Seqlist_POS(L,i);
j = i+1;
while( j < Get_Length_Seqlist(L))
{
y = Search_Seqlist_POS(L,j);
if(y == x)
{
Delete_Seqlist(L,j);
}
else
{
j++;
}
}
i++;
}
}
顺序表操作-合并运算
设线性表La=(a 0 a 1 , ……,a m-1 ), Lb= (b 0 b 1 , ……,b n-1 ),求La∪Lb =>La,
算法思路:依次取表Lb中的b i (i=0,1,……,n-1),若b i 不属于La,则将其插入表La中。
void Union( SEQLIST_T *L1, SEQLIST_T *L2 )
{
int i,k;
data_t x;
for(i=0; i<Get_Length_Seqlist(L2); i++)
{
x = Search_Seqlist_POS(L2, i);
k = Search_Seqlist(L1, x);
if(k == -1)
{
Insert_Seqlist(L1, x, Get_Length_Seqlist(L1));
}
}
}
版权声明
内容摘取华清创客学院培训资料,个人水平有限,感谢华清创客学院的指导和帮助。