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

来源:互联网 发布:成都宜高美 知乎 编辑:程序博客网 时间:2024/03/29 01:04

一、存储结构

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

#define MAXSIZE100typedef 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 前,插入元素eint 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++;//表长增1return 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--;//表长减1return 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


0 0
原创粉丝点击