数据结构
(现在的两大方面:一方面向各专业领域中的特殊问题的数据结构的研究和发展,另一方面从抽象数据类型的观点来讨论数据结构)
1.1,
(1)数据:是客观事物的符号表示,是所有能输入计算机中并被计算机程序处理的符号的总称。
(2)数据元素:是数据的基本单位,用于完整的描述一个对象(人)(手,脚,眼部位的整体)
(3) 数据项:组成数据元素的,有独立含义的,不可分割的最小单元。(眼,手这些部位)
(4)数据对象:是性质相同的数据元素的集合,***是数据的一个子集***是集合内数据元素性质相同的这样一个数据元素
1.2,数据结构
(1)逻辑结构:(集合结构,线性结构,树结构,图结构)
(2)存储结构:也称物理结构(顺序存储结构,链式存储结构);
1.3,数据类型和抽象数据类型
数据类型:是高级程序设计语言中的一个基本数据类型
抽象数据类型:一般是指由 用户定义的,表示应用问题的数学模型,以及在这个模型上的一组操作 的总称。
1.4 抽象数据类型的表示与实现(慢慢学)
1.5算法是有限长的操作序列,
1.6算法分析:主要是分析时间复杂度和空间复杂度,一般运算空间较为充足,时间复杂度看(当n增大时O(f(n))的情况;
2线性表
2.1
由n个数据特性相同的元素构成的有限序列称为线性表。当n=0时称为空表。
2.2
线性表的顺序表是是指用一组连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像,这种存储结构的线性表为 顺序表。
2.3线性表的顺序表示和实现
lengh表示顺序表中当前的数据元素个数,数据元素a1,a2…an依次存放在数组elem[0],elem[1],…elem[lengh-1]
(1)初始化,取值,查找,插入,删除
(2)查找
int LocateElem(Squlist L,ElemType e)
{ //在顺序表L中查找值为e的数据元素,返回其序号
for(i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1;
return 0;
}
(3)插入
Status ListInsert(SqList &l,int i;ElemType e)
{ //在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=length+1
if ( (i<1) || (i>l.length+1) ) return ERROR; //i是否合法
if(L.length==MAXSIZE) return ERROR; //判断储存空间已满
for( j=L.length-1 ; j>=i-1 ; j-- )
l.elem[j+1]=L.elem[j];//插入位置及之后的元素后移
L.elem[i-1]=e;
++L.length;
return OK;
}
(4)取值
Status GetElem(SquList L,int i;ElemType &e)
{
if( (i<1) || (i>L.length) ) return ERROR;
e=L.elem[i-1];
return OK;
}
(5)删除
Status ListDelete(SqulList &L,int i)
{ //在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
if( (i<1) || (i>L.length) ) return ERROR;
for( j=i ; j<=L.length-1 ; j++ )
L.elem[j-1]=L.elem[j];//被删元素之后的元素前移
--L.length;
return OK;
}
2.4 线性表的链式表示和实现
单链表基本操作的实现
(1) 初始化
Status InitList (LinkList &L)
{ //构造一个函数
L = new LNode; //生成新结点,用头指针L指向头节结点
L->next = NULL; //头结点指针域置空
return OK;
}
(2)插入
Status LIstInsert(Linklist &L,int i ,ElemType e)
{ //在头结点的单链表L中的第i个位置插入值为e的新结点
p=L;j=0;
while( p && (j<i-1) )
{ p=p->next;++j; } //查找第一个i-个结点,p指向该结点
if( !p || j>i-1) return ERROR; // i>n+1 or i<1
s = new LNode; ***//生成新的结点*s***
s -> date = e; **//将新结点*s的数据域置为e**
s -> next = p -> next;
p -> next = s;
return OK;
}
(3) 删除
Status ListDelete(LinkList &L,int i)
{ //再带头结点的单链表L中,删除第i个元素
p=L ;j=0;
while( (p->next) && (j<i-1) )
{ p= p->next; ++j; } //查找第i-1个结点,p指向该结点
if((!p -> next) || (j>i-1) ) return ERROR;
q= p->next;//临时保存被删结点的地址以备释放
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放结点的空间
return OK;
}