久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

數(shù)據(jù)結(jié)構(gòu)實驗課教案

時間:2019-05-15 06:23:33下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《數(shù)據(jù)結(jié)構(gòu)實驗課教案》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《數(shù)據(jù)結(jié)構(gòu)實驗課教案》。

第一篇:數(shù)據(jù)結(jié)構(gòu)實驗課教案

數(shù)據(jù)結(jié)構(gòu)教案

實驗一:線性表的順序表示與實現(xiàn)

實驗學時:2學時

一.實驗?zāi)康模?/p>

1.掌握線性表的順序存儲結(jié)構(gòu);

2.掌握在順序表上進行的插入、刪除、查找、修改等操作。

二.實驗內(nèi)容:

1.分別建立順序表,并輸入初始數(shù)據(jù);

2.對順序表分別編寫插入、刪除、查找、修改等函數(shù)。

三.實驗重點:

順序表的建立及操作。

四.實驗要求:

1.用C語言編寫程序源代碼;

2.要分別完成建立、插入、刪除、查找、修改五種功能。3.源程序必須編譯調(diào)試成功,獨立完成。

五. 實驗器材:

一個裝有C語言編譯環(huán)境的計算機。

六.實驗步驟:

順序表 :

1.定義頭文件和順序表的存儲結(jié)構(gòu)類型等 #define ok 1 #define error 0 #define overflow 0 #define null 0 #include #include #define list_init_size 100 #define listincrement 10 typedef int elemtype;typedef int status;typedef struct{ elemtype *elem;int length;int listsize;}sqlist;2.編寫構(gòu)造空順序表的函數(shù) status listinit(sqlist *l){ l->elem=(elemtype *)malloc(list_init_size*sizeof(elemtype));if(!l->elem)

return overflow;l->length=0;l->listsize=list_init_size;return ok;}

3.編寫對順序表進行插入操作的函數(shù): status listinsert(sqlist *l,int i,elemtype e){ elemtype *newbase,*q,*p;if(i<1||i>listlength(*l)+1)

return error;if(l->length==l->listsize)

{ newbase=(elemtype *)realloc(l->elem,(l->listsize+listincrement)*sizeof(elemtype));

if(!newbase)

return overflow;

l->listsize+=listincrement;

} q=&(l->elem[i-1]);for(p=&(l->elem[l->length])-1;p>=q;--p)

*(p+1)=*p;*q=e;++l->length;return ok;}

4.編寫對順序表進行刪除操作的函數(shù):

status listdelete(sqlist *l,int i,elemtype *e){ elemtype *p,*q;if(i<1||i>l->length)

return error;p=&(l->elem[i-1]);*e=*p;q=l->elem+l->length-1;for(++p;p<=q;++p)

*(p-1)=*p;--l->length;return ok;}

5.編寫對順序表進行查找操作的函數(shù): status getelem(sqlist l,int i,elemtype *e){ if(i<1||i>listlength(l))return error;*e=l.elem[i-1];return ok;}

6.編寫對順序表進行修改操作的函數(shù): status locateelem(sqlist l,elemtype e){ int i;for(i=0;i

if(l.elem[i]==e)

return i+1;return 0;} 7.編寫實現(xiàn)兩個線性表的歸并操作的函數(shù) void mergelist(sqlist la,sqlist lb,sqlist *lc){ int i,j,k;int la_len,lb_len;elemtype ai,bj;i=j=1;k=0;listinit(lc);la_len=listlength(la);lb_len=listlength(lb);while(i<=la_len&&j<=lb_len){ getelem(la,i,&ai);getelem(lb,j,&bj);if(ai<=bj)

{

listinsert(lc,++k,ai);

++i;

} else

{

listinsert(lc,++k,bj);

++j;

} } while(i<=la_len){ getelem(la,i++,&ai);listinsert(lc,++k,ai);}

while(j<=lb_len)

{ getelem(lb,j++,&bj);listinsert(lc,++k,bj);

} }

8.銷毀線性表、清空線性表、判空、求表長等 status destroylist(sqlist *l){ if(l->elem)free(l->elem),l->elem=null;return ok;}

status clearlist(sqlist *l){ l->length=0;return ok;}

status listempty(sqlist l){ return(l.length==0);}

status listlength(sqlist l){ return l.length;}

9.打印線性表 void print(sqlist l){ int i;printf(“nlist: ”);for(i=0;i

10. 編寫主函數(shù) void main(){ int i;int n;elemtype a;sqlist l,la,lb,lc;clrscr();listinit(&l);listinit(&la);listinit(&lb);

printf(“please input list number”);scanf(“%d”,&n);printf(“n”);for(i=0;i

scanf(“%d”,&a);

listinsert(&l,i+1,a);} print(l);printf(“nlist length:%d”,listlength(l));

getelem(l,4,&a);printf(“ngetelem(l,4,&a),%d”,a);

listdelete(&l,3,&a);printf(“nlistdelete(&l,3,&a),%d”,a);print(l);

printf(“ninput list la”);

for(i=0;i<5;i++){

scanf(“%d”,&a);

listinsert(&la,i+1,a);} printf(“ninput list lb”);for(i=0;i<7;i++){

scanf(“%d”,&a);

listinsert(&lb,i+1,a);} mergelist(la,lb,&lc);print(la);print(lb);print(lc);}

實驗二:鏈表

實驗學時:2學時

一.實驗?zāi)康模?/p>

11. 掌握單、雙向鏈表的存儲結(jié)構(gòu);

12. 掌握在單、雙向鏈表上進行的插入、刪除、查找、修改等操作。

二.實驗內(nèi)容:

4.分別建立單、雙向鏈表,并輸入初始數(shù)據(jù);

5.對兩種單、雙向鏈表分別編寫插入、刪除、查找、修改等函數(shù)。

三.實驗重點:

單向鏈表的建立及操作。

四.實驗要求:

1.用C語言編寫程序源代碼;

2.要分別完成建立、插入、刪除、查找、修改五種功能。6.源程序必須編譯調(diào)試成功,獨立完成。

五. 實驗器材:

一個裝有C語言編譯環(huán)境的計算機。

六.實驗步驟:

單鏈表 :

1.定義頭文件和單鏈表的結(jié)構(gòu)體類型 #include #include typedef struct LNode {

int data;

struct LNode *next;}LNode, *LinkList;

2.編寫構(gòu)造單鏈表的函數(shù)

void InitList_L(LinkList L){ LinkList p,q;int i,b,j=0;p=L;printf(“請輸入鏈表中元素的值,用-1表示輸入結(jié)束:n”);do { scanf(“%d”,&b);q=(LinkList)malloc(sizeof(LNode));q->data=b;p->next=q;p=p->next;j+=1;} while(b!=-1);p->next=NULL;p=L;for(i=1;inext;printf(“%dn”,p->data);} }

13. 編寫對單鏈表進行插入操作的函數(shù): void ListInsert_L(LinkList L,int r,int e){ LinkList p,s;

int q=1,i,j=0;

p=L;

while(q>=1&&q<=r-1)

{

p=p->next;

++q;

} s=(LinkList)malloc(sizeof(LNode));

s->data=e;

s->next=p->next;

p->next=s;

p=L;while(p->next!=NULL)

{

p=p->next;

j+=1;

} p=L;

printf(“插入一個新結(jié)點后的鏈表為:n”);

for(i=1;i

{

p=p->next;

printf(“%dn”,p->data);

}

printf(“插入一個新結(jié)點后鏈表結(jié)點的個數(shù)為:%dn”,j-1);

printf(“***************************************n”);}

14. 編寫對單鏈表進行刪除操作的函數(shù): void ListDelete_L(LinkList L,int r){ LinkList p,s;int q=1,i,e;p=L;if(r<1||r>k){ printf(“刪除的位置不正確n”);printf(“***************************************n”);} else { while(q>=1&&q<=r-1){ p=p->next;++q;} s=p->next;p->next=s->next;e=s->data;k=k-1;printf(“刪除的結(jié)點的值為:%dn”,e);printf(“刪除一個結(jié)點后的鏈表為:n”);p=L;for(i=1;i<=k;i++){ p=p->next;printf(“%dn”,p->data);} printf(“刪除一個結(jié)點后鏈表結(jié)點的個數(shù)為:%dn”,k);printf(“***************************************n”);} }

15. 編寫對單鏈表進行查找操作的函數(shù): void GetElem_L(LinkList L,int r){ LinkList p;int q=1,e;p=L;if(r<1||r>k){ printf(“第%d個元素不存在n”,r);printf(“***************************************n”);} else { while(q>=1&&q<=r){ p=p->next;q++;} e=p->data;printf(“第%d個元素的值為:n%dn”,r,e);printf(“***************************************n”);} }

16. 編寫對單鏈表進行修改操作的函數(shù): void UpdateElem_L(LinkList L,int r){ LinkList p;int q=1,n,i;p=L;if(r<1||r>k)

{

printf(“第%d個元素不存在n”,r);

printf(“***************************************n”);} else {

while(q>=1&&q<=r)

{

p=p->next;

q++;

}

printf(“請輸入修改后該結(jié)點的值:n”);

scanf(“%d”,&n);

printf(“***************************************n”);

p->data=n;

printf(“修改第%d個元素的值后鏈表為:n”,r);

p=L;

for(i=1;i<=k;i++)

{

p=p->next;

printf(“%dn”,p->data);

}

printf(“***************************************n”);} }

17. 編寫主函數(shù) void main(){ int m,n=0;LinkList l;l=(LinkList)malloc(sizeof(LNode));InitList_L(l);while(n!=-1){ printf(“請選擇對鏈表進行何種操作:n輸入1表示對鏈表進行插入操作n輸入2表示對鏈表進行刪除操作n輸入3表示對鏈表進行查找操作n輸入4表示對鏈表進行修改操作n輸入-1表示操作結(jié)束n”);printf(“***************************************n”);scanf(“%d”,&n);printf(“***************************************n”);switch(n){ case 1: printf(“請輸入在第幾個結(jié)點之前插入新結(jié)點:n”);scanf(“%d”,&m);printf(“***************************************n”);ListInsert_L(l,m);break;case 2: printf(“請輸入刪除第幾個結(jié)點:n”);scanf(“%d”,&m);printf(“***************************************n”);ListDelete_L(l,m);break;case 3: printf(“請輸入查找第幾個結(jié)點的值:n”);scanf(“%d”,&m);printf(“***************************************n”);GetElem_L(l,m);break;case 4: printf(“請輸入修改第幾個結(jié)點的值:n”);scanf(“%d”,&m);printf(“***************************************n”);UpdateElem_L(l,m);break;} } printf(“操作結(jié)束!n”);}

雙向鏈表

1.定義頭文件和雙向鏈表的結(jié)構(gòu)體類型 #include #include typedef struct DuLNode { int data;struct DuLNode *prior;struct DuLNode *next;}DuLNode, *DuLinkList;

2.編寫構(gòu)造雙向鏈表的函數(shù)

void InitList_DuL(DuLinkList L){ DuLinkList p,q;int i,b=0,j=0;p=L;printf(“請輸入鏈表中元素的值,用-1表示輸入結(jié)束:n”);while(b!=-1){ scanf(“%d”,&b);q=(DuLinkList)malloc(sizeof(DuLNode));q->data=b;p->next=q;q->prior=p;p=p->next;j+=1;} k=j-1;p->next=NULL;p=L;printf(“***************************************n”);printf(“創(chuàng)建的雙向鏈表為:n”);for(i=1;inext;printf(“%dn”,p->data);} printf(“該鏈表的結(jié)點個數(shù)為:%dn”,k);printf(“***************************************n”);}

3.對雙向鏈表進行插入操作的函數(shù)

void ListInsert_DuL(DuLinkList L,int r){ DuLinkList p,s;int q=1,i,n;p=L;if(r<1||r>k){ printf(“插入的位置不正確!n”);printf(“***************************************n”);} else { while(q>=1&&q<=r-1){ p=p->next;q++;} s=(DuLinkList)malloc(sizeof(DuLNode));printf(“請輸入插入的結(jié)點的值:n”);scanf(“%d”,&n);printf(“***************************************n”);s->data=n;s->next=p->next;p->next->prior=s;s->prior=p;p->next=s;k=k+1;p=L;printf(“插入一個新結(jié)點后的鏈表為:n”);for(i=1;i<=k;i++){ p=p->next;printf(“%dn”,p->data);} printf(“插入一個新結(jié)點后鏈表結(jié)點的個數(shù)為:%dn”,k);printf(“***************************************n”);} }

7. 寫對雙向鏈表進行刪除操作的函數(shù) void ListDelete_DuL(DuLinkList L,int r){ DuLinkList p,s;int q=1,i,e;p=L;if(r<1||r>k)

{

printf(“刪除的位置不正確n”);

printf(“***************************************n”);} else {

while(q>=1&&q<=r-1)

{

p=p->next;

++q;

}

s=p->next;

p->next=s->next;

s->next->prior=p;

e=s->data;

k=k-1;

printf(“刪除的結(jié)點的值為:%dn”,e);

printf(“刪除一個結(jié)點后的鏈表為:n”);

p=L;

for(i=1;i<=k;i++)

{

p=p->next;

printf(“%dn”,p->data);

}

printf(“刪除一個結(jié)點后鏈表結(jié)點的個數(shù)為:%dn”,k);

printf(“***************************************n”);} }

8. 編寫對雙向鏈表進行查找操作的函數(shù) void GetElem_DuL(DuLinkList L,int r){ DuLinkList p;int q=1,e;p=L;if(r<1||r>k)

{

printf(“第%d個元素不存在n”,r);

printf(“***************************************n”);} else {

while(q>=1&&q<=r)

{

p=p->next;

q++;

}

e=p->data;

printf(“第%d個元素的值為:n%dn”,r,e);

printf(“***************************************n”);} }

9. 編寫對雙向鏈表進行修改操作的函數(shù) void UpdateElem_DuL(DuLinkList L,int r){ DuLinkList p;int q=1,n,i;p=L;if(r<1||r>k)

{

printf(“第%d個元素不存在n”,r);

printf(“***************************************n”);} else {

while(q>=1&&q<=r)

{

p=p->next;

q++;

}

printf(“請輸入修改后該結(jié)點的值:n”);

scanf(“%d”,&n);

printf(“***************************************n”);

p->data=n;

printf(“修改第%d個元素的值后鏈表為:n”,r);

p=L;

for(i=1;i<=k;i++)

{

p=p->next;

printf(“%dn”,p->data);

}

printf(“***************************************n”);} }

10. 編寫主函數(shù) void main(){ int m,n=0;DuLinkList l;l=(DuLinkList)malloc(sizeof(DuLNode));InitList_DuL(l);while(n!=-1){

printf(“請選擇對鏈表進行何種操作:n輸入1表示對鏈表進行插入操作n輸入2表示對鏈表進行刪除操作n輸入3表示對鏈表進行查找操作n輸入4表示對鏈表進行修改操作n輸入-1表示操作結(jié)束n”);

printf(“***************************************n”);

scanf(“%d”,&n);

printf(“***************************************n”);

switch(n)

{

case 1:

printf(“請輸入在第幾個結(jié)點之前插入新結(jié)點:n”);

scanf(“%d”,&m);

printf(“***************************************n”);

ListInsert_DuL(l,m);

break;

case 2:

printf(“請輸入刪除第幾個結(jié)點:n”);

scanf(“%d”,&m);

printf(“***************************************n”);

ListDelete_DuL(l,m);

break;

case 3:

printf(“請輸入查找第幾個結(jié)點的值:n”);

scanf(“%d”,&m);

printf(“***************************************n”);

GetElem_DuL(l,m);

break;

case 4:

printf(“請輸入修改第幾個結(jié)點的值:n”);

scanf(“%d”,&m);

printf(“***************************************n”);

UpdateElem_DuL(l,m);

break;

} } printf(“操作結(jié)束!n”);} 實驗三:棧、隊列

實驗學時:2學時

一.實驗?zāi)康模?/p>

1.掌握棧、隊列的存儲結(jié)構(gòu);

2.掌握在棧、隊列上進行的各種操作。

二.實驗內(nèi)容:

1.編寫模擬Hanoi塔函數(shù)計算的程序,掌握棧在遞歸中的作用; 2.編寫循環(huán)隊列的進隊、出隊、初始化等函數(shù)。(2選1)

三.實驗重點:

對棧、隊列的存儲結(jié)構(gòu)的理解。

四.實驗難點:

循環(huán)隊列操作函數(shù)的編寫。

五.實驗要求:

1.用C語言編寫程序源代碼;

2.源程序必須編譯調(diào)試成功,獨立完成。

六.實驗器材:

一個裝有C語言編譯環(huán)境的計算機。

七.實驗步驟:

Hanoi塔程序的編寫 1.定義頭文件: #include

2.編寫move函數(shù): void move(char x,char y){

printf(“%c-->%cn”,x,y);}

3.編寫Hanoi塔函數(shù):

void hanoi(int n,char a,char b,char c){

if(n==1)

move(a,c);

else

{

hanoi(n-1,a,c,b);

move(a,c);

hanoi(n-1,b,a,c);

} }

4.編寫主函數(shù): void main(){ int m;printf(“請輸入需要移動的盤子數(shù):n”);scanf(“%d”,&m);printf(“%d個盤子通過B從A移動到C的過程如下:n”,m);hanoi(m,'A','B','C');}

循環(huán)隊列操作函數(shù)的編寫

1.定義頭文件和結(jié)構(gòu)體類型等:

#include #include #define MAXQSIZE 10 typedef struct { int *base;//存儲空間的起始地址,即數(shù)組的首地址,即數(shù)組名

int front;//順序存儲,即地址,所以用下標表示元素,front是第一個元

//的下標

int rear;//rear是最后一個元素的下標 }SqQueue;

2.編寫初始化函數(shù): int InitQueue(SqQueue &Q){

Q.base=(int*)malloc(MAXQSIZE*sizeof(int));if(!Q.base)

return 0;

else

{

Q.front=0;

Q.rear=0;

return 1;

} } 3.編寫進隊函數(shù):

void EnQueue(SqQueue &Q,char e){

if((Q.rear+1)%MAXQSIZE==Q.front)

printf(“隊列滿”);else

{

Q.base[Q.rear]=e;//Q.base表示數(shù)組的地址也即數(shù)組名;Q.rear表示引用結(jié)//構(gòu)體類型變量Q中的一個成員rear ,也即是數(shù)組中下標為rear的元素

Q.rear=(Q.rear+1)%MAXQSIZE;

} }

4.編寫出隊函數(shù):

void DeQueue(SqQueue &Q){

char e;if(Q.front==Q.rear)

printf(“隊列空n”);else {

e=Q.base[Q.front];

Q.front=(Q.front+1)%MAXQSIZE;

} }

5.編寫顯示功能函數(shù): void Display(SqQueue Q){ int i;

if(Q.front==Q.rear)

printf(“隊列空n”);else

{

i=Q.front;

printf(“隊列中的元素如下:”);

do

{

printf(“%c”,Q.base[i]);

i=(i+1)%MAXQSIZE;

}

while(i!=Q.rear);

} } 6.編寫主函數(shù): void main(){

SqQueue Q;

char r;

int i=0;

InitQueue(Q);

while(i!=-1)

{ printf(“請選擇對隊列進行何種操作:n 輸入1表示進行入隊操作n 輸入2表示進行出隊操作n 輸入-1表示不進行任何操作n”);

printf(“********************************************n”);

scanf(“%d”,&i);

printf(“********************************************n”);

switch(i)

{

case 1:

printf(“請輸入要入隊的元素的值,輸入#表示結(jié)束:n”);

printf(“****************************************n”);

scanf(“%c”,&r);

while(r!='#')

{

EnQueue(Q,r);

scanf(“%c”,&r);

}

printf(“****************************************n”);

Display(Q);

printf(“****************************************n”);

break;

case 2:

DeQueue(Q);

Display(Q);

break;

} } } 實驗四:樹

實驗學時:2學時

一.實驗?zāi)康模?/p>

1.掌握二叉樹的存儲結(jié)構(gòu);

2.掌握在二叉樹上進行的各種操作。

二.實驗內(nèi)容與基本要求:

1.編寫二叉樹的各種操作函數(shù),包括建立、初始化、添加、刪除、查找等;

2.編寫對二叉樹進行三種遍歷的函數(shù);

3.編寫8皇后的模擬計算程序。

(3選2)

三.實驗重點:

二叉樹的各種操作及遍歷的函數(shù)。

四.實驗難點:

二叉樹的三種遍歷函數(shù)的編寫。

五.實驗器材:

一個裝有C語言編譯環(huán)境的計算機。

六.實驗步驟:

1.建立、初始化二叉樹;

struct tree

//聲明樹的結(jié)構(gòu) {

struct tree *left;

int data;

struct tree *right;};typedef struct tree treenode;typedef treenode *b_tree;

//聲明二叉樹鏈表

//插入二叉樹的節(jié)點

b_tree insert_node(b_tree root,int node){

b_tree newnode;

b_tree currentnode;

b_tree parentnode;

newnode=(b_tree)malloc(sizeof(treenode));

//建立新節(jié)點的內(nèi)存空間

newnode->data=node;

newnode->right=NULL;

newnode->left=NULL;if(root=NULL)

return newnode;

else

{

currentnode=root;

while(currentnode!=NULL)

{

parentnode=currentnode;

if(currentnode->data>node)

currentnode=currentnode->left;

else

currentnode=currentnode->right;

}

if(parentnode->data>node)

parentnode->left=newnode;

else parentnode->right=newnode;

return root;} }

// 建立二叉樹

b_tree create_btree(int *data,int len){

b_tree root=NULL;

int i;

for(i=0;i

root=insert_node(root,data[i]);//調(diào)用insert_node函數(shù),參數(shù)為空指針

//root和數(shù)組中元素data[i],//insert_node函數(shù)的返回值賦給

//create_btree函數(shù)中定義root,并作為 //create_btree函數(shù)的返回值返回

return root;//返回值為root }

2.編寫對二叉樹進行的各種操作的函數(shù),包括、添加、刪除、查找等;

3.編寫對二叉樹進行三種遍歷的函數(shù); //二叉樹先序遍歷

void preorder(b_tree point){

if(point!=NULL)

{

preorder(point->left);//遞歸

printf(“%d”,point->data);

preorder(point->right);//遞歸 } }

//二叉樹中序遍歷

void inorder(b_tree point){

if(point!=NULL)

{

inorder(point->left);//遞歸

printf(“%d”,point->data);

inorder(point->right);//遞歸

} }

//二叉樹后序遍歷

void postorder(b_tree point){

if(point!=NULL)

{

postorder(point->left);//遞歸

printf(“%d”,point->data);

postorder(point->right);//遞歸

} }

//主程序 void main(){

b_tree root=NULL;

int index;

int value;

int nodelist[20];

printf(“n please input the elements of binary tree(exit for 0):n”);

index=0;

//讀取數(shù)值存到數(shù)組中

scanf(“%d”,&value);

while(value!=0)

{

nodelist[index]=value;

index=index+1;

scanf(“%d”,&value);

}

//建立二叉樹

root=create_btree(nodelist,index);//主函數(shù)調(diào)用創(chuàng)建函數(shù),參數(shù)為數(shù)組名和

//長度,創(chuàng)建函數(shù)的返回值(返回的本身

//是root)賦給主函數(shù)中定義root,并作//為參數(shù)傳給inorder函數(shù)

//先序遍歷二叉樹

printf(“nThe preorder traversal result is :”);

preorder(root);//主函數(shù)調(diào)用inorder函數(shù)

printf(“n”);//中序遍歷二叉樹

printf(“nThe inorder traversal result is :”);

inorder(root);//主函數(shù)調(diào)用inorder函數(shù)

printf(“n”);//后序遍歷二叉樹

printf(“nThe postorder traversal result is :”);

postorder(root);//主函數(shù)調(diào)用inorder函數(shù)

printf(“n”);}

4.編寫8皇后的模擬計算程序。實驗五:圖

實驗學時:2學時

一.實驗?zāi)康模?/p>

1.掌握圖的存儲結(jié)構(gòu);

2.掌握在圖上進行的各種操作。

二.實驗內(nèi)容與基本要求:

1.編寫圖的各種操作函數(shù),包括建立、初始化、添加、刪除、查找等; 2.編寫建立最小生成樹的程序; 3.編寫計算兩點間最短路徑的程序。(3選2)

三.實驗重點:

掌握圖的存儲結(jié)構(gòu)

四.實驗難點:

編寫計算兩點間最短路徑的程序

五.實驗器材:

一個裝有C語言編譯環(huán)境的計算機。

六.實驗步驟

計算兩點間最短路徑: 1.義頭文件等 #include #define vex 3//定義結(jié)點的個數(shù)

#define max 10000//設(shè)定一個極大值

2.編寫主函數(shù) void main(){ int D[vex][vex][vex];//定義一個三維數(shù)組,用來一次一次的迭代,按

//FLOYD算法求出結(jié)點之間的最短路徑

int arcs[vex][vex]={0,4,11,6,0,2,3,max,0};//鄰接矩陣

int i,j,k;

for(i=0;i

//空間進行初始化

for(k=0;k

for(i=0;i

for(j=0;j

if(D[k-1][i][j]

D[k][i][j]=D[k-1][i][j];else

D[k][i][j]=D[k-1][i][k]+D[k-1][k][j];//求出每次迭代最小

//值,最后一次即為兩個頂點之間的最短路徑

printf(“圖的鄰接矩陣為:n”);for(i=0;i

for(j=0;j

{

printf(“%d

”,arcs[i][j]);

}

printf(“nn”);

}//打印鄰接矩陣 printf(“n”);

printf(“表示各點間最短路徑的矩陣為:n”);

for(i=0;i

{

for(j=0;j

{

printf(“%d

”,D[vex-1][i][j]);

}

printf(“nn”);

} } 實驗六:排序

實驗學時:2學時

一.實驗?zāi)康模?/p>

1.掌握二叉查找樹的性質(zhì)及其相關(guān)的應(yīng)用;

2.掌握插入排序、快速排序、選擇排序、歸并排序、基數(shù)排序的算法實現(xiàn)。

二.實驗內(nèi)容與基本要求:

1.編寫二叉查找樹的生成及應(yīng)用程序;

2.編寫插入排序、快速排序、選擇排序、歸并排序、基數(shù)排序的程序。

三.實驗重點:

掌握各種排序算法的思想

四.實驗器材:

一個裝有C語言編譯環(huán)境的計算機。

五.實驗步驟

插入排序:

#include #define N 10 void main(){ int i,j,k,t,a[N];

printf(“Please input %d numbers:n”,N);for(i=0;i

for(j=i-2;t

printf(“%d

”,a[i]);printf(“n”);}

快速排序: #include #define N 10 void quickSort(int a[10],int i, int j){ int A=a[0];while(i=A && i

while(a[i]<=A && i0)

quickSort(a,0,i-1);if(i+1<9)

quickSort(&a[i+1],i+1,9);}

void main(){

int i,j,a[N];

printf(“Please input %d numbers:n”,N);for(i=0;i

printf(“%d ”,a[i]);printf(“n”);}

冒泡排序:

#include void main(){

int a[10];int i,j,t;

printf(“input 10 numbers :n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);for(j=0;j<10;j++)for(i=0;i<10-j;i++)if(a[i]>a[i+1]){ t=a[i];a[i]=a[i+1];a[i+1]=t;}

printf(“the sorted numbers:n”);for(i=0;i<10;i++)printf(“%d ”,a[i]);printf(“n”);}

選擇排序:

#include #define N 10 void main(){

int i,j,k,t,a[N];

printf(“Please input %d numbers:n”,N);

for(i=0;i

scanf(“%d”,&a[i]);

for(i=0;i

for(j=i;j

if(a[j]

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

k=a[i];

a[i]=a[j];

a[j]=k;}

printf(“the sorted numbers:n”);

for(i=0;i

printf(“%d ”,a[i]);

printf(“n”);} 30

第二篇:數(shù)據(jù)結(jié)構(gòu)實驗課教案

授課教案

(2016—2017學第一學期)

課程名稱: 課程編碼: 總學時: 課程類別:

任課教師: 開課單位: 職稱: 授課專業(yè): 授課班級:

數(shù)據(jù)結(jié)構(gòu) B13040009A 總學分: 專業(yè)課 李素若 計算機工程學院

教授 計算機科學與技術(shù)

2015級計算機科學與技術(shù)專業(yè)1、2班 授課進度第3周,第6次課(2學時)授課題目

(教學章、節(jié)實驗一線性表的順序存儲結(jié)構(gòu) 或主題)

授課日期

016年9月14日(9 2

月13日)

.掌握線性表順序存儲結(jié)構(gòu)的特點:邏輯上相鄰的數(shù)據(jù)元素其物理位置上也相鄰。1 2.掌握線性表順序存儲結(jié)構(gòu)的插入、刪除操作特點移動操作。

教學

目標

1.線性表的順序存儲特點

教學 2.線性表的順序存儲的基本算法 重點

1.線性表的順序存儲的基本算法

教學 難點

請選擇你授課時所采用的教學方法(在括號中畫“√”):

講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發(fā)現(xiàn)法﹝﹞,探究法﹝﹞,教學

談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導(dǎo)法﹝﹞,練習

方法

法(習題或操作課)﹝√﹞,讀書指導(dǎo)法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業(yè)法﹝﹞,其他﹝﹞ 教學

實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本

手段

﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業(yè)

[ 1]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu).北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu)習題集及上機指導(dǎo).北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”):

參考

電出版社,2014.文獻

教學過程及內(nèi)容

一、實驗內(nèi)容

.輸入一組整型元素序列,建立順序表。1 2 .遍歷該順序表。3 .在該順序表中進行順序查找某一元素,查找成功返回1,否則返回0。.實現(xiàn)把該表中所有奇數(shù)排在偶數(shù)之前,即表的前面為奇數(shù),后面為偶數(shù)。4 .判斷該順序表中元素是否對稱,對稱返回1,否則返回0。5 .輸入整型元素序列利用有序表插入算法建立一個有序表。6 .利用實驗6建立兩個遞增有序表并把它們合并成一個遞增有序表。7

二、實驗指導(dǎo)

1.參考程序為:

voidCreateSqList(SqList*L){ intn,i? do{ printf(“請輸入數(shù)據(jù)元素的個數(shù):”)?

scanf(“%d”,&n)?

if(n<=0)printf(“輸入錯誤n”)? } while(n<=0)? for(i=0?ielem[i]))? L->length=n?

} 2 .參考程序為:

voidPrintList(SqListL){ inti?

for(i=0?i

intFindelems(SqListL,ElemTypee){ inti?

for(i=0?i

return0?

} 4.分析:從順序表表頭開始掃描,當數(shù)據(jù)元素為偶數(shù)時就從該數(shù)開始往后查找,一旦

— 1—

教學過程及內(nèi)容

找到奇數(shù),則將該偶數(shù)與此奇數(shù)交換。順序表中所有數(shù)據(jù)全部掃描結(jié)束后,所有奇數(shù)就排列 在表的前端。參考程序為:

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—

教學過程及內(nèi)容

L->elem[j+1]=L->elem[j]? L->elem[i]=x? L->length++?

} voidCreate_OrderList(SqList*L){ intn,i,input? do{ printf(“請輸入數(shù)據(jù)元素的個數(shù):”)? scanf(“%d”,&n)?

if(n<=0)printf(“輸入錯誤n”)?

while(n<=0)? } for(i=0?i

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學時)授課題目

(教學章、節(jié)實驗二單向鏈表 或主題)

授課日期

016年9月21日(9 2

月20日)

.掌握線性鏈表的操作特點,即指針是邏輯關(guān)系的映像。1 .掌握動態(tài)產(chǎn)生單鏈表的方法。2 3 .熟練掌握單鏈表的插入、刪除操作特點,即指針賦值的先后次序。

教學

目標

1.掌握動態(tài)產(chǎn)生單鏈表的方法。

教學 2.熟練掌握單鏈表的插入、刪除操作特點,即指針賦值的先后次序。重點

1.熟練掌握單鏈表的插入、刪除操作特點,即指針賦值的先后次序。

教學 難點

請選擇你授課時所采用的教學方法(在括號中畫“√”):

講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發(fā)現(xiàn)法﹝﹞,探究法﹝﹞,教學

談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導(dǎo)法﹝﹞,練習

方法

法(習題或操作課)﹝√﹞,讀書指導(dǎo)法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業(yè)法﹝﹞,其他﹝﹞ 教學

實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本

手段

﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業(yè)

[ 1]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu).北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu)習題集及上機指導(dǎo).北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”):

參考

電出版社,2014.文獻

教學過程及內(nèi)容

一、實驗內(nèi)容

.隨機產(chǎn)生或鍵盤輸入一組元素,建立一個帶頭結(jié)點的單向鏈表(無序)。1 .遍歷單向鏈表。2 3 .把單向鏈表中元素逆置(不允許申請新的結(jié)點空間)。.在單向鏈表中刪除所有的偶數(shù)元素結(jié)點。4 5 .編寫在非遞減有序鏈表中插入一個元素使鏈表元素仍有序的函數(shù),并利用該函數(shù)建 立一個非遞減有序單向鏈表。

.利用實驗5建立兩個遞增有序單向鏈表,然后合并成一個遞增鏈表。6 7 .利用實驗1建立的鏈表,實現(xiàn)將其分解成兩個鏈表,其中一個全部為奇數(shù),另一個 全部為偶數(shù)(盡量利用已知的存儲空間)。

二、實驗指導(dǎo)

1.參考程序為:

LinkListCreateListH(void)//頭插法產(chǎn)生帶頭結(jié)點單鏈表 { intch?

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

head->next=NULL?

while(scanf(“%d”,&ch)==1)//輸入數(shù)據(jù)類型錯誤時結(jié)束單鏈表的生成 { s=(LinkList)malloc(sizeof(LNode))? s->data=ch?

s->next=head->next? head->next=s? } returnhead?

} LinkListCreateListRand(void)//利用隨機函數(shù)產(chǎn)生帶頭結(jié)點單鏈表(頭插法){ 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?//隨機產(chǎn)生0~49之間的數(shù)

— 1—

教學過程及內(nèi)容

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—

教學過程及內(nèi)容

p=q->next? } else { q=p?

p=p->next? } } } 5 .參考程序為:

voidInsertIncr(LinkListhead,ElemTypex)//將結(jié)點插入遞增的單鏈表 { 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)//通過調(diào)用插入有序鏈表函數(shù)生成遞增單鏈表 { intch?

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

head->next=NULL?

while(scanf(“%d”,&ch)==1)//輸入數(shù)據(jù)類型錯誤時結(jié)束單鏈表的生成 InsertIncr(head,ch)? returnhead? } 6 .參考程序為:

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

LinkListhead=(LinkList)malloc(sizeof(LNode))? head->next=NULL?

— 3—

教學過程及內(nèi)容

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—

教學過程及內(nèi)容

} printf(“n”)?

} voidDecoLinkList(LNodehead,LinkListhead1,LinkListhead2)//將單鏈表head拆分奇數(shù)鏈head1和偶數(shù)鏈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學時)授課題目

(教學章、節(jié)實驗三棧的存儲及基本運算 或主題)

授課日期

016年9月28日(9 2

月27日)

.掌握棧這種數(shù)據(jù)結(jié)構(gòu)特性及其主要存儲結(jié)構(gòu),并能在現(xiàn)實生活中靈活運用。1 2.了解和掌握遞歸程序設(shè)計的基本原理和方法。

教學

目標

.掌握棧的兩種存儲結(jié)構(gòu) 1.棧的基本運算 教學 2.了解棧在遞歸函數(shù)中的作用 重點 3.掌握棧的兩種存儲結(jié)構(gòu) 1 教學 2.棧的基本運算 難點

請選擇你授課時所采用的教學方法(在括號中畫“√”):

講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發(fā)現(xiàn)法﹝﹞,探究法﹝﹞,教學

談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導(dǎo)法﹝﹞,練習

方法

法(習題或操作課)﹝√﹞,讀書指導(dǎo)法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業(yè)法﹝﹞,其他﹝﹞ 教學

實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本

手段

﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業(yè)

[ 1]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu).北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu)習題集及上機指導(dǎo).北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”):

參考

電出版社,2014.文獻

教學過程及內(nèi)容

一、實驗內(nèi)容

.采用順序存儲實現(xiàn)棧的初始化、入棧、出棧操作。1 2 .采用鏈式存儲實現(xiàn)棧的初始化、入棧、出棧操作。3 .寫一個程序,將輸入的十進制數(shù)據(jù)M轉(zhuǎn)換為八進制數(shù)據(jù)M8,將其調(diào)試通過。在此 基礎(chǔ)上修改程序,實現(xiàn)十進制數(shù)據(jù)M向N進制(2或8或16)的轉(zhuǎn)換。(1)采用順序存儲結(jié)構(gòu)實現(xiàn)棧。(2)采用鏈表結(jié)構(gòu)實現(xiàn)棧。

二、實驗指導(dǎo)

.參考程序為: 1 # include # include # defineStack_Size100 # defineOK 1 # defineERROR 0 typedefintElemType? typedefstructStack { ElemTypeelem[Stack_Size]? inttop?

//用來存放棧中元素的一維數(shù)組

//用來存放棧頂元素的下標

} 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—

教學過程及內(nèi)容

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)//打印棧中數(shù)據(jù) { inti?

for(i=0?i<=s.top?i++)printf(“%d”,s.elem[i])? printf(“n”)?

} 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—

