数据结构和算法的基本介绍

1.数据结构:计算机存储、组织数据的方式。

2.算法:算法是一组有穷的规则,它们规定了解决某一特定类型问题的一系列运算,是对解题方案的准确与完整的描述。

3.空间复杂度:程序所需要的空间主要由指令空间、数据空间、环境栈空间构成。

4.指令空间是指用来存储经过编译之后的程序指令所需的空间。

5.数据空间是指用来存储所有常量和所有变量值所需的空间。数据空间包括

6.环境栈用来保存函数调用返回时恢复运行所需要的信息。

7.数据结构主要研究对象是:逻辑结构、存储结构和运算。

8.存储结构包含:顺序存储结构、链式存储结构

9.逻辑结构包含:线性结构(如线性表),非线性结构(如:树,图)

10.运算:算法的设计取决于数据的逻辑结构,实现依赖于采用的存储结构

11.线性表有两种存储方式:顺序表和链表。

12.顺序表是把线性表的节点按逻辑次序存放在一组地址连续的单元里。(例如数组)

13.链表是用一组任意的存储单元(可以是连续的,也可以是不连续的)来存储线性表的各个数据元素。每个元素除了需要储藏自身信息外,还需要存储一个指示其后继元素的信息(即直接后继的存储位置),这两部分信息组成了一个数据元素的存储结构,称为一个节点。每个节点包括两个域:数据域和指针域。数据域存储数据元素本身的信息,指针域是后续节点的指针,最后一个节点的指针域为空指针。

14.向数组中插入一个数值,则要把插入位置后面的每一个元素向后移动。空出要插入的位置,再把要插入的元素插入进去。

15.顺序存储的优点:逻辑相邻,物理相邻,可随机存取任意一元素,存储空间使用率高

16.顺序存储的缺点:插入删除操作需要移动大量元素,控件必须预先分配,表容量扩充难

17.代码如下:

      #include "Utility.h"

//-----线性表的插入、删除操作-----

//线性表的特点:数据呈线性排列

//线性表的存储特点:1)顺序存储(内存连续)

//2)链式存储(内存非连续)

//------案例:对数组元素进行插入、删除操作------

const int c_iLength = 10; //数组元素个数

int startIndex = 0; //插入位置

int endIndex = 0;

//--显示数组元素--

void showArray( int * pArray , int iLenght )

{

for( int i = 0 ; i < iLenght ; ++i )

cout<<"pArray["<<i<<"] = "<<pArray[i]<<endl;

}

//--判断数组是否为满的--

bool isFull( int * pArray )

{

if( pArray[c_iLength-1] != 0 )

return true;

else

return false;

}

//--判断数组是否为空的--

bool isEmpty( int * pArray )

{

if( pArray[0] == 0 )

return true;

else

return false;

}

//--对于数组的插入操作:在尾部插入--

void insertAtBack( int * pArray , int iValue )

{

//1、判断能否向数组插入元素

if(isFull(pArray))

{

cout<<"数组已满,无法插入数据"<<endl;

return;

}

 

//2、数组为空,直接插入在下标为0的位置

if(isEmpty(pArray))

{

pArray[endIndex++] = iValue;

return;

}

//3、根据endIndex插入数据

pArray[endIndex++] = iValue;

}

//--对于数组的插入操作:在头部插入--

void insertAtFront( int * pArray , int iValue )

{

//1、判断能否向数组插入元素

if(isFull(pArray))

{

cout<<"数组已满,无法插入数据"<<endl;

return;

}

 

//2、数组为空,直接插入在下标为0的位置

if(isEmpty(pArray))

{

pArray[endIndex++] = iValue;

return;

}

//3、挪动元素

for ( int i = endIndex ; i > 0 ; --i )

{

pArray[i] = pArray[i-1];

}

//4、插入数据

pArray[startIndex] = iValue;

//5、修改endIndex,让其指向下一个可插入位置

endIndex++;

}

//--对于数组的插入操作:在指定位置插入--

//参数3描述的是插入位置

void insertAtPos(int * pArray,int iValue,int index)

{

//1、判断能否向数组插入元素

if(isFull(pArray))

{

cout<<"数组已满,无法插入数据"<<endl;

return;

}

//2、数组为空,直接插入在下标为0的位置

if(isEmpty(pArray))

{

pArray[endIndex++] = iValue;

return;

}

//3、如果index无效

if(index < 0 || index >= c_iLength)

{

cout<<"index越界"<<endl;

return;

}

//4、解析index下标

if(index>=endIndex)

{

pArray[endIndex++] = iValue;

return;

}

//5、挪动元素

for( int i = endIndex ; i > index ; --i )

{

pArray[i] = pArray[i-1];

}

//6、赋值

pArray[index] = iValue;

 

//7、修改endIndex

endIndex++;

}

//---------作业:在头、尾、指定位置删除元素----------

void main()

{

int iArray[c_iLength] = {};

 

cout<<"------------"<<endl;

insertAtBack(iArray,5);

insertAtBack(iArray,10);

insertAtBack(iArray,15);

insertAtBack(iArray,20);

insertAtBack(iArray,25);

showArray(iArray,c_iLength);

cout<<"------------"<<endl;

insertAtFront(iArray,99);

showArray(iArray,c_iLength);

cout<<"------------"<<endl;

insertAtPos(iArray,1001,2);

insertAtPos(iArray,1002,9);

insertAtPos(iArray,1003,5);

showArray(iArray,c_iLength);

insertAtPos(iArray,1003,15);

system("pause");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值