数据结构实验课教案_数据结构实验二学习

2020-02-27 教案模板 下载本文

数据结构实验课教案由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构实验二学习”。

授课教案

(2016—2017学年度第一学期)

课程名称: 课程编码: 总学时: 课程类别:

任课教师: 开课单位: 职称: 授课专业: 授课班级:

数据结构 B13040009A 总学分: 专业课 李素若 计算机工程学院

教授 计算机科学与技术

2015级计算机科学与技术专业1、2班 授课进度第3周,第6次课(2学时)授课题目

(教学章、节实验一线性表的顺序存储结构 或主题)

授课日期

016年9月14日(9 2

月13日)

.掌握线性表顺序存储结构的特点:逻辑上相邻的数据元素其物理位置上也相邻。1 2.掌握线性表顺序存储结构的插入、删除操作特点移动操作。

教学

目标

1.线性表的顺序存储特点

教学 2.线性表的顺序存储的基本算法 重点

1.线性表的顺序存储的基本算法

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

.输入一组整型元素序列,建立顺序表。1 2 .遍历该顺序表。3 .在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。4 .判断该顺序表中元素是否对称,对称返回1,否则返回0。5 .输入整型元素序列利用有序表插入算法建立一个有序表。6 .利用实验6建立两个递增有序表并把它们合并成一个递增有序表。7

二、实验指导

1.参考程序为:

voidCreateSqList(SqList*L){ intn,i; do{ printf(“请输入数据元素的个数:”);

scanf(“%d”,&n);

if(nelem[i])); L­>length=n;

} 2 .参考程序为:

voidPrintList(SqListL){ inti;

for(i=0;i

intFindelems(SqListL,ElemTypee){ inti;

for(i=0;i

return0;

} 4.分析:从顺序表表头开始扫描,当数据元素为偶数时就从该数开始往后查找,一旦

— 1—

教学过程及内容

找到奇数,则将该偶数与此奇数交换。顺序表中所有数据全部扫描结束后,所有奇数就排列 在表的前端。参考程序为:

voidChangeVal(SqList*L){ inti,j,temp;

for(i=0;ilength;i++){ if(L­>elem[i]%2==0){ for(j=i+1;jlength;j++){

if(L­>elem[j]%2!=0){

temp=L­>elem[i];

L­>elem[i]=L­>elem[j]; L­>elem[j]=temp; break; } } if(j==L­>length)break; } } } 5.参考程序为:

intYesNo_Symmetry(SqListL){ inti,j;

j=L.length­1; for(i=0;i

return0; } return1;

} 6 .参考程序为:

voidInsert_OrderList(SqList*L,intx){ inti,j;

for(i=0;ilength;i++)if(L­>elem[i]>x)break; for(j=L­>length­1;j>=i;j­­)

— 2—

教学过程及内容

L­>elem[j+1]=L­>elem[j]; L­>elem[i]=x; L­>length++;

} voidCreate_OrderList(SqList*L){ intn,i,input; do{ printf(“请输入数据元素的个数:”); scanf(“%d”,&n);

if(n

while(n

Insert_OrderList(L,input); } } 7 .参考程序为:

SqList*Merge_OrderList(SqListA,SqListB)//将有序顺序表A和B合并到有序顺序表C中返回 { inti=0,j=0,k=0;

SqList*C=(SqList*)malloc(sizeof(SqList)); C­>length=0;

while(j

C­>elem[i++]=A.elem[j++]; else C­>elem[i++]=B.elem[k++];

} if(j==A.length)

while(kelem[i++]=B.elem[k++]; if(k==B.length)while(jelem[i++]=A.elem[j++]; C­>length=i; returnC;

}

— 3— 授课进度第4周,第8次课(2学时)授课题目

(教学章、节实验二单向链表 或主题)

授课日期

016年9月21日(9 2

月20日)

.掌握线性链表的操作特点,即指针是逻辑关系的映像。1 .掌握动态产生单链表的方法。2 3 .熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。

教学

目标

1.掌握动态产生单链表的方法。

教学 2.熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。重点

1.熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。1 .遍历单向链表。2 3 .把单向链表中元素逆置(不允许申请新的结点空间)。.在单向链表中删除所有的偶数元素结点。4 5 .编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建 立一个非递减有序单向链表。

.利用实验5建立两个递增有序单向链表,然后合并成一个递增链表。6 7 .利用实验1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个 全部为偶数(尽量利用已知的存储空间)。

二、实验指导

1.参考程序为:

LinkListCreateListH(void)//头插法产生带头结点单链表 { intch;

LinkListhead=(LinkList)malloc(sizeof(LNode)); LinkLists;

head­>next=NULL;

while(scanf(“%d”,&ch)==1)//输入数据类型错误时结束单链表的生成 { s=(LinkList)malloc(sizeof(LNode)); s­>data=ch;

s­>next=head­>next; head­>next=s; } returnhead;

} LinkListCreateListRand(void)//利用随机函数产生带头结点单链表(头插法){ intch,i;

LinkListhead=(LinkList)malloc(sizeof(LNode)); LinkLists;

head­>next=NULL;

srand((unsigned)time(NULL));

printf(“PleaseinputCreateNnmbers:”); scanf(“%d”,&ch);

for(i=0;i

s­>data=rand()%50;//随机产生0~49之间的数

— 1—

教学过程及内容

s­>next=head­>next; head­>next=s; } returnhead; } 2 .参考程序为:

voidPrintLinkList(LNodeL){ LinkListp; p=L.next; while(p){ printf(“%d”,p­>data); p=p­>next; } printf(“n”); } 3.参考程序为:

voidInverse_set(LinkListhead){ LNode*r,*m=NULL,*p; p=head­>next; while(p!=NULL){ r=m;m=p; p=p­>next; m­>next=r; } head­>next=m; } 4.参考程序为:

voidDelEvenLinkList(LinkListhead){ LinkListq,p; p=head­>next; q=head;

while(p){ if(p­>data%2==0){ q­>next=p­>next; free(p);

— 2—

教学过程及内容

p=q­>next; } else { q=p;

p=p­>next; } } } 5 .参考程序为:

voidInsertIncr(LinkListhead,ElemTypex)//将结点插入递增的单链表 { LinkListq,p,s;

s=(LinkList)malloc(sizeof(LNode)); s­>data=x; q=head;

p=head­>next;

while(p&&p­>data

p=p­>next; } s­>next=q­>next; q­>next=s;

} LinkListCreateListIncr(void)//通过调用插入有序链表函数生成递增单链表 { intch;

LinkListhead=(LinkList)malloc(sizeof(LNode)); LinkLists;

head­>next=NULL;

while(scanf(“%d”,&ch)==1)//输入数据类型错误时结束单链表的生成 InsertIncr(head,ch); returnhead; } 6 .参考程序为:

LinkListLinkListCat(LinkListhead1,LinkListhead2){ LinkListh1,h2,h;

LinkListhead=(LinkList)malloc(sizeof(LNode)); head­>next=NULL;

— 3—

教学过程及内容

h1=head1­>next; h2=head2­>next; h=head; while(h1&&h2){ if(h1­>datadata){ h­>next=h1; h=h­>next;

h1=h1­>next; } else { h­>next=h2; h=h­>next; h2=h2­>next; } } if(h1)h­>next=h1; if(h2)h­>next=h2; returnhead; } 7 .参考程序为: # include # include # include typedefintElemType;//元素类型 typedefstructLNode { ElemTypedata; structLNode*next; } LNode,*LinkList;

voidPrintLinkList(LNodeL){ LinkListp;

p=L.next; while(p){ printf(“%d”,p­>data); p=p­>next;

— 4—

教学过程及内容

} printf(“n”);

} voidDecoLinkList(LNodehead,LinkListhead1,LinkListhead2)//将单链表head拆分奇数链head1和偶数链head2 { LinkListh,h1,h2;

h=head.next; h1=head1; h2=head2; while(h){ if(h­>data%2==0){ h2­>next=h; h=h­>next; h2=h2­>next; } else { h1­>next=h; h=h­>next; h1=h1­>next; } } h1­>next=NULL; h2­>next=NULL; } main(){ LinkListhead;

LinkListhead1=(LinkList)malloc(sizeof(LNode)); LinkListhead2=(LinkList)malloc(sizeof(LNode)); head=CreateListIncr();

PrintLinkList(*head);

DecoLinkList(*head,head1,head2); PrintLinkList(*head1); PrintLinkList(*head2);

}

— 5— 授课进度第5周,第10次课(2学时)授课题目

(教学章、节实验三栈的存储及基本运算 或主题)

授课日期

016年9月28日(9 2

月27日)

.掌握栈这种数据结构特性及其主要存储结构,并能在现实生活中灵活运用。1 2.了解和掌握递归程序设计的基本原理和方法。

教学

目标

.掌握栈的两种存储结构 1.栈的基本运算 教学 2.了解栈在递归函数中的作用 重点 3.掌握栈的两种存储结构 1 教学 2.栈的基本运算 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

.采用顺序存储实现栈的初始化、入栈、出栈操作。1 2 .采用链式存储实现栈的初始化、入栈、出栈操作。3 .写一个程序,将输入的十进制数据M转换为八进制数据M8,将其调试通过。在此 基础上修改程序,实现十进制数据M向N进制(2或8或16)的转换。(1)采用顺序存储结构实现栈。(2)采用链表结构实现栈。

二、实验指导

.参考程序为: 1 # include # include # defineStack_Size100 # defineOK 1 # defineERROR 0 typedefintElemType; typedefstructStack { ElemTypeelem[Stack_Size]; inttop;

//用来存放栈中元素的一维数组

//用来存放栈顶元素的下标

} SqStack;

