您的位置:首页 > 理论基础 > 数据结构算法

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

2014-05-28 15:21 776 查看

一、存储结构

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

#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、若以线性表表示集合并进行集合的各种运算,应先对表中的元素进行排序。

网络上一个分篇写得很细的连接:/article/1306007.html

本文的全部完整测试代码详见:http://download.csdn.net/detail/u013071074/7413169
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: