数据结构之线性表的顺序表示和实现

一、存储结构

线性表的顺序存储结构可以采用一维数组来表示:

#define MAXSIZE	100
typedef int ElemType;

typedef struct
{
	ElemType data[MAXSIZE];
	int		 length;
}SqList;

二、基本操作

1、初始化

void InitList(SqList &L)
{
	L.length = 0;
}

2、清空

void ClearList(SqList &L)
{
	L.length = 0;
}

3、指定位置插入元素

//在第i个元素位置 1<=i<=L.length+1 前,插入元素e
int ListInsert(SqList &L, int i, ElemType e)
{
	int k;
	if (i < 1 || i > L.length+1 || L.length == MAXSIZE)//位置不对、表已满
		return 0;
	for (k = L.length-1; k >= i-1; k--)//后移
		L.data[k+1] = L.data[k];
	L.data[i-1] = e;//插入
	L.length++;		//表长增1
	return 1;
}

在第i(1<=i<=n+1)个元素之前插入一个元素时,需要将第n至第i(共n-i+1)个元素向后移动一个位置.平均移动n/2个元素

4、指定位置删除元素

//删除第i个位置 1<=i<=L.length 的元素,用e返回其值
int ListDelete(SqList &L, int i, ElemType &e)
{
	int k;
	if (i < 1 || i > L.length)//位置不对
		return 0;
	e = L.data[i-1];//待删除
	for (k = i; k < L.length; k++)//前移
		L.data[k-1] = L.data[k];
	L.length--;		//表长减1
	return 1;
}

删除第i(1<=i<=n)个元素时,需要将第i+1至第n(共n-i)个元素向前移动一个位置。平均移动(n-1)/2个元素


5、获取线性表指定位置的值

int GetElem(SqList L, int i, ElemType &e)
{
	if (i < 1 || i > L.length)
		return 0;
	e = L.data[i-1];
	return 1;
}

6、查找某数在线性表中的位置

int LocateElem(SqList L, ElemType e)
{
	int i;

	for (i = 0; i < L.length; i++)
	{
		if (L.data[i] == e)
			break;
	}
	if(i >= L.length)
		return 0;
	return i+1;
}

7、线性表遍历

void ListTraverse(SqList &L)
{
	int i;
	for (i = 0; i < L.length; i++)
		printf("%d ", L.data[i]);
	putchar('\n');
}

三、与线性表相关的算法

1、合并两个线性表

//La、Lb的值按<strong>非递减</strong>排列,归并La,Lb中的元素到Lc中,使Lc中的元素仍按非递减排列
void MergeList(SqList La, SqList Lb, SqList &Lc)
{
	int ia=1, ib=1, ik = 0;
	ElemType ea, eb;
	while (ia <= La.length && ib <= Lb.length)
	{
		GetElem(La, ia,ea);
		GetElem(Lb, ib,eb);
		if(ea <= eb)
		{
			ia++;
			ListInsert(Lc, ++ik, ea);
		}
		else
		{
			ib++;
			ListInsert(Lc, ++ik, eb);
		}
	}
	while(ia <= La.length)
	{
		GetElem(La, ia++, ea);
		ListInsert(Lc, ++ik, ea);
	}
	while(ib <= Lb.length)
	{
		GetElem(Lb, ib++, eb);
		ListInsert(Lc, ++ik, eb);
	}
}
时间复杂度为O(Length(La) + Length(Lb));

2、线性表合并,A=A∪B

//将Lb中不属于La的元素取出放在La中
void UnionList(SqList &La, SqList Lb)
{
	int ia, ib;
	ElemType e;
	for (ib = 1; ib <= Lb.length; ib++)
	{
		GetElem(Lb, ib, e);
		if(!LocateElem(La, e))//判断Lb中的每一个元素是否在La中
			ListInsert(La, La.length+1, e);//不在就插入到La的末尾位置
	}
}
时间复杂度为O(Length(La) x Length(Lb));


注:1、基本操作中所有以数组下标进行的操作均可以用指针完成;2、若以线性表表示集合并进行集合的各种运算,应先对表中的元素进行排序。

网络上一个分篇写得很细的连接:http://www.nowamagic.net/librarys/veda/detail/2198

本文的全部完整测试代码详见:http://download.csdn.net/detail/u013071074/7413169


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值