intInitStack(SqStack**s)//初始化顺序栈 {(*s)=(SqStack*)malloc(sizeof(SqStack));

if((*s)==NULL)returnERROR;(*s)­>top=­1; returnOK;

} intEmptyStack(SqStacks)//判断栈空 { if(s.top==­1)

{ printf(“stackisempty!n”); returnOK; } returnERROR;

} intGetTop(SqStacks,int*e)//取栈顶元算 { if(EmptyStack(s))returnERROR;

*e=s.elem[s.top];

— 1—

教学过程及内容

returnOK;

} intPush(SqStack*s,inte)//入栈 { if(s­>top==Stack_Size­1)

{ printf(“stackisfull!n”); returnERROR; } s­>top++;

s­>elem[s­>top]=e; returnOK;

} voidPrintStack(SqStacks)//打印栈中数据 { inti;

for(i=0;i

} intPop_Stack(SqStack*s,int*e)//出栈 { if(EmptyStack(*s))

returnERROR; *e=s­>elem[s­>top]; s­>top­­; returnOK; } voidmain(){ intcord,e,x,y; SqStack*s; do { printf(“nMainMenun”); printf(“1­­­­CreatStackn”); printf(“2­­­­GetTopElementn”); printf(“3­­­­Pushn”); printf(“4­­­­Popn”); printf(“5­­­­Printn”); printf(“6­­­­quitn”); scanf(“%d”,&cord);

— 2—

教学过程及内容

switch(cord){ case1:

InitStack(&s); break; case2:

if(GetTop(*s,&y))

printf(“StackTop=[%d]n”,y); break; case3:

printf(“Pleaseinputpushelement:”); scanf(“%d”,&e); Push(s,e); break; case4:

if(Pop_Stack(s,&x))

printf(“Popstack=[%d]n”,x); break; case5:

PrintStack(*s); break;

case6:

return;

} } while(cord # include # defineStack_Size100 # # defineOK 1 # defineERROR 0 typedefintElemType; typedefstructstacknode { ElemTypedata;

structstacknode*next; } StackNode; typedefstruct { StackNode*top;/*栈顶指针*/ LinkStack; }

— 3—

教学过程及内容

voidInitStack(LinkStack*s)//初始化栈 { s­>top=NULL;

} intEmptyStack(LinkStacks)//判断栈空 { if(s.top==NULL)returnOK;

