数据结构线性表实现01

线性表实现

线性表的顺序存储结构

• 线性表作为一种基本的数据结构类型,在计算机存储器中的映象(或表示)一般有两
种形式,一种是顺序映象,一种是链式映象。

线性表的定义
– 线性表就是零个或多个相同数据元素的有限序列。

• 若将线性表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指向一个顺序表,如图所示。

Alt在这里插入图片描述
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));
		}

	}
}

版权声明

内容摘取华清创客学院培训资料,个人水平有限,感谢华清创客学院的指导和帮助。

猜你喜欢

转载自blog.csdn.net/Set_Mode/article/details/89633697
今日推荐