數(shù)據(jù)結構C語言嚴蔚敏著數(shù)據(jù)結構實驗指導_第1頁
數(shù)據(jù)結構C語言嚴蔚敏著數(shù)據(jù)結構實驗指導_第2頁
數(shù)據(jù)結構C語言嚴蔚敏著數(shù)據(jù)結構實驗指導_第3頁
數(shù)據(jù)結構C語言嚴蔚敏著數(shù)據(jù)結構實驗指導_第4頁
數(shù)據(jù)結構C語言嚴蔚敏著數(shù)據(jù)結構實驗指導_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、數(shù)據(jù)結構實驗指導及報告書(2012) / 學年 第 學期姓 名:_學 號:_班 級:_指導教師:_信息科學與工程學院2012預備實驗 C語言的函數(shù)數(shù)組指針結構體知識一、實驗目的1、復習C語言中函數(shù)、數(shù)組、指針、結構體與共用體等的概念。2、熟悉利用C語言進行程序設計的一般方法。二、實驗預習說明以下C語言中的概念1、 函數(shù):2、 數(shù)組:3、指針:4、結構體5、共用體三、實驗內容和要求1、調試程序:輸出100以內所有的素數(shù)(用函數(shù)實現(xiàn))。#include<stdio.h>int isprime(int n) /*判斷一個數(shù)是否為素數(shù)*/ int m;for(m=2;m*m<=n;m

2、+)if(n%m=0) return 0;return 1;int main() /*輸出100以內所有素數(shù)*/int i; printf("n");for(i=2;i<100;i+)if(isprime(i)=1) printf("%4d",i);return 0;運行結果:2、 調試程序:對一維數(shù)組中的元素進行逆序排列。#include<stdio.h>#define N 10int main()int aN=0,1,2,3,4,5,6,7,8,9,i,temp;printf("nthe original Array is

3、:n ");for(i=0;i<N;i+)printf("%4d",ai);for(i=0;i<N/2;i+)/*交換數(shù)組元素使之逆序*/temp=ai;ai=aN-i-1;aN-i-1=temp;printf("nthe changed Array is:n");for(i=0;i<N;i+)printf("%4d",ai);return 0;運行結果:3、 調試程序:在二維數(shù)組中,若某一位置上的元素在該行中最大,而在該列中最小,則該元素即為該二維數(shù)組的一個鞍點。要求從鍵盤上輸入一個二維數(shù)組,當鞍點存在時

4、,把鞍點找出來。#include<stdio.h>#define M 3#define N 4int main()int aMN,i,j,k;printf("n請輸入二維數(shù)組的數(shù)據(jù):n");for(i=0;i<M;i+)for(j=0;j<N;j+)scanf("%d",&aij);for(i=0;i<M;i+)/*輸出矩陣*/for(j=0;j<N;j+)printf("%4d",aij);printf("n");for(i=0;i<M;i+)k=0;for(j=

5、1;j<N;j+)/*找出第i行的最大值*/if(aij>aik)k=j;for(j=0;j<M;j+)/*判斷第i行的最大值是否為該列的最小值*/if(ajk<aik)break;if(j=M)/*在第i行找到鞍點*/printf("%d,%d,%dn",aik,i,k);return 0;運行結果:4、 調試程序:利用指針輸出二維數(shù)組的元素。#include<stdio.h>int main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int *p;for(p=a0;p<a0+12;p+)if

6、(p-a0)%4=0) printf("n");printf("%4d",*p);return 0;運行結果:5、 調試程序:設有一個教師與學生通用的表格,教師的數(shù)據(jù)有姓名、年齡、職業(yè)、教研室四項,學生有姓名、年齡、專業(yè)、班級四項,編程輸入人員的數(shù)據(jù),再以表格輸出。#include <stdio.h>#define N 10struct studentchar name8;/*姓名*/int age; /*年齡*/char job; /*職業(yè)或專業(yè),用s或t表示學生或教師*/union int class;/*班級*/char office1