elsereturnERROR;

} intGetTop(LinkStacks,int*e)//取栈顶元素 { if(EmptyStack(s))returnERROR; *e=s.top­>data;

} voidPush(LinkStack*s,inte)//入栈 { StackNode*p=(StackNode*)malloc(sizeof(StackNode));

p­>data=e;

p­>next=s­>top; s­>top=p;

} intPop_Stack(LinkStack*s,int*e)//出栈 { StackNode*p;

if(EmptyStack(*s))returnERROR;

p=s­>top; *e=p­>data; s­>top=p­>next; free(p); returnOK;

} voidPrintStack(LinkStacks)//打印栈中元素 { StackNode*p=s.top; while(p){ printf(“%d”,p­>data); p=p­>next; } } voidmain()

— 4—

教学过程及内容

{ intcord,e,x,y; LinkStacks; do { printf(“nMainMenun”); printf(“1­­­­CreatStackn”); printf(“2­­­­GetTopElementn”); printf(“3­­­­Pushn”); printf(“4­­­­Popn”); printf(“5­­­­Printn”); printf(“6­­­­quitn”); scanf(“%d”,&cord); switch(cord){ case1:

InitStack(&s); break; case2:

if(GetTop(s,&y))

printf(“StackTop=[%d]n”,y); break; case3:

printf(“Pleaseinputpushelement:”); scanf(“%d”,&e); Push(&s,e); case4: break;

if(Pop_Stack(&s,&x))

printf(“Popstack=[%d]n”,x); break; case5:

PrintStack(s); break;

case6:

return;

} } while(cord

— 5—

教学过程及内容

voidConversion(SqStack*S){ intN,n1,t;

printf(“输入一个十进制数字:n”);

scanf(“%d”,&N);//输入一个十进制数字

printf(“输入要转换的n进制数字(2、8、16):n”); scanf(“%d”,&n1);//输入要转换的进制

while(N){ Push(S,N%n1); N=N/n1; } printf(“该数转化为%d进制数为:t”,n1); if(n1==16){ while(!EmptyStack(*S)){ Pop_Stack(S,&t); if(t==10){printf(“A”);continue;} if(t==11){printf(“B”);continue;} if(t==12){printf(“C”);continue;} if(t==13){printf(“D”);continue;} if(t==14){printf(“E”);continue;} if(t==15){printf(“F”);continue;} printf(“%d”,t);

} } else PrintStack(*S); } voidmain(){ SqStack*S; InitStack(&S); Conversion(S); }(2)

voidConversion(LinkStack*S){ intN,n1,t;

printf(“输入一个十进制数字:n”);

scanf(“%d”,&N);//输入一个十进制数字

— 6—

教学过程及内容

printf(“输入要转换的n进制数字(2、8、16):n”); scanf(“%d”,&n1);//输入要转换的进制 while(N){ Push(S,N%n1); N=N/n1; } printf(“该数转化为%d进制数为:t”,n1); if(n1==16){ while(!EmptyStack(*S)){ Pop_Stack(S,&t); if(t==10){printf(“A”);continue;} if(t==11){printf(“B”);continue;} if(t==12){printf(“C”);continue;} if(t==13){printf(“D”);continue;} if(t==14){printf(“E”);continue;} if(t==15){printf(“F”);continue;} printf(“%d”,t);

} } else PrintStack(*S); } voidmain(){ LinkStackS; InitStack(&S); Conversion(&S); }

— 7— 授课进度第8周,第14次课(2学时)授课题目

(教学章、节实验四队列 或主题)

授课日期

016年10月19日(10 2

月18日)

.掌握队列这种数据结构的逻辑特性及其主要存储结构。1 2.在简单情况下会使用顺序结构的实现队列,熟练掌握循环队列的使用。.在复杂情况下会使用链表结构的队列,并能在现实生活中灵活运用。3 教学

目标

1.熟练掌握循环队列的使用。

教学 2.在复杂情况下会使用链表结构的队列。重点

1.链队列的使用。

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

.采用顺序存储实现循环队列的初始化、入队、出队操作。1 2 .采用链式存储实现队列的初始化、入队、出队操作。3 .编写一个程序,使用两个链队q1和q2,用来分别存储由计算机随机产生的20个 100以内的奇数和偶数,然后每行输出q1和q2的一个值,即奇数和偶数配对输出,直到任 一队列为空为止。

二、实验说明

.循环队列类型采用如下结构: 1 defineMAXSIZE100//最大队列长度 # typedefintElemType; typedefstruct{ ElemTypedata[MAXSIZE]; intfront,rear;//队头、队尾指针

SqQueue; } .链队类型采用如下结构: 2 typedefstructQNode { ElemTypedata; structQNode*next;

QNode,*QueuePtr; } typedefstruct { QueuePtrfront; QueuePtrrear;

LinkQueue; }

三、实验指导

1.参考程序为:

intInitQueue(SqQueue**Q)//初始化循环队列 { * Q=(SqQueue*)malloc(sizeof(SqQueue)); if(!(*Q))

return0;

*Q)­>front=(*Q)­>rear=0;(return1;

} intQueueEmpty(SqQueueQ)//判断队空 { returnQ.front==Q.rear;

}

— 1—

教学过程及内容

intQueueFull(SqQueueQ)//判断队满 { return(Q.rear+1)%MAXSIZE==Q.front;

} intEnQueue(SqQueue*Q,ElemTypee)//入队操作 { if(QueueFull(*Q))

/队列满 return0; /Q­>data[Q­>rear]=e;

Q­>rear=(Q­>rear+1)%MAXSIZE; return1;

} intDeQueue(SqQueue*Q,ElemType*e)//出队操作 { if(QueueEmpty(*Q))return0; else { *e=Q­>data[Q­>front];

Q­>front=(Q­>front+1)%MAXSIZE; return1; } } 2 .参考程序为:

