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");
}