7、0; /*教研室*/depa;stuN;int main()int i; int n;printf(“n請輸入人員數(shù)(<10):n”);scanf(“%d”,&n);for(i=0;i<n;i+)/*輸入n個人員的信息*/printf("n請輸入第%d人員的信息:(name age job class/office)n",i+1);scanf("%s,%d,%c",, &stui.age, &stui.job);if(stui.job=s)scanf("%d",&stui.

8、depa.class); else scanf("%s",stui.depa.office);printf(“name age job class/office”);for(i=0;i<n;i+)/*輸出*/if(stui.job=s)printf("%s %3d %3c %dn",, stui.age, stui.job, stui.depa.class); elseprintf("%s %3d %3c %sn",, stui.age, stui.job, stui.depa.office)

9、;輸入的數(shù)據(jù):2Wang 19 s 99061Li 36 t computer運行結果:四、實驗小結五、教師評語實驗一 順序表與鏈表一、實驗目的1、掌握線性表中元素的前驅、后續(xù)的概念。2、掌握順序表與鏈表的建立、插入元素、刪除表中某元素的算法。3、對線性表相應算法的時間復雜度進行分析。4、理解順序表、鏈表數(shù)據(jù)結構的特點(優(yōu)缺點)。 二、實驗預習說明以下概念1、線性表:2、順序表:3、鏈表:三、實驗內容和要求1、閱讀下面程序,在橫線處填寫函數(shù)的基本功能。并運行程序,寫出結果。#include<stdio.h>#include<malloc.h>#define ERROR

10、0#define OK 1#define INIT_SIZE 5 /*初始分配的順序表長度*/#define INCREM 5 /*溢出時,順序表長度的增量*/typedef int ElemType; /*定義表元素的類型*/typedef struct SqlistElemType *slist; /*存儲空間的基地址*/int length; /*順序表的當前長度*/int listsize; /*當前分配的存儲空間*/Sqlist;int InitList_sq(Sqlist *L); /* */int CreateList_sq(Sqlist *L,int n); /* */int

11、ListInsert_sq(Sqlist *L,int i,ElemType e);/* */int PrintList_sq(Sqlist *L); /*輸出順序表的元素*/int ListDelete_sq(Sqlist *L,int i); /*刪除第i個元素*/int ListLocate(Sqlist *L,ElemType e); /*查找值為e的元素*/int InitList_sq(Sqlist *L) L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType); if(!L->slist) return ERROR;