intInitQueue(LinkQueue*Q)//将Q初始化为一个空的链队列 { Q­>front=Q­>rear=(QueuePtr)malloc(sizeof(QNode));

if(Q­>front==NULL)

return0;

Q­>front­>next=NULL; return1;

} intQueueEmpty(LinkQueueQ)//判断队空 { returnQ.front==Q.rear;

} intEnQueue(LinkQueue*Q,ElemTypee)//入队操作 { QueuePtrp;

p=(QueuePtr)malloc(sizeof(QNode)); if(!p)

return0;

— 2—

教学过程及内容

p­>data=e;

p­>next=NULL; Q­>rear­>next=p; Q­>rear=p; return1;

} intDeQueue(LinkQueue*Q,ElemType*e)//出队操作 { QueuePtrp;

if(QueueEmpty(*Q))return0;//若队列Q为空队列 p=Q­>front­>next;

*e=p­>data;

Q­>front­>next=p­>next; if(Q­>rear==p)

Q­>rear=Q­>front;//若Q只有一个结点 free(p); return1;

} 3 .参考程序为: intmain(){ LinkQueueq1,q2; inti=0,j=0,num; InitQueue(&q1); InitQueue(&q2);

srand((unsigned)time(NULL)); while(i

— 3—

教学过程及内容

{ DeQueue(&q1,&i);DeQueue(&q2,&j); printf(“%3d%3dn”,i,j);

} free(q1.front); free(q2.front); return0;

}

— 4— 授课进度 授课题目 第9周,第16次课(2学时)授课日期

016年10月26日(10 2

月25日)

(教学章、节实验五二叉树(Ⅰ)或主题).掌握二叉树的存储实现。1 .掌握二叉树的遍历思想。2 教学

目标

.掌握二叉树的存储实现。1 .掌握二叉树的遍历思想。教学 2 重点

1.掌握二叉树的遍历思想。

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

1.数据域为字符的一棵二叉树用广义表形式输入,创建一个采用二叉链表存储的二叉 树,并按广义表的形式输出这棵二叉树。

.在实验1的基础上完成这棵二叉树的中序遍历的递归算法。2 .在实验1的基础上完成这棵二叉树的中序遍历的非递归算法。3

二、实验指导

.参考代码为: 1 # defineMaxSize100 voidCreateBTNode(BTree*b,char*str)//广义表形式输入二叉树,按二叉链表存储二叉树 { BTNode*St[MaxSize],*p=NULL; inttop=­1,k,j=0;

charch; *b=NULL; ch=str[j]; while(ch!=''){ switch(ch){ case'(':top++;St[top]=p;k=1;break; case')':top­­;break; case',':k=2;break; default:p=(BTNode*)malloc(sizeof(BTNode));

p­>data=ch;p­>lchild=p­>rchild=NULL; if(*b==NULL)*b=p; else { switch(k){ case1:St[top]­>lchild=p;break; case2:St[top]­>rchild=p;break; } } } j++;

ch=str[j]; } } voidDispBTNode(BTNode*b)//广义表输出二叉树

— 1—

教学过程及内容

{ if(b!=NULL){ printf(“%c”,b­>data);

if(b­>lchild!=NULL||b­>rchild!=NULL){ printf(“(”);

DispBTNode(b­>lchild);

if(b­>rchild!=NULL)printf(“,”); DispBTNode(b­>rchild); printf(“)”); } } } 2 .参考代码为:

voidInOrder(BTreeT)//中序递归遍历 { if(T){ InOrder(T­>lchild);/*中遍历左子树*/ printf(“%3c”,T­>data);/*访问根结束*/

InOrder(T­>rchild); } } 3 .参考代码为:

voidInOrder1(BTreeT)//非递归中序遍历 { SqStack*S;BTreeP=T;

InitStack(&S); do{

/*从树或子树根出发往左到叶子*/ while(P){ Push(S,P); P=P­>lchild; } if(S­>top!=­1){/*P为NULL要么是叶子,要么是没有左子树*/

Pop(S,&P);

printf(“%3c”,P­>data); P=P­>rchild;

} } while((S­>top!=­1)||P); }

/*中根遍历右子树*/

— 2— 授课进度第11周,第20次课(2学时)授课题目

(教学章、节实验五二叉树(Ⅱ)或主题).二叉树的常用算法。1 2 .二叉树线索化及遍历。

授课日期

016年11月9日(11 2

月8日)

教学 目标

1.二叉树的常用算法。

教学 重点

1.二叉树的常用算法。

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

.求二叉树的宽度。1 2 .求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。.输出二叉树中从每个叶子结点到根结点的路径。3 4 .建立前序线索二叉树,并实现前序遍历。

二、实验指导

1.参考代码为:

intBTWidth(BTNode*b)//求二叉树宽度 { struct {

/结点的层次编号 intlno; /BTNode*p; //结点指针

Qu[MaxSize];//定义顺序非循环队列 } intfront,rear;

//定义队首和队尾指针

intlnum,max,i,n;

front=rear=0;//置队列为空

if(b!=NULL){ rear++;

//根结点指针入队 Qu[rear].p=b;

Qu[rear].lno=1; //根结点的层次编号为1

//队列不为空 while(rear!=front)

{ front++;

b=Qu[front].p;

//队头出队 //左孩子入队 lnum=Qu[front].lno; if(b­>lchild!=NULL){ rear++; Qu[rear].p=b­>lchild; Qu[rear].lno=lnum+1; } if(b­>rchild!=NULL){ rear++; Qu[rear].p=b­>rchild; Qu[rear].lno=lnum+1; } }

— 1— //右孩子入队

教学过程及内容

max=0;lnum=1;i=1; while(i

while(i

/求每层的结点数 n++;i++; /} lnum=Qu[i].lno; if(n>max)max=n; } returnmax; } else return0; } 2 .参考代码为:

intBTNodeDepth(BTNode*b)//求二叉树b的深度 { intlchilddep,rchilddep;