教學過程及內(nèi)容

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<=6)? } 2 .參考程序為: include # include # defineStack_Size100 # # defineOK 1 # defineERROR 0 typedefintElemType? typedefstructstacknode { ElemTypedata?

structstacknode*next? } StackNode? typedefstruct { StackNode*top?/*棧頂指針*/ LinkStack? }

— 3—

教學過程及內(nèi)容

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—

教學過程及內(nèi)容

{ 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<=6)? } 3 .參考程序為: 1)(— 5—

教學過程及內(nèi)容

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

printf(“輸入一個十進制數(shù)字:n”)?

scanf(“%d”,&N)?//輸入一個十進制數(shù)字

printf(“輸入要轉(zhuǎn)換的n進制數(shù)字(2、8、16):n”)? scanf(“%d”,&n1)?//輸入要轉(zhuǎn)換的進制

while(N){ Push(S,N%n1)? N=N/n1? } printf(“該數(shù)轉(zhuǎn)化為%d進制數(shù)為: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(“輸入一個十進制數(shù)字:n”)?

scanf(“%d”,&N)?//輸入一個十進制數(shù)字

— 6—

教學過程及內(nèi)容

printf(“輸入要轉(zhuǎn)換的n進制數(shù)字(2、8、16):n”)? scanf(“%d”,&n1)?//輸入要轉(zhuǎn)換的進制 while(N){ Push(S,N%n1)? N=N/n1? } printf(“該數(shù)轉(zhuǎn)化為%d進制數(shù)為: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學時)授課題目

(教學章、節(jié)實驗四隊列 或主題)

授課日期

016年10月19日(10 2

月18日)

.掌握隊列這種數(shù)據(jù)結(jié)構(gòu)的邏輯特性及其主要存儲結(jié)構(gòu)。1 2.在簡單情況下會使用順序結(jié)構(gòu)的實現(xiàn)隊列,熟練掌握循環(huán)隊列的使用。.在復(fù)雜情況下會使用鏈表結(jié)構(gòu)的隊列,并能在現(xiàn)實生活中靈活運用。3 教學

目標

1.熟練掌握循環(huán)隊列的使用。

教學 2.在復(fù)雜情況下會使用鏈表結(jié)構(gòu)的隊列。重點

1.鏈隊列的使用。

教學 難點

請選擇你授課時所采用的教學方法(在括號中畫“√”):

講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發(fā)現(xiàn)法﹝﹞,探究法﹝﹞,教學

談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導(dǎo)法﹝﹞,練習

方法

法(習題或操作課)﹝√﹞,讀書指導(dǎo)法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業(yè)法﹝﹞,其他﹝﹞ 教學

實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本

手段

﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業(yè)

[ 1]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu).北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu)習題集及上機指導(dǎo).北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”):