12、 L->length=0; L->listsize=INIT_SIZE; return OK; /*InitList*/int CreateList_sq(Sqlist *L,int n) ElemType e; int i; for(i=0;i<n;i+) printf("input data %d",i+1); scanf("%d",&e); if(!ListInsert_sq(L,i+1,e) return ERROR; return OK;/*CreateList*/*輸出順序表中的元素*/int PrintList_s

13、q(Sqlist *L) int i; for(i=1;i<=L->length;i+) printf("%5d",L->slisti-1); return OK;/*PrintList*/int ListInsert_sq(Sqlist *L,int i,ElemType e) int k;if(i<1|i>L->length+1) return ERROR; if(L->length>=L->listsize) L->slist=(ElemType*)realloc(L->slist,(INIT_SIZE

14、+INCREM)*sizeof(ElemType); if(!L->slist) return ERROR; L->listsize+=INCREM; for(k=L->length-1;k>=i-1;k-) L->slistk+1= L->slistk; L->slisti-1=e; L->length+; return OK;/*ListInsert*/*在順序表中刪除第i個元素*/int ListDelete_sq(Sqlist *L,int i)/*在順序表中查找指定值元素,返回其序號*/int ListLocate(Sqlist *L,

15、ElemType e) int main() Sqlist sl; int n,m,k; printf("please input n:"); /*輸入順序表的元素個數(shù)*/ scanf("%d",&n); if(n>0) printf("n1-Create Sqlist:n"); InitList_sq(&sl); CreateList_sq(&sl,n); printf("n2-Print Sqlist:n"); PrintList_sq(&sl); printf("

16、;nplease input insert location and data:(location,data)n"); scanf("%d,%d",&m,&k); ListInsert_sq(&sl,m,k); printf("n3-Print Sqlist:n"); PrintList_sq(&sl); printf("n"); else printf("ERROR"); return 0;l 運行結果l 算法分析2、為第1題補充刪除和查找功能函數(shù),并在主函數(shù)中補充代碼驗

17、證算法的正確性。刪除算法代碼:l 運行結果l 算法分析查找算法代碼:l 運行結果l 算法分析3、閱讀下面程序,在橫線處填寫函數(shù)的基本功能。并運行程序,寫出結果。#include<stdio.h>#include<malloc.h>#define ERROR 0#define OK 1typedef int ElemType; /*定義表元素的類型*/typedef struct LNode /*線性表的單鏈表存儲*/ ElemType data; struct LNode *next;LNode,*LinkList;LinkList CreateList(int n);

18、 /* */void PrintList(LinkList L); /*輸出帶頭結點單鏈表的所有元素*/int GetElem(LinkList L,int i,ElemType *e); /* */LinkList CreateList(int n) LNode *p,*q,*head; int i; head=(LinkList)malloc(sizeof(LNode); head->next=NULL; p=head; for(i=0;i<n;i+) q=(LinkList)malloc(sizeof(LNode); printf("input data %i:&q

19、uot;,i+1); scanf("%d",&q->data); /*輸入元素值*/ q->next=NULL; /*結點指針域置空*/ p->next=q; /*新結點連在表末尾*/ p=q; return head;/*CreateList*/void PrintList(LinkList L) LNode *p; p=L->next; /*p指向單鏈表的第1個元素*/ while(p!=NULL) printf("%5d",p->data); p=p->next; /*PrintList*/int Get

20、Elem(LinkList L,int i,ElemType *e) LNode *p;int j=1; p=L->next; while(p&&j<i) p=p->next;j+; if(!p|j>i) return ERROR; *e=p->data; return OK;/*GetElem*/int main() int n,i;ElemType e; LinkList L=NULL; /*定義指向單鏈表的指針*/ printf("please input n:"); /*輸入單鏈表的元素個數(shù)*/ scanf("

21、%d",&n); if(n>0) printf("n1-Create LinkList:n"); L=CreateList(n); printf("n2-Print LinkList:n"); PrintList(L); printf("n3-GetElem from LinkList:n"); printf("input i="); scanf("%d",&i); if(GetElem(L,i,&e) printf("No%i is %d&qu

22、ot;,i,e); else printf("not exists"); else printf("ERROR"); return 0;l 運行結果l 算法分析4、為第3題補充插入功能函數(shù)和刪除功能函數(shù)。并在主函數(shù)中補充代碼驗證算法的正確性。插入算法代碼:l 運行結果l 算法分析刪除算法代碼:l 運行結果l 算法分析以下為選做實驗:5、循環(huán)鏈表的應用(約瑟夫回環(huán)問題)n個數(shù)據(jù)元素構成一個環(huán),從環(huán)中任意位置開始計數(shù),計到m將該元素從表中取出,重復上述過程,直至表中只剩下一個元素。提示:用一個無頭結點的循環(huán)單鏈表來實現(xiàn)n個元素的存儲。l 算法代碼6、設一帶頭

23、結點的單鏈表,設計算法將表中值相同的元素僅保留一個結點。提示:指針p從鏈表的第一個元素開始,利用指針q從指針p位置開始向后搜索整個鏈表,刪除與之值相同的元素;指針p繼續(xù)指向下一個元素,開始下一輪的刪除,直至pnull為至,既完成了對整個鏈表元素的刪除相同值。l 算法代碼四、實驗小結五、教師評語實驗二 棧和隊列一、實驗目的1、掌握棧的結構特性及其入棧,出棧操作;2、掌握隊列的結構特性及其入隊、出隊的操作,掌握循環(huán)隊列的特點及其操作。二、實驗預習說明以下概念1、順序棧:2、鏈棧:3、循環(huán)隊列:4、鏈隊三、實驗內容和要求1、閱讀下面程序,將函數(shù)Push和函數(shù)Pop補充完整。要求輸入元素序列1 2 3

24、 4 5 e,運行結果如下所示。#include<stdio.h>#include<malloc.h>#define ERROR 0#define OK 1#define STACK_INT_SIZE 10 /*存儲空間初始分配量*/#define STACKINCREMENT 5 /*存儲空間分配增量*/typedef int ElemType; /*定義元素的類型*/typedef struct ElemType *base; ElemType *top; int stacksize; /*當前已分配的存儲空間*/SqStack;int InitStack(SqSt

25、ack *S); /*構造空棧*/int push(SqStack *S,ElemType e); /*入棧*/int Pop(SqStack *S,ElemType *e); /*出棧*/int CreateStack(SqStack *S); /*創(chuàng)建棧*/void PrintStack(SqStack *S); /*出棧并輸出棧中元素*/int InitStack(SqStack *S) S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType); if(!S->base) return ERROR; S->t

26、op=S->base; S->stacksize=STACK_INT_SIZE; return OK;/*InitStack*/int Push(SqStack *S,ElemType e) /*Push*/int Pop(SqStack *S,ElemType *e) /*Pop*/int CreateStack(SqStack *S) int e; if(InitStack(S) printf("Init Success!n"); else printf("Init Fail!n"); return ERROR; printf("

27、;input data:(Terminated by inputing a character)n"); while(scanf("%d",&e) Push(S,e); return OK;/*CreateStack*/void PrintStack(SqStack *S) ElemType e; while(Pop(S,&e) printf("%3d",e);/*Pop_and_Print*/int main() SqStack ss; printf("n1-createStackn"); CreateSt

28、ack(&ss); printf("n2-Pop&Printn"); PrintStack(&ss); return 0; l 算法分析:輸入元素序列1 2 3 4 5,為什么輸出序列為5 4 3 2 1?體現(xiàn)了棧的什么特性?2、在第1題的程序中,編寫一個十進制轉換為二進制的數(shù)制轉換算法函數(shù)(要求利用棧來實現(xiàn)),并驗證其正確性。l 實現(xiàn)代碼l 驗證3、閱讀并運行程序,并分析程序功能。#include<stdio.h>#include<malloc.h>#include<string.h>#define M 20#d

29、efine elemtype chartypedef struct elemtype stackM; int top;stacknode;void init(stacknode *st);void push(stacknode *st,elemtype x);void pop(stacknode *st);void init(stacknode *st) st->top=0;void push(stacknode *st,elemtype x) if(st->top=M) printf("the stack is overflow!n"); else st-&g

30、t;top=st->top+1; st->stackst->top=x; void pop(stacknode *st)if(st->top>0) st->top-; else printf(“Stack is Empty!n”);int main() char sM; int i; stacknode *sp; printf("create a empty stack!n"); sp=malloc(sizeof(stacknode); init(sp); printf("input a expression:n");

31、 gets(s); for(i=0;i<strlen(s);i+) if(si='(') push(sp,si); if(si=')') pop(sp); if(sp->top=0) printf("'('match')'!n"); else printf("'('not match')'!n"); return 0;l 輸入:2+(c-d)*6-(f-7)*a)/6l 運行結果:l 輸入:a-(c-d)*6-(s/3-x)/2l 運行結果:l 程

32、序的基本功能:以下為選做實驗:4、設計算法,將一個表達式轉換為后綴表達式,并按照后綴表達式進行計算,得出表達式得結果。l 實現(xiàn)代碼5、假設以帶頭結點的循環(huán)鏈表表示隊列,并且只設一個指針指向隊尾結點(不設隊頭指針),試編寫相應的置空隊列、入隊列、出隊列的算法。實現(xiàn)代碼:四、實驗小結五、教師評語實驗三 串的模式匹配一、實驗目的1、了解串的基本概念2、掌握串的模式匹配算法的實現(xiàn) 二、實驗預習說明以下概念1、模式匹配:2、BF算法:3、KMP算法:三、實驗內容和要求1、閱讀并運行下面程序,根據(jù)輸入寫出運行結果。#include<stdio.h>#include<string.h>

33、;#define MAXSIZE 100typedef structchar dataMAXSIZE;int length;SqString;int strCompare(SqString *s1,SqString *s2); /*串的比較*/void show_strCompare();void strSub(SqString *s,int start,int sublen,SqString *sub); /*求子串*/void show_subString();int strCompare(SqString *s1,SqString *s2)int i;for(i=0;i<s1-&g

34、t;length&&i<s2->length;i+)if(s1->datai!=s2->datai)return s1->datai-s2->datai;return s1->length-s2->length;void show_strCompare() SqString s1,s2; int k; printf("n*show Compare*n"); printf("input string s1:"); gets(s1.data); s1.length=strlen(s1.data)

35、; printf("input string s2:"); gets(s2.data); s2.length=strlen(s2.data); if(k=strCompare(&s1,&s2)=0) printf("s1=s2n"); else if(k<0) printf("s1<s2n"); else printf("s1>s2n"); printf("n*show over*n");void strSub(SqString *s,int start,int

36、 sublen,SqString *sub)int i;if(start<1|start>s->length|sublen>s->length-start+1)sub->length=0;for(i=0;i<sublen;i+)sub->datai=s->datastart+i-1;sub->length=sublen;void show_subString() SqString s,sub; int start,sublen,i; printf("n*show subString*n"); printf(&quo

37、t;input string s:"); gets(s.data); s.length=strlen(s.data); printf("input start:"); scanf("%d",&start); printf("input sublen:"); scanf("%d",&sublen); strSub(&s,start,sublen,&sub); if(sub.length=0) printf("ERROR!n"); else printf(&

38、quot;subString is :"); for(i=0;i<sublen;i+) printf("%c",sub.datai); printf("n*show over*n");int main() int n; do printf("n-String-n"); printf("1. strComparen"); printf("2. subStringn"); printf("0. EXITn"); printf("ninput choice

39、:"); scanf("%d",&n); getchar(); switch(n) case 1:show_strCompare();break; case 2:show_subString();break; default:n=0;break; while(n); return 0;l 運行程序輸入:1studentstudents2Computer Data Stuctures104運行結果:2、實現(xiàn)串的模式匹配算法。補充下面程序,實現(xiàn)串的BF和KMP算法。#include<stdio.h>#include<string.h>#

40、define MAXSIZE 100typedef structchar dataMAXSIZE;int length;SqString;int index_bf(SqString *s,SqString *t,int start);void getNext(SqString *t,int next);int index_kmp(SqString *s,SqString *t,int start,int next);void show_index();int index_bf(SqString *s,SqString *t,int start)補充代碼.void getNext(SqStrin

41、g *t,int next)int i=0,j=-1;next0=-1;while(i<t->length)if(j=-1)|(t->datai=t->dataj)i+;j+;nexti=j;elsej=nextj; int index_kmp(SqString *s,SqString *t,int start,int next)補充代碼.void show_index() SqString s,t; int k,nextMAXSIZE=0,i; printf("n*show index*n"); printf("input string

42、s:"); gets(s.data); s.length=strlen(s.data); printf("input string t:"); gets(t.data); t.length=strlen(t.data); printf("input start position:"); scanf("%d",&k); printf("BF:nthe result of BF is %dn",index_bf(&s,&t,k); getNext(&t,next); print

43、f("KMP:n"); printf("next:"); for(i=0;i<t.length;i+) printf("%3d",nexti); printf("n"); printf("the result of KMP is %dn",index_kmp(&s,&t,k,next); printf("n*show over*n");int main()show_index();return 0;輸入:abcaabbabcabaacbacbaabcab

44、aa1運行結果:四、實驗小結五、教師評語實驗四 二叉樹一、實驗目的1、掌握二叉樹的基本特性2、掌握二叉樹的先序、中序、后序的遞歸遍歷算法 3、理解二叉樹的先序、中序、后序的非遞歸遍歷算法4、通過求二叉樹的深度、葉子結點數(shù)和層序遍歷等算法,理解二叉樹的基本特性二、實驗預習說明以下概念1、二叉樹:2、遞歸遍歷:3、 非遞歸遍歷:4、層序遍歷:三、實驗內容和要求1、閱讀并運行下面程序,根據(jù)輸入寫出運行結果,并畫出二叉樹的形態(tài)。#include<stdio.h>#include<malloc.h>#define MAX 20typedef struct BTNode /*節(jié)點結

45、構聲明*/char data ; /*節(jié)點數(shù)據(jù)*/struct BTNode *lchild;struct BTNode *rchild ; /*指針*/*BiTree;void createBiTree(BiTree *t) /* 先序遍歷創(chuàng)建二叉樹*/char s;BiTree q;printf("nplease input data:(exit for #)");s=getche();if(s='#')*t=NULL; return;q=(BiTree)malloc(sizeof(struct BTNode);if(q=NULL)printf(&quo

46、t;Memory alloc failure!"); exit(0);q->data=s;*t=q;createBiTree(&q->lchild); /*遞歸建立左子樹*/createBiTree(&q->rchild); /*遞歸建立右子樹*/void PreOrder(BiTree p) /* 先序遍歷二叉樹*/ if ( p!= NULL ) printf("%c", p->data); PreOrder( p->lchild ) ; PreOrder( p->rchild) ; void InOrder

47、(BiTree p) /* 中序遍歷二叉樹*/ if( p!= NULL ) InOrder( p->lchild ) ; printf("%c", p->data); InOrder( p->rchild) ; void PostOrder(BiTree p) /* 后序遍歷二叉樹*/ if ( p!= NULL ) PostOrder( p->lchild ) ; PostOrder( p->rchild) ; printf("%c", p->data); void Preorder_n(BiTree p) /*先

48、序遍歷的非遞歸算法*/ BiTree stackMAX,q; int top=0,i; for(i=0;i<MAX;i+) stacki=NULL;/*初始化棧*/ q=p; while(q!=NULL) printf("%c",q->data); if(q->rchild!=NULL) stacktop+=q->rchild; if(q->lchild!=NULL) q=q->lchild; else if(top>0) q=stack-top; else q=NULL; void release(BiTree t) /*釋放二叉

49、樹空間*/ if(t!=NULL) release(t->lchild); release(t->rchild); free(t); int main() BiTree t=NULL; createBiTree(&t); printf("nnPreOrder the tree is:"); PreOrder(t); printf("nnInOrder the tree is:"); InOrder(t); printf("nnPostOrder the tree is:"); PostOrder(t); printf("nn先序遍歷序列(非遞歸):"); Preorder_n(t); release(t); return 0;l 運行程序輸入:ABC#DE#G#F#運行結果:2、在上題中補充求二叉樹中求結點總數(shù)算法(提示:可在某種遍歷過程中統(tǒng)計遍歷的結點數(shù)),并在主函數(shù)中補充相應的調用驗證正確性。算法代碼:3、在上題中補充求二叉樹中求葉子結點總數(shù)算法(提示:可在某種遍歷過程中統(tǒng)計遍歷的葉子結點數(shù)),并在主函數(shù)中補充相應的調用驗證正確性。算法代碼:4、在上題中補

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論