if(b==NULL)return(0); else { lchilddep=BTNodeDepth(b­>lchild);//左子数的高度 rchilddep=BTNodeDepth(b­>rchild);//右子树的高度

return(lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1); } } voidLong(BTreeT){ if(T!=NULL)//在T不为空的情况下

{ printf(“%3c”,T­>data);//访问节点

if(BTNodeDepth(T­>lchild)>BTNodeDepth(T­>rchild))//判断往左走还是往右走 Long(T­>lchild); else Long(T­>rchild); } } 3.参考代码为:

— 2—

教学过程及内容

voidPrintStack(SqStack*S)//使用线性栈辅助操作 { inti;

for(i=0;itop;i++)printf(“%3c”,S­>elem[i]); printf(“n”);

} voidAllPath(BTreeT,SqStack*S)//输出二叉树上从根到所有叶子结点的路径 { charch; if(T){ Push(S,T­>data); if(!T­>lchild&&!T­>rchild)//如果左指针和右指针同时为空,才说明该节点为叶子节

PrintStack(S); else { AllPath(T­>lchild,S); AllPath(T­>rchild,S); } Pop(S,&ch); } } 4.参考代码为:

BiThrTreepre;

voidPreThreading(BiThrTreep)//先序线索化 { if(p){ if(!p­>lchild)

{ p­>LTag=Thread;

p­>lchild=pre; //前驱线索 } if(!pre­>rchild)

{ pre­>RTag=Thread;

pre­>rchild=p; //后继线索 } pre=p; if(p­>LTag==Link)

PreThreading(p­>lchild);//左子树线索化 if(p­>RTag==Link)

— 3—

教学过程及内容

PreThreading(p­>rchild);//右子树线索化

} } BiThrTreePreOrderThreading(BiThrTreeT)//先序线索二叉树 { BiThrTreethrt; if(!(thrt=(BiThrTree)malloc(sizeof(BiThrNode))))

returnNULL; thrt­>LTag=Link;

thrt­>RTag=Thread;//建头结点 thrt­>rchild=thrt;//右指针回指 if(!T)thrt­>lchild=thrt;//空二叉树 else { thrt­>lchild=T; pre=thrt;

PreThreading(T);//先序遍历进行先序线索化

pre­>rchild=thrt;pre­>RTag=Thread;//最后一个结点线索化 thrt­>rchild=pre; } returnthrt;

} voidPreOrderTraverse_Thr(BiThrTreethrt)//先序遍历二叉树 { BiThrTreep;

printf(“先序遍历结果为:”); p=thrt­>lchild; while(p!=thrt){ printf(“%3c”,p­>data); while(p­>LTag==Link){ p=p­>lchild;

printf(“%3c”,p­>data); } p=p­>rchild; } printf(“n”); }

— 4— 授课进度第13周,第24次课(2学时)授课题目

(教学章、节实验六哈夫曼树 或主题)

授课日期

016年11月23日(11 2

月22日)

.理解哈夫曼树的特征及其应用。1.在对哈夫曼树进行理解的基础上,构造哈夫曼树,并用构造的哈夫曼树进行编 2 码和译码。

教学 目标 3.通过该实验,使学生对数据结构的应用有更深层次的理解。

1.哈夫曼树构造。

教学 2.哈夫曼编码和译码。重点

1.哈夫曼树构造。

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

1.哈夫曼树问题。

利用哈夫曼编码进行通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据进行预先编码;在接受端将传来的数据 进行解码(复原)对于双工信道(即可以双向传输的信道),每端都要有一个完整的编/译码 系统。试为这样的信息收发站写一个哈夫曼的编译码系统。

基本要求;(1)从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权 值(即字符出现的频度),建立哈夫曼树,进行编码,最后输出并存于文件hfmtree中。

2)利用已建好的哈夫曼编码文件hfmtree,对键盘输入的正文进行译码。输出字符正(文,再输出该文的二进制码。

3)测试数据。(用表2.1中给出的字符集(n=27)和频度的实际统计数据建立哈夫曼树。

表2.1用于测试的字符集合频度

并实现以下报文的译码和输出:“THISPROGRAMISMYFAVORITE”。

2.思考题:利用哈夫曼树及哈夫曼编码的原理编写一个算法,n个自然数之间经过加 减运算后结果最小的值是多少。注意:只能进行加减运算,且最后结果和运算的中间结果不 能为负。

二、实验指导

# include # include # include # include typedefstruct unsignedint unsignedint {

weight; parent,lchild,rchild;

} HTNode,*HuffmanTree; typedefchar **HuffmanCode; typedefstruct{ unsignedint s1; unsignedint s2;

} MinCode;

MinCodeSelect(HuffmanTreeHT,unsignedintn);

HuffmanCodeHuffmanCoding(HuffmanTree*H1,unsignedint*w,char*ch,unsignedintn)//求哈夫曼树及哈夫曼编码,将哈夫曼编码写入文本文件 {

— 1—

教学过程及内容

unsignedinti,s1=0,s2=0; HuffmanTreep,HT; HuffmanCodeHC; char *cd; unsignedintf,c,start,m; MinCodemin; FILE*fp;

if((fp=fopen(“Huffman.txt”,“wt”))==NULL){ printf(“CannotopenfileHuffman.txtanykeyexit!”); exit(1); } if(n

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(p=HT,i=0;iweight=*w;p­>parent=0; p­>lchild=0;p­>rchild=0; } for(;iweight=0;p­>parent=0; p­>lchild=0;p­>rchild=0;

} for(i=n+1;i

HT[s1].parent=i;HT[s2].parent=i; HT[i].lchild=s1;HT[i].rchild=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

} HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char*)); cd[n­1]=''; for(i=1;i

if(HT[f].lchild==c)cd[­­start]='0';

— 2—

教学过程及内容

elsecd[­­start]='1';

HC[i]=(char*)malloc((n­start)*sizeof(char)); strcpy(HC[i],&cd[start]); } free(cd);