參考

電出版社,2014.文獻

教學過程及內(nèi)容

一、實驗內(nèi)容

.采用順序存儲實現(xiàn)循環(huán)隊列的初始化、入隊、出隊操作。1 2 .采用鏈式存儲實現(xiàn)隊列的初始化、入隊、出隊操作。3 .編寫一個程序,使用兩個鏈隊q1和q2,用來分別存儲由計算機隨機產(chǎn)生的20個 100以內(nèi)的奇數(shù)和偶數(shù),然后每行輸出q1和q2的一個值,即奇數(shù)和偶數(shù)配對輸出,直到任 一隊列為空為止。

二、實驗說明

.循環(huán)隊列類型采用如下結(jié)構(gòu): 1 defineMAXSIZE100//最大隊列長度 # typedefintElemType? typedefstruct{ ElemTypedata[MAXSIZE]? intfront,rear?//隊頭、隊尾指針

SqQueue? } .鏈隊類型采用如下結(jié)構(gòu): 2 typedefstructQNode { ElemTypedata? structQNode*next?

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

LinkQueue? }

三、實驗指導(dǎo)

1.參考程序為:

intInitQueue(SqQueue**Q)//初始化循環(huán)隊列 { * Q=(SqQueue*)malloc(sizeof(SqQueue))? if(!(*Q))

