数据结构复习重点难点含编程参考.docx
- 文档编号:30697335
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:21
- 大小:20.82KB
数据结构复习重点难点含编程参考.docx
《数据结构复习重点难点含编程参考.docx》由会员分享,可在线阅读,更多相关《数据结构复习重点难点含编程参考.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构复习重点难点含编程参考
数据结构复习
第一章概论
(1)数据结构内容(P1)映像
(2)逻辑结构分类(P3)
(3)存储结构分类(P3)
(4)时间复杂度(规模,计算表示)(P8)
第二章线性表
(1)顺序表(插入14、删除16——实现方法、时间复杂度)
(2)链表(表示19、插入24、删除25)
(3)单向链表(表示、空链表)——程序设计、理解、填空
(4)单循环链表(尾指针26)
(5)双向链表(插入28—改变四个指针域、删除时节点变化28)
(6)顺序表和链表空间和时间比较(29)
存储密度
查找
插入
删除
顺序表
1
O
(1)
O(n)
O(n)
链表
<1
O(n)
O
(1)
O
(1)
第三章栈和队列
(1)栈的定义与性质、空栈的判断
(2)栈的表示方式(顺序、链栈)
(3)栈的程序理解(数值转换)
(4)进栈出栈(选择,判断栈的容量)
(5)双向栈(P34)
(6)队列的定义性质
(7)循环队列(判断队列满、列队空、求队列中元素个数)
第四章串
(1)空串和空白串
(2)串的基本运算(P52定位、求子串、串的比较)
(3)串的节点大小(P54)
(4)子串的定位
第五章多维数组广义表
(1)二维数组的存储计算(行序、列序)
(2)特殊矩阵(对称、上三角、下三角)(20090126)
(3)三元组表
(4)广义表(表头、表尾、长度、深度、画图)P67
第六章树
(1)二叉树性质(72-73)
(2)二叉树(遍历)
(3)二叉树程序阅读与编程(高度、叶子结点个数)
(4)森林、树、二叉树的转换(84-85)
(5)树的存储结构(左孩子右兄弟88)
(6)哈夫曼树生成、编码(译码)、带权最短路径(90)
第七章图
(1)无向图和有向图101
(2)图→邻接矩阵和邻接表→图(103-105)
(3)图的遍历(DFS108、BFS)
(4)最小生成树(普利姆118、克鲁斯卡尔)
(5)有向图的拓扑序列
(6)最短路径(迪杰斯特拉122)
森林、树、二叉树的转换(84-85)
1.将树转换成二叉树
(1)加线:
在兄弟之间加一连线
(2)抹线:
对每个结点,除了其左孩子外,去除其与其余孩子之间的关系
(3)旋转:
以树的根结点为轴心,将整树顺时针转45°
2.将二叉树转换成树
(1)加线:
若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子,……沿分支找到的所有右孩子,都与p的双亲用线连起来
(2)抹线:
抹掉原二叉树中双亲与右孩子之间的连线
(3)调整:
将结点按层次排列,形成树结构
3.森林转换成二叉树
(1)将各棵树分别转换成二叉树
(2)将每棵树的根结点用线相连
(3)以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构
4.二叉树转换成森林
(1)抹线:
将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
(2)还原:
将孤立的二叉树还原成树→转方法2
第八章排序
(1)关键字的比较、记录移动
(2)考试题型:
选择(堆排序)、程序填空(二分法,冒泡——两种改进冒泡)、简答题/绘图(快速,堆排序)
(3)各种排序方法比较
直接插入
希尔
冒泡
快速146(*****)
选择150
堆排序
(*****)
二路归并
箱排序
(**)
161
是否稳定性
稳定
不稳定
稳定
不稳定
不稳定
不稳定
稳定
稳定
是否就地
就地
就地
就地
非就地
就地
就地
非就地
非就地
最佳复杂度
O(n)
O(nlgn)
最差复杂度
O(n2)
O(n2)
O(nlgn)
平均复杂度
O(n2)
O(n1.25)
O(n2)
O(n2)
O(nlgn)
备注
监视哨
二分法插入
增量d
两指针i、j
两步
先个位
再十位
题型
二分法插入
程序填空
写序列
选择(大小)
画图
写序列
第九章查找
顺序查找
二分法
(*****)
分块查找
二叉排序树(****)
B-树
(***)
散列表
(****)
平均查找
O(n)
O(lgn)
具体分析174
O(nlgn)
说明
(n+1)/n*lg(n+1)-1
每一块个数173
定义、中序遍历
散列函数
冲突处理——探测
填充因子193
题型
平均查找长度选择题
比较节点个数
比较节点
画图
画图(节点分裂)、
结点个数182
公式191
画图(给出散列序列)
线性探测、拉链法
第一十章文件
(1)相关定义(206)
(2)索引顺序文件分类(ISAM、VSAM)
(3)多关键字文件——倒排文件
编程题:
(1)单链表(两个链表链接、删除、查找、统计满足条件的节点个数)
(2)二叉树(高度、叶子结点个数、总结点个数)
附录1链表相关程序
/*基本的链式顺序表操作*/
#include
#include
#include
typedefintElemtype;
typedefstructLnode
{
Elemtypedata;/*数据子域*/
structLnode*next;/*指针子域*/
}Lnode;/*节点结构类型*/
Lnode*L;
/*函数声明*/
Lnode*creat_L();
voidout_L(Lnode*L);
voidinsert_L(Lnode*L,inti,Elemtype);
Elemtypedelete_L(Lnode*L,inti);
intlocat_L(Lnode*L,Elemtypee);
/*主函数*/
voidmain()
{
inti,k,loc;
Elemtypee,x;
charch;
do{printf("\n");
printf("\n1.建立单链表");
printf("\n2.插入元素");
printf("\n3.删除元素");
printf("\n4.查找元素");
printf("\n0.结束程序运行");
printf("\n===================================");
printf("\n请输入您的选择(1,2,3,4,0)");
scanf("%d",&k);
switch(k)
{case1:
{L=creat_L();
out_L(L);
}break;
case2:
{printf("\n请输入插入位置:
");
scanf("%d",&i);
printf("\n请输入要插入元素的值:
");
scanf("%d",&e);
insert_L(L,i,e);
out_L(L);
}break;
case3:
{printf("\n请输入要删除元素的位置:
");
scanf("%d",&i);
x=delete_L(L,i);
out_L(L);
if(x!
=-1)
{printf("\n删除的元素为:
%d\n",x);
printf("\n删除%d后的单链表为:
\n",x);
out_L(L);
}
elseprintf("\n要删除的元素不存在!
:
");
}break;
case4:
{printf("\n请输入要查找的元素值:
");
scanf("%d",&e);
loc=locat_L(L,e);
if(loc==-1)printf("\n未找到指定元素!
");
elseprintf("\n已找到,元素位置是%d",loc);
}break;
}/*switch*/
printf("\n----------------------");
}while(k>=1&&k<5);
printf("\n按回车键,返回...........\n");
getchar();
}/*main*/
/*建立线性链表*/
Lnode*creat_L()
{Lnode*h,*p,*s;Elemtypex;
h=(Lnode*)malloc(sizeof(Lnode));/*分配头结点*/
h->next=NULL;
p=h;
printf("\n请输入第一个数据元素:
");
scanf("%d",&x);/*输入第一个数据元素*/
while(x!
=-999)/*输入-999,结束循环*/
{s=(Lnode*)malloc(sizeof(Lnode));/*分配新节点*/
s->data=x;s->next=NULL;
p->next=s;p=s;
printf("\n请输入下一个数据:
(输入-999,表示结束)");
scanf("%d",&x);/*输入下一个数据*/
}
return(h);
}/*creat_L*/
/*输出单链表中的数据元素*/
voidout_L(Lnode*L)
{Lnode*p;
p=L->next;printf("\n\n");
while(p!
=NULL)
{printf("%5d",p->data);p=p->next;}
}/*out_link*/
/*在第i个位置插入元素e*/
voidinsert_L(Lnode*L,inti,Elemtypee)
{Lnode*s,*p;
intj;
p=L;
j=0;
while(p!
=NULL&&j {p=p->next;j++;} if(p==NULL||i<1)printf("\n插入位置错误! "); else{s=(Lnode*)malloc(sizeof(Lnode)); s->data=e; s->next=p->next; p->next=s; } }/*insert_L*/ /*删除第i个元素,返回其值*/ delete_L(Lnode*L,inti) {Lnode*p,*q;intj;Elemtypex; p=L;j=0; while(p->next! =NULL&&j<=i-1) {p=p->next;j++;} if(! p->next||i<1) {printf("\n删除位置错误! ");return(-1);} else{q=p->next;x=q->data; p->next=q->next;free(q); return(x); } }/*delete_L*/ /*查找值为e的元素,返回它的位置*/ intlocat_L(Lnode*L,Elemtypee) {Lnode*p;intj=1; p=L->next; while(p! =NULL&&p->data! =e) {p=p->next; j++; } if(p! =NULL)return(j); elsereturn(-1); }/*locat_L*/ 附录2二叉树相关程序 #include #include #defineM100 typedefcharEtype;/*定义二叉树结点值的类*/ typedefstructBiTNode/*树节点结构*/ {Etypedata; structBiTNode*lch,*rch; }BiTNode,*BiTree; BiTreeque[M]; intfront=0,rear=0; /*函数原型声明*/ BiTNode*creat_bt1(); BiTNode*creat_bt2(); voidpreorder(BiTNode*p); voidinorder(BiTNode*p); voidpostorder(BiTNode*p); voidenqueue(BiTree); BiTreedelqueue(); voidlevorder(BiTree);/*层次遍历二叉树*/ inttreedepth(BiTree); voidprtbtree(BiTree,int); voidexchange(BiTree); intleafcount(BiTree); voidpaintleaf(BiTree); BiTNode*t; intcount=0; /*主函数*/ voidmain() {charch;intk; do{printf("\n"); printf("\n=============主菜单===================="); printf("\n1.建立二叉树方法1"); printf("\n2.建立二叉树方法2"); printf("\n3.先序递归遍历二叉树"); printf("\n4.中序递归遍历二叉树"); printf("\n5.后序递归遍历二叉树"); printf("\n6.层次遍历二叉树"); printf("\n7.计算二叉树的高度"); printf("\n8.计算二叉树中叶结点个数"); printf("\n9.交换二叉树的左右子树"); printf("\n10打印二叉树"); printf("\n0结束程序运行"); printf("\n============================================"); printf("\n请输入您的选择(0,1,2,3,4,5,6,7,8,9,10)"); scanf("%d",&k); switch(k) { case1: t=creat_bt1();break;/*调用性质5建立二叉树算法*/ case2: printf("\n请输入二叉树各结点的值: "); fflush(stdin); t=creat_bt2(); break;/*调用递归建立二叉树算法*/ case3: if(t) {printf("先序遍历二叉树: "); preorder(t); printf("\n"); } elseprintf("二叉树为空! \n"); break; case4: if(t) {printf("中序遍历二叉树: "); inorder(t); printf("\n"); } elseprintf("二叉树为空! \n"); break; case5: if(t) {printf("后序遍历二叉树"); postorder(t); printf("\n"); } elseprintf("二叉树为空! \n"); break; case6: if(t) {printf("层次遍历二叉树: "); levorder(t); printf("\n"); } elseprintf("二叉树为空! \n"); break; case7: if(t) {printf("二叉树高度为: %d",treedepth(t)); printf("\n"); } elseprintf("二叉树为空! \n"); break; case8: if(t) {printf("二叉树的叶子结点数为: %d\n",leafcount(t)); printf("二叉树的叶结点为: ");paintleaf(t); printf("\n"); } elseprintf("二叉树为空! \n"); break; case9: if(t) {printf("交换二叉树的左右子树: \n"); exchange(t); prtbtree(t,0); printf("\n"); } elseprintf("二叉树为空! \n"); break; case10: if(t) {printf("逆时针旋转90度输出的二叉树: \n"); prtbtree(t,0); printf("\n"); } elseprintf("二叉树为空! \n"); break; case0: exit(0); }/*switch*/ }while(k>=1&&k<=10); printf("\n再见! 按回车键,返回...\n"); getchar(); }/*main*/ /*利用二叉树性质5,借助一维数组v建立二叉树*/ BiTNode*creat_bt1() {BiTNode*t,*p,*v[20];inti,j;Etypee; /*输入结点的序号i,结点的数据*/ printf("\n请输入二叉树各结点的编号和对应的值(如1,a;输入0,#结束): "); scanf("%d,%c",&i,&e); while(i! =0&&e! ='#')/*当i为0,e为'#'时,结束循环*/ {p=(BiTNode*)malloc(sizeof(BiTNode)); p->data=e;p->lch=NULL;p->rch=NULL; v[i]=p; if(i==1)t=p;/*序号为1的结点是根*/ else {j=i/2; if(i%2==0)v[j]->lch=p;/*序号为偶数,作为左孩子*/ elsev[j]->rch=p;/*序号为偶数,作为右孩子*/ } printf("\n请继续输入二叉树各结点的编号和对应的值: "); scanf("%d,%c",&i,&e); } return(t); }/*creat_bt1*/ /*模仿先序递归遍历方法,建立二叉树*/ BiTNode*creat_bt2() {BiTNode*t; Etypee; scanf("%c",&e); if(e=='#')t=NULL;/*对于'#'值,不分配新结点*/ else {t=(BiTNode*)malloc(sizeof(BiTNode)); t->data=e; t->lch=creat_bt2();/*左孩子获得新指针值*/ t->rch=creat_bt2();/*右孩子获得新指针值*/ } return(t); }/*creat_bt2*/ /*先序递归遍历二叉树*/ voidpreorder(BiTNode*p) {if(p) {printf("%3c",p->data); preorder(p->lch); preorder(p->rch); } }/*preorder*/ /*中序递归遍历二叉树*/ voidinorder(BiTNode*p) {if(p) {inorder(p->lch); printf("%3c",p->data); inorder(p->rch); } }/*inorder*/ /*后序递归二叉树*/ voidpostorder(BiTNode*p) {if(p) {postorder(p->lch); postorder(p->rch); printf("%3c",p->data); } }/*postorder*/ /*层次遍历二叉树*/ voidenqueue(BiTreeT) {if(front! =(rear+1)%M) { rear=(rear+1)%M; que[rear]=T; } } BiTreedelqueue() {if(front==rear)returnNULL; front=(front+1)%M; return(que[front]); } voidlevorder(BiTreeT)/*层次遍历二叉树*/ {BiTreep; if(T) {enqueue(T); while(front! =rear) {p=delqueue(); printf("%3c",p->data); if(p->lch! =NULL)enqueue(p->lch); if(p->rch! =NULL)enqueue(p->rch); } } } /*计算机二叉树的高度*/ inttreedepth(BiTreebt) {inthl,hr,max; if(bt! =NULL) { hl=treedepth(bt->lch); hr=treedepth(bt->rch); max=(hl>hr)? hl: hr; return(max+1); } elsereturn(0); } /*逆时针旋转90度输出二叉树树形*/ voidprtbtree(BiTreebt,intlevel) {intj; if(bt) { prtbtree(bt->rch,level+1); for(j=0;j<=6*level;j++) printf(""); printf("%c\n",bt->data); prtbtree(bt->lch,level+1); } } /*交换二叉树左右子树*/ voidexchange(BiTreebt) {BiTreep; if(bt) { p=bt->lch; bt->lch=bt->rch; bt->rch=p; exchange(bt->lch); exchange(bt->rch); } } /*计算叶结点数*/ intleafcount(BiTreebt) {if(bt! =NULL) { leafcount(bt->lch); leafcount(bt->rch); if((bt->lch==NULL)&&(bt->rch==NULL)) count++; } return(count); } /*输出叶结点*/ voidpaintlea
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习 重点难点 编程 参考