for(i=1;i

} MinCodeSelect(HuffmanTreeHT,unsignedintn)//求权值的最小值和次最小值 { unsignedintmin,secmin; unsignedinttemp; unsignedinti,s1,s2; MinCodecode; s1=1;s2=1;

for(i=1;i

} for(;i

s2=i; break;

} for(i=1;i

— 3—

教学过程及内容

s2=i;

} code.s1=s1; code.s2=s2; returncode;

} voidTranscodeing(intn,char*Char_Code,char*Huffman_Code)//从文本文件中读取哈夫曼编码,并字符编码转为哈夫曼编码 { FILE*fp;

charstr[215],ch[50]={''}; HuffmanCodeHC=NULL; inti=0,len,j,k;

HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); if((fp=fopen(“Huffman.txt”,“rt”))==NULL){ printf(“CannotopenfileHuffman.txtanykeyexit!”); exit(1); } while(!feof(fp)){ memset(str,0,sizeof(str)); fgets(str,215,fp); if(str[0]==0)break; len=strlen(str); ch[i]=str[0];

HC[i]=(char*)malloc((len­1)*sizeof(char*)); memcpy(HC[i],&str[1],len­2); HC[i][len­2]=0; i++; } fclose(fp); i=0;k=0;

while(Char_Code[i]!=''){ for(j=0;j

— 4—

教学过程及内容

free(HC); } intmain(){ HuffmanTreeHT=NULL; HuffmanCodeHC=NULL; unsignedint*w=NULL,i,n;

charch[50]={''},Huffman_Code[1024]={''};

charChar_Code[]=“THISPROGRAMISMYFAVORITE”; printf(“Inputn:n”); scanf(“%d”,&n);

w=(unsignedint*)malloc((n+1)*sizeof(unsignedint)); w[0]=0;

printf(“Enterweight,character:n”); for(i=1;i

Transcodeing(n,Char_Code,Huffman_Code); printf(“%sn”,Huffman_Code); free(w); return0; }

— 5— 授课进度第14周,第26次课(2学时)授课题目

(教学章、节实验七图的遍历(Ⅰ)或主题)

授课日期

016年11月30日(11 2

月29日)

.掌握图常用的邻接矩阵存储存储结构。1.掌握图的邻接矩阵存储结构上的两种遍历图的方法,即深度优先遍历和广度优 2 先遍历。

教学 目标

1.图的邻接存储结构。

教学 2.图的邻接矩阵存储结构下的两种遍历。重点

1.图的邻接矩阵存储结构下的两种遍历。

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

图的邻接矩阵存储结构如下:

#defineMaxVerNum100//设置邻接矩阵的最大顶点数 typedefcharVertexType;//设置图的顶点信息为字符

//设置边上权值为整型 typedefintEdgeType;

typedefstruct{ VertexTypevexs[MaxVerNum];//图的顶点信息表

EdgeTypeedges[MaxVerNum][MaxVerNum];//图的邻接矩阵

//图的顶点数和边数 intn,e;

MGraph;//图的邻接矩阵表示结构定义 } 1.键盘输入数据,建立一个图的邻接矩阵,并进行图的深度优先遍历和广度优先遍历。

二、实验指导

.参考代码为: 1 # include # include # defineMaxVerNum100//设置邻接矩阵的最大顶点数 typedefcharVertexType;//设置图的顶点信息为整型

//设置边上权值为整型 typedefintEdgeType;

typedefstruct{ VertexTypevexs[MaxVerNum];//图的顶点信息表

EdgeTypeedges[MaxVerNum][MaxVerNum];//图的邻接矩阵

//图的顶点数和边数 intn,e;

MGraph;//图的邻接矩阵表示结构定义 } typedefenum{FALSE,TRUE}boolean; booleanvisited[MaxVerNum];//顶点访问标记向量 structlinkqueuenode { intdata; structlinkqueuenode*next; } ;

typedefstruct { structlinkqueuenode*front; structlinkqueuenode*rear; linkque; } voidInitQueue(linkque*q){ structlinkqueuenode*p; p=(structlinkqueuenode*)malloc(sizeof(structlinkqueuenode)); p­>next=NULL;

— 1—

教学过程及内容

q­>front=p;q­>rear=p;

} intQueueEmpty(linkqueq){ inti;

if(q.front==q.rear)i=1; elsei=0; return(i); } voidEnQueue(linkque*q,intx){ structlinkqueuenode*p; p=(structlinkqueuenode*)malloc(sizeof(structlinkqueuenode)); p­>data=x;p­>next=NULL; if(QueueEmpty(*q)){ q­>front­>next=p; q­>rear=p; } else { q­>rear­>next=p; q­>rear=p; } } intDeQueue(linkque*q,int*x){ structlinkqueuenode*p;

if(QueueEmpty(*q)){printf(“queueisempty!n”);return(0);} else { p=q­>front­>next; *x=p­>data;

q­>front­>next=p­>next; if(p­>next==NULL)

q­>rear=q­>front; free(p);

return(1); } } linkqueQ;

voidCreateMGraph(MGraph*g)//建立图g的邻接矩阵表示

— 2—

教学过程及内容

{ inti,j,k,w; intflag;

printf(“创建:有限图选0,无向图选1n”);

scanf(“%d”,&flag);

printf(“请输入顶点数和边数(格式为:顶点数,边数)n”); scanf(“%d,%d”,&g­>n,&g­>e);

printf(“输入顶点的信息,每个顶点以回车作为结束:n”); for(i=0;in;i++){ getchar();

scanf(“%c”,&(g­>vexs[i])); }

/将邻接矩阵数组初始化 for(i=0;in;i++)/for(j=0;jn;j++)g­>edges[i][j]=0;//图的遍历算法初始化该值为0 for(k=0;ke;k++){ printf(“输入顶点号i,顶点号j,权值w(非网图权值为1):n”); scanf(“%d,%d,%d”,&i,&j,&w); g­>edges[i][j]=w;

//构造无向图 if(flag)

g­>edges[j][i]=w;

} } voidDFSM(MGraph*g,inti)//对以邻接矩阵表示的图,以序号为i的顶点为出发点进行深度优先搜索 { intj;

printf(“%c”,g­>vexs[i]);//访问序号为i的顶点 visited[i]=TRUE;//将序号为i的顶点设置访问过标记 for(j=0;jn;j++)//扫描邻接矩阵的第i行,做以下操作

if((g­>edges[i][j]!=0)&&(!visited[j]))//寻找序号为i的顶点的未访问过的邻接点 设序号为j)({ printf(“­­>”);

DFSM(g,j);//以序号为j的顶点为出发点进行深度优先搜索 } } voidDFSMTraverse(MGraph*g,intstart)//对以邻接矩阵表示的图,从最初顶点start出发进行深度优先搜索 { inti;

for(i=0;in;i++)//将图的所有顶点设置为未访问过

— 3—

教学过程及内容

visited[i]=FALSE; DFSM(g,start);//对图进行深度优先搜索 printf(“n”);

} voidBFSM(MGraph*g,intk)//对以邻接矩阵表示的图,以序号为k的顶点为出发点进行广度优先搜索 { inti,j;

InitQueue(&Q);

printf(“%c”,g­>vexs[k]);//访问序号为k的顶点 visited[k]=TRUE;//将序号为k是结点设置为已访问过 EnQueue(&Q,k);//将序号为k的顶点入队 while(!QueueEmpty(Q)){ DeQueue(&Q,&i);

for(j=0;jn;j++)//寻找序号为i顶点的邻接点,并做如下处理

if((g­>edges[i][j]!=0)&&(!visited[j]))

//若序号为i的顶点有未访问过邻接点 { printf(“­­>%c”,g­>vexs[j]);//访问序号为j的顶点 visited[j]=TRUE;//设置序号为j的顶点访问过标记 EnQueue(&Q,j);//将序号为j的顶点入队 } } } voidBFSMTraverse(MGraph*g,intstart)//对以邻接矩阵表示的图,从最初顶点start开始进行广度优先搜索 { inti;

for(i=0;in;i++)//将所有顶点设置为未访问过 visited[i]=FALSE; BFSM(g,start);//对邻接矩阵表示的图进行广度优先搜索 printf(“n”);

} voidmain(){ MGraph*g=(MGraph*)malloc(sizeof(MGraph));//申请图g的邻接矩阵表示空间 CreateMGraph(g);//建立图

DFSMTraverse(g,0);//从顶点0出发进行图的深度搜索遍历 BFSMTraverse(g,0);//从顶点0出发进行图的广度搜索遍历 }

— 4— 授课进度 授课题目 第15周,第28次课(2学时)授课日期

016年12月7日(12 2

月6日)

(教学章、节实验七图的遍历(Ⅱ)或主题).掌握图常用的邻接表存储存储结构。1.掌握图的邻接表存储结构上的两种遍历图的方法,即深度优先遍历和广度优先 2 遍历。

教学 目标

1.图的邻接表存储结构。

教学 2.图的邻接表存储结构下的两种遍历。重点

1.图的邻接表存储结构下的两种遍历。

教学 难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

教学过程及内容

一、实验内容

图的邻接表存储结构如下:

#defineMaxVerNum100//定义最大顶点数为100 typedefcharVertexType;//设置图的顶点信息为字符

//边表表结点结构 typedefstructNode{ intadjvex; structNode*next; } EdgeNode;

typedefstructVNode{//顶点结点结构

VertexTypevertex;

EdgeNode*firstedge; } VNode,AdjList[MaxVerNum]; typedefstruct{ AdjListadjlist;

//顶点数和边数 intn,e;

intkind; //有向图为0,无向图为1 } ALGraph;

1.键盘输入数据,建立一个图的邻接邻接表,并进行图的深度优先遍历和广度优先遍 历。

二、实验指导

1.参考代码为:

# include # include # defineMaxVerNum100//定义最大顶点数为100 typedefcharVertexType;//设置图的顶点信息为字符

//边表表结点结构 typedefstructNode{ intadjvex; structNode*next; } EdgeNode;

typedefstructVNode{//顶点结点结构

VertexTypevertex;

EdgeNode*firstedge; } VNode,AdjList[MaxVerNum]; typedefstruct{ AdjListadjlist;

//顶点数和边数 intn,e;

intkind; //有向图为0,无向图为1 } ALGraph;

typedefenum{FALSE,TRUE}boolean; booleanvisited[MaxVerNum];//顶点访问标记向量

— 1—

教学过程及内容

structlinkqueuenode { intdata; structlinkqueuenode*next; } ;

typedefstruct { structlinkqueuenode*front; structlinkqueuenode*rear; linkque; } voidInitQueue(linkque*q){ structlinkqueuenode*p; p=(structlinkqueuenode*)malloc(sizeof(structlinkqueuenode)); p­>next=NULL;

q­>front=p;q­>rear=p;

} intQueueEmpty(linkqueq){ inti;

if(q.front==q.rear)i=1; elsei=0; return(i); } voidEnQueue(linkque*q,intx){ structlinkqueuenode*p; p=(structlinkqueuenode*)malloc(sizeof(structlinkqueuenode)); p­>data=x;p­>next=NULL; if(QueueEmpty(*q)){ q­>front­>next=p; q­>rear=p; } else { q­>rear­>next=p; q­>rear=p; } } intDeQueue(linkque*q,int*x){

— 2—

教学过程及内容

structlinkqueuenode*p;

if(QueueEmpty(*q)){printf(“queueisempty!n”);return(0);} else { p=q­>front­>next; *x=p­>data;

q­>front­>next=p­>next; if(p­>next==NULL)

q­>rear=q­>front; free(p);

return(1); } } linkqueQ;

voidCreateALGraph(ALGraph*g)//建立图的邻接矩阵表示 { inti,j,k; intflag;

EdgeNode*s1,*s2;

printf(“创建:有向图选0,无向图选1n”);

scanf(“%d”,&flag);

printf(“请输入顶点数和边数(格式为:顶点数,边数)n”); g­>kind=flag;

scanf(“%d,%d”,&g­>n,&g­>e);//输入图的顶点数和边数 printf(“输入顶点的信息,每个顶点以回车作为结束:n”); for(i=0;in;i++)//初始化顶点数组 { scanf(“%c”,&(g­>adjlist[i].vertex)); g­>adjlist[i].firstedge=NULL; } printf(“输入构成边或弧:顶点号i,顶点号j:n”); if(flag==0)//有向图 { for(k=1;ke;k++){ scanf(“%d,%d”,&i,&j);

s1=(EdgeNode*)malloc(sizeof(EdgeNode)); s1­>adjvex=j; s1­>next=g­>adjlist[i].firstedge; g­>adjlist[i].firstedge=s1; } }

— 3—

教学过程及内容

else { //无向图

for(k=1;ke;k++){ scanf(“%d,%d”,&i,&j);

s1=(EdgeNode*)malloc(sizeof(EdgeNode)); s1­>adjvex=j;

s2=(EdgeNode*)malloc(sizeof(EdgeNode)); s2­>adjvex=i;

s1­>next=g­>adjlist[i].firstedge; g­>adjlist[i].firstedge=s1; s2­>next=g­>adjlist[j].firstedge; g­>adjlist[j].firstedge=s2; } } } voidDFSAL(ALGraph*g,inti)//对以邻接表表示的图,以序号为i的顶点为出发点进行深度优先搜索 { EdgeNode*p;

printf(“%c”,g­>adjlist[i].vertex);//访问序号为i的顶点 visited[i]=TRUE;//将序号为i的顶点设置访问过标记 p=g­>adjlist[i].firstedge; while(p){ if(!visited[p­>adjvex]){ printf(“­­>”);DFSAL(g,p­>adjvex); } p=p­>next; } } voidDFSALTraverse(ALGraph*g,intstart)//对以邻接表表示的图,从最初顶点start出发进行深度优先搜索 { inti;

for(i=0;in;i++)//将图的所有顶点设置为未访问过

visited[i]=FALSE; DFSAL(g,start);//对图进行深度优先搜索 printf(“n”);

} voidBFSAL(ALGraph*g,intk)//对以邻接表表示的图,以序号为i的顶点为出发点进行广度优先搜索 { inti;

