数据结构重点Jack.docx
《数据结构重点Jack.docx》由会员分享,可在线阅读,更多相关《数据结构重点Jack.docx(10页珍藏版)》请在冰豆网上搜索。
![数据结构重点Jack.docx](https://file1.bdocx.com/fileroot1/2023-1/8/39c7e236-bd6d-4398-a869-f7832c87562d/39c7e236-bd6d-4398-a869-f7832c87562d1.gif)
数据结构重点Jack
数据结构考试重点
一、软件危机的定义及产生的原因:
在计算机软件的开发和维护过程中遇到的一系列严重问题
定义:
“软件开发的高成本与低质量之间的矛盾”
二、软件测试方法的分类:
黑盒和白盒,黑盒即只能看见外在呈现的东西,不能看见裏面的结构和内容;白盒能够看见内在所有的内容和结构。
软件测试角度:
黑盒是你只能看见功能和页面,即所有最终展现的东西,当然这也就是你的测试对象;白盒是你能看到是是代码和架构,即所有内部结构和内容,同样这些也就是你的测试对象。
三、数据结构的分类:
逻辑结构
顺序存储结构
物理结构:
链式存储结构
四、算法的伪代码:
顺序表的插入:
Insert(inti,int&x){//在i位置插入x
intk;
if(last==MAXLENGTH){
printf(“线性表已满!
\n”);
exit(-1);}
if(i<1||i>last+1){
printf(“插入位置错误!
\n”);
exit(-2);}
else{
for(k=last-1;k>=i;k--)
list[k+1]=list[k];
list[i]=x;
++last;}
}
顺序表的删除:
Remove(inti){//删除i位置的元素
intk;
if(i<1||i>last){//下表以1作为起始索引
printf(“表中不存在位置为i的元素\n”);
exit(-1);
}
for(k=i;k<=last-1;k++)//后面元素前移
list[k]=last[k+1];
last--;
}
顺序表的并:
voidUnion(SeqList&A,SeqList&B)
{
intn=A.Length();
intm=B.Length();
for(inti=0;i<=m;i++){
intx=B.Get(i);//在B中取一元素
intk=A.Find(x);//在A中搜索它
if(k==-1)//若未找到插入它
A.Insert(n,x);n++;
}
}
顺序表的交:
voidIntersection(SeqList&A,SeqList&B)
{
intn=A.Length();
intm=B.Length();inti=0;
while(iintx=A.Get(i);//在A中取一元素
intk=B.Find(x);//在B中搜索它
if(k==-1){
A.Remove(i);n--;
}
elsei++;//未找到在A中删除它
}
}
链表的插入:
intList:
:
Insert(intx,inti){
//在链表第i个结点处插入新元素x
ListNode*p=current;current=first;
for(k=0;kif(current==NULL)break;
elsecurrent=current->link;
if(current==NULL&&first!
=NULL){
cout<<“无效的插入位置!
\n”;
current=p;
return0;
}
ListNode*newnode=//创建新结点
newListNode(x,NULL);
if(first==NULL||i==0){//插在表前
newnode->link=first;
first=current=newnode;
}
else{//插在表中或末尾
newnode->link=current->link;
current=current->link=newnode;
}
return1;
}
链表的删除:
intList:
:
Remove(inti){
//在链表中删除第i个结点
ListNode*p,*q;intk=0;
if(i==0)//删除表中第1个结点
{q=first;current=first=first->link;}
else{
p=current;current=first;
//找第i-1个结点
for(k=0;kif(current==NULL)break;
elsecurrent=current->link;
}
if(current==NULL||current->link==NULL){
cout<<“无效的删除位置!
\n”;
current=p;return0;
}
else{//删除表中或表尾元素
q=current->link;//重新链接
current=current->link=q->link;
}
Typex=q->data;deleteq;//删除q
returnx;//返回第i个结点的值
}
五、线性表的存储结构:
顺序存储结构
链式存储结构
六、栈与队列的定义:
栈:
只允许在一端插入和删除的线性表,允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
特点:
⏹后进先出(LIFO)
⏹先进后出(FILO)
队列:
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
⏹队尾(rear)——允许插入的一端
⏹队头(front)——允许删除的一端
☐队列中没有元素时,称为空队列
☐队列特点
⏹先进先出(FIFO)
七、假溢出及怎样避免:
☐当front=-1,rear=M-1时,再有元素入队发生溢出——真溢出
☐当front-1,rear=M-1时,再有元素入队发生溢出——假溢出
☐假溢出的解决方法?
当rear=MAXSIZE+1时,即超过队列末端时,
令rear=1;从而使队列的首尾相连接。
用表达式描述:
if(rear>MAXSIZE)
rear=1;
else
rear=rear+1;
八、二叉树的三种遍历:
☐先序遍历
⏹先访问根节点,然后分别先序遍历左子树、右子树
⏹根节点最先遍历
☐中序遍历
⏹先中序遍历左子树,然后访问根节点,最后中序遍历右子树
⏹根在中间
☐后序遍历
⏹先后序遍历左、右子树,然后访问根节点
⏹根在最后
先序遍历:
递归算法
voidpreorder(bitree*root)
{
bitree*p;
p=root;
if(p!
=NULL){
printf(“%c“,p->data);
preorder(p->lchild);
preorder(p->rchild);
}
}
中序遍历:
递归算法
voidinorder(biteee*root)
{
bitree*p;
p=root;
if(p!
=NULL)
{
inorder(p->lchild);
printf(“%c“,p->data);
inorder(p->rchild);
}
}
后序遍历:
递归算法
voidpostorder(bitree*root)
{
bitree*p;
p=root;
if(p!
=NULL){
postorder(p->lchild);
postorder(p->rchild);
printf(“%c“,p->data);
}
}
哈夫曼树:
⏹带权路径长度最短的树
⏹路径
☐从树中一个节点到另一个节点之间的分支构成这两个节点间的路径
⏹路径长度
☐路径上的分支数
⏹树的路径长度
☐从树根到每一个节点的路径长度之和
完全二叉树包含满二叉树。
九、图
有向图的识图、图的遍历
深度优先遍历:
深度优先遍历结果:
V1,V2,V4,V8,V5,V3,V6,V7
广度优先遍历:
V1,V2,V3,V4,V5,V6,V7,V8
Prim算法:
所得生成树权值和=1+2+3+5+6+8+10
=35
Kruskal算法:
structSGNode
{
intkey;//结点自身标识
//与当前结点相邻的结点集合,及其与相邻结点之间路径的权值
mapneighNodes;
}
classCGraph
{
public:
//构造、析构函数
CGraph();
~CGraph();
public:
//其他函数,供实例调用
voidDFS();
voidBFS();
voidPrim();
voidKruskal();
protected:
//属性变量
/*自行设计完成*/
private:
//成员变量
vectorNodeSet;
}
十、L、U分解、Jacobi迭代、Gauss-Seidel迭代
十一、最小二乘法、超定方程、
十二、实际问题水准网平差