一、存储结构
线性表的顺序存储结构可以采用一维数组来表示:
#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