— 4—

教学过程及内容

EdgeNode*p; InitQueue(&Q); printf(“%c”,g­>adjlist[k].vertex);//访问序号为k的顶点 visited[k]=TRUE;//将序号为k是结点设置为已访问过 EnQueue(&Q,k);//将序号为k的顶点入队

while(!QueueEmpty(Q)){ DeQueue(&Q,&i); p=g­>adjlist[i].firstedge; while(p){ if(!visited[p­>adjvex]){ printf(“­­>%c”,g­>adjlist[p­>adjvex].vertex);//访问p­>adjvex的顶点

visited[p­>adjvex]=TRUE; EnQueue(&Q,p­>adjvex); } p=p­>next; } } } voidBFSALTraverse(ALGraph*g,intstart)//对以邻接矩阵表示的图,从最初顶点start出发进行广度优先搜索 { inti;

for(i=0;in;i++)//将所有顶点设置为未访问过 visited[i]=FALSE; BFSAL(g,start);//对邻接矩阵表示的图进行广度优先搜索 printf(“n”); } voidmain(){ ALGraph*g=(ALGraph*)malloc(sizeof(ALGraph)); CreateALGraph(g);

DFSALTraverse(g,0);//从顶点0出发进行深度优先搜索 BFSALTraverse(g,0);//从顶点0出发进行广度优先搜索 }