return0?

*Q)->front=(*Q)->rear=0?(return1?

} intQueueEmpty(SqQueueQ)//判斷隊空 { returnQ.front==Q.rear?

}

— 1—

教學過程及內(nèi)容

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—

教學過程及內(nèi)容

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只有一個結(jié)點 free(p)? return1?

} 3 .參考程序為: intmain(){ LinkQueueq1,q2? inti=0,j=0,num? InitQueue(&q1)? InitQueue(&q2)?

srand((unsigned)time(NULL))? while(i<20||j<20){ num=rand()%100? if(num%2==0&&i<20){ EnQueue(&q1,num)? i++? } if(num%2!=0&&j<20){ EnQueue(&q2,num)? j++? } } while(!QueueEmpty(q1)&&!QueueEmpty(q2))

— 3—

教學過程及內(nèi)容

{ 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日)

(教學章、節(jié)實驗五二叉樹(Ⅰ)或主題).掌握二叉樹的存儲實現(xiàn)。1 .掌握二叉樹的遍歷思想。2 教學

目標

.掌握二叉樹的存儲實現(xiàn)。1 .掌握二叉樹的遍歷思想。教學 2 重點

1.掌握二叉樹的遍歷思想。

教學 難點

請選擇你授課時所采用的教學方法(在括號中畫“√”):

講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發(fā)現(xiàn)法﹝﹞,探究法﹝﹞,教學

談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導(dǎo)法﹝﹞,練習

方法

法(習題或操作課)﹝√﹞,讀書指導(dǎo)法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業(yè)法﹝﹞,其他﹝﹞ 教學

實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本

手段

﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業(yè)

[ 1]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu).北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數(shù)據(jù)結(jié)構(gòu)習題集及上機指導(dǎo).北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”):

