数据结构之线性表的顺序表示和实现
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
相关文章推荐
- 数据结构之:线性表的顺序表示和实现
- 线性表的顺序表示和实现 - 数据结构
- 数据结构1:线性表的顺序表示和实现
- 线性表的顺序表示和实现 - 数据结构
- 数据结构教程 第六课 线性表的顺序表示和实现
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 数据结构二:线性表的顺序结构实现
- C语言 数组的顺序表示与实现 数据结构
- 数组的顺序存储表示和实现-数据结构
- C语言 数据结构 线性表的顺序表示
- 数据结构算法代码实现——线性表的链式表示与实现(单链表)(三 )
- 数据结构(2):线性表的链式表示和实现
- 数据结构之栈的顺序表示及其实现
- [数据结构一]线性表:顺序实现
- 数据结构复习——线性表的顺序存储实现
- 数据结构—线性表的链式表示和实现
- 数据结构(5):循环队列——队列的顺序表示和实现
- 数据结构之线性表顺序实现
- 数据结构之线性表的链式表示和实现
- 数据结构与算法——线性表的顺序表示