数据结构2.1线性表的线性表示和实现
2016-03-13 00:00
411 查看
摘要: 存取查找时间复杂度o(1),增删时间复杂度0(n),特点物理地址连续,增删需要后续元素整体移动
/*sqList.h*/ /*声明结构体以及函数*/ //线性表增长大小 #define LISTINCREMENT 10 #define OK 1 #define FALSE 0 //结构体 typedef struct { int *elem; int length; int listsize; }sqList; //初始化线性表 int initSqList(sqList &); //向线性表中插入数据 int insertSqList(sqList &, int, int); //删除线性表中数据 int delSqList(sqList &, int, int &); //合并两张表 int margSqList(sqList, sqList, sqList &); #endif // !_SQ_LIST /*sqList.cpp*/ /*对函数进行定义*/ #include "sqList.h" #include <cstdlib> #include <memory> //初始化线性表 int initSqList(sqList &L) { //创建大小为LIST_INIT_SIZE的数组 L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int)); if (!L.elem) return FALSE; L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; } //向线性表中插入数据 int insertSqList(sqList &L, int i, int nElem) { //判断i是否合法 if (i < 1 || i > L.length + 1) return FALSE; //存储空间已满,重新分配 if (L.length >= L.listsize) { int *newBase = (int *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(int)); if (!newBase) return FALSE; L.elem = newBase; L.listsize += LISTINCREMENT; } //i(包括i)后的数据依次后移 for (int n = L.length + 1; n >= i; --n) L.elem = L.elem[n - 1]; //插入数据 L.elem[i - 1] = nElem; ++L.length; /* int *q = &(L.elem[i - 1]); for (int *p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p; ++L.length; */ return OK; } //删除线性表中数据 int delSqList(sqList &L, int i, int &nElem) { //判断i是否合法 if (i < 1 || i > L.length + 1) return FALSE; //取出被删除的元素 nElem = L.elem[i - 1]; //i(包括i)后的数据前移 for (int n = i - 1; n < L.length; ++n) L.elem = L.elem[n + 1]; --L.length; /* int *p = &(L.elem[i - 1]); nElem = *p; int *q = L.elem + L.length - 1; for (++p; p <= q; ++p) *(p - 1) = *p; --L.length; */ return OK; } //合并两张表 int margSqList(sqList slL, sqList slR, sqList &slD) { slD.listsize = slD.length = slL.length + slR.length; //为目标线性表分配空间 slD.elem = (int *)malloc(slD.listsize * sizeof(int)); if (!slD.elem) return FALSE; int nl = 0; //slL的下标值 int nr = 0; //slR的下标值 int nd = 0; //slD的下标值 //归并 while (nl < slL.length && nr < slR.length) { if (slL.elem[nl] <= slR.elem[nr]) slD.elem[nd++] = slL.elem[nl++]; else slD.elem[nd++] = slR.elem[nr++]; } //插入slL剩余值 while(nl < slL.length) slD.elem[nd++] = slL.elem[nl++]; //插入slR剩余值 while(nr < slR.length) slD.elem[nd++] = slR.elem[nr++]; return OK; } /*main.cpp*/ /*测试以及样例输出*/ #include "sqList.h" #include <iostream> #include <ctime> using std::cout; using std::endl; int main() { sqList sl; initSqList(sl); int seed = 10; //添加元素 cout << "添加元素" << endl; for (int i = 0; i < seed; ++i) { int nRet = insertSqList(sl, i + 1, i); if (!nRet) break; } //样例输出 cout << "线性表大小:" << sl.listsize << endl; cout << "数据长度:" << sl.length << endl; cout << "数据内容:" << endl; for (auto i = 0; i < sl.length; ++i) cout << sl.elem[i] << "\t"; cout << endl; //删除元素 //产生1-10之间的随机数 srand((unsigned int)time(0)); int nIndex = rand() % 10; cout << "删除元素" << endl; int nDelElem = 0; delSqList(sl, nIndex, nDelElem); //样例输出 cout << "删除的元素位置:" << nIndex << endl; cout << "删除的元素:" << nDelElem << endl; //合并线性表 cout << endl; cout << "合并线性表" << endl; sqList slL, slR, slD; initSqList(slL); initSqList(slR); initSqList(slD); for (int i = 0; i < seed; ++i) { int nRet = insertSqList(slL, i + 1, i); if (!nRet) break; nRet = insertSqList(slR, i + 1, i); if (!nRet) break; } //合并 margSqList(slL, slR, slD); //样例输出 cout << "线性表大小:" << slD.listsize << endl; cout << "数据长度:" << slD.length << endl; cout << "数据内容:" << endl; for (auto i = 0; i < slD.length; ++i) cout << slD.elem[i] << "\t"; cout << endl; system("pause"); return 0; }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)