參考

電出版社,2014.文獻

教學過程及內(nèi)容

一、實驗內(nèi)容

1.數(shù)據(jù)域為字符的一棵二叉樹用廣義表形式輸入,創(chuàng)建一個采用二叉鏈表存儲的二叉 樹,并按廣義表的形式輸出這棵二叉樹。

.在實驗1的基礎(chǔ)上完成這棵二叉樹的中序遍歷的遞歸算法。2 .在實驗1的基礎(chǔ)上完成這棵二叉樹的中序遍歷的非遞歸算法。3

二、實驗指導(dǎo)

.參考代碼為: 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!='

主站蜘蛛池模板: 精品国产一区二区三区久久久狼| 精品成人免费一区二区| 亚洲综合无码一区二区加勒此| 国产亚洲精久久久久久无码苍井空| 日韩视频 中文字幕 视频一区| 精品日产卡一卡二卡麻豆| 精品国产av最大网站| 久久久久无码精品国产app| 精品国产情侣高潮露脸在线| 国产精品久免费的黄网站| 国产无遮挡又黄又爽在线观看| 免费无码又爽又黄又刺激网站| 国产制服丝袜亚洲高清| 欧美一区二区三区久久综合| 国产美女久久精品香蕉69| 亚洲性色成人av天堂| 国产日韩精品欧美一区| 免费人成激情视频在线观看| 国产一区二区三区成人欧美日韩在线观看| 综合图区亚洲另类图片| 99视频30精品视频在线观看| 国产成人精品无码免费看| 男女下面进入的视频| 国产精品熟女视频一区二区| 无码少妇一区二区三区浪潮av| 亚洲国产欧美在线人成aaaa| 亚洲天天做日日做天天欢毛片| 欧美乱妇高清无乱码| 国产微拍无码精品一区| 久久精品无码精品免费专区| 亚洲欧美日韩国产制服另类| 四虎影院在线观看| 精品久久久久久人妻无码中文字幕| 亚洲国产精品隔壁老王| 亚洲国产天堂久久综合| 亚洲女人自熨在线视频| 国产精品热久久无码av| 蜜臀av色欲a片无人一区| 欧美拍拍视频免费大全| 亚洲精品无码成人片久久不卡| 国产精品久久久久久久久久久久午衣片|