— 5— 授课进度第16周,第30次课(2学时)授课题目

(教学章、节实验八查找 或主题)

授课日期

016年12月14日(12 2

月13日)

.掌握顺序查找、折半查找算法的思想及程序实现。1 2 .掌握二叉排序树、AVL树的查找、插入、删除、建立算法的思想及程序实现。.掌握散列存储结构的思想,能选择合适散列函数,实现不同冲突处理方法的散 3 教学

目标 列表的查找、建立。

.掌握顺序查找、折半查找算法的思想及程序实现。1 .掌握散列存储结构的思想,能选择合适散列函数,实现不同冲突处理方法的散 教学 2 重点 列表的查找、建立。

1.掌握散列存储结构的思想,能选择合适散列函数,实现不同冲突处理方法的散

教学 列表的查找、建立。难点

请选择你授课时所采用的教学方法(在括号中画“√”):

讲授法﹝﹞,讨论法﹝﹞,演示法﹝﹞,案例法﹝﹞,发现法﹝﹞,探究法﹝﹞,教学

谈话法﹝﹞,实验法﹝√﹞,参观法﹝﹞,考察法﹝﹞,自学辅导法﹝﹞,练习

方法

法(习题或操作课)﹝√﹞,读书指导法﹝﹞,听说法﹝﹞,写生法﹝﹞,视唱 法﹝﹞,工序法(技能课)﹝﹞,实习作业法﹝﹞,其他﹝﹞ 教学

实物﹝﹞,多媒体﹝﹞,投影﹝﹞,影像﹝﹞,CAI课件﹝﹞,PPT﹝√﹞,标本

手段

﹝﹞,挂图﹝﹞,模型﹝﹞,其他﹝﹞ 讨 论、思考 题、作业

[ 1]李素若,陈万华,游明坤主编.数据结构.北京:中国水利水电出版社,2014.[ 2]李素若,陈万华,游明坤主编.数据结构习题集及上机指导.北京:中国水利水 请选择你授课时所采用的教学手段(在括号中画“√”):

参考

电出版社,2014.文献

《数据结构实验课教案.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
数据结构实验课教案
点击下载文档
相关专题 数据结构实验二学习 数据结构 课教案 数据结构实验二学习 数据结构 课教案
[教案模板]相关推荐
    [教案模板]热门文章
      下载全文