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

数据结构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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构