《数据结构》实验教案

上传人:仙*** 文档编号:29304945 上传时间:2021-10-07 格式:DOC 页数:30 大小:1.01MB
收藏 版权申诉 举报 下载
《数据结构》实验教案_第1页
第1页 / 共30页
《数据结构》实验教案_第2页
第2页 / 共30页
《数据结构》实验教案_第3页
第3页 / 共30页
资源描述:

《《数据结构》实验教案》由会员分享,可在线阅读,更多相关《《数据结构》实验教案(30页珍藏版)》请在装配图网上搜索。

1、教案20112012学年 第1学期 数据结构实验教案 教学院(部) 计算机学院 教 研 室 基础教研室 授 课 班 级 10应用、网络、信管专 授 课 教 师 职 称 职 务 讲 师 教 材 名 称 数据结构 朱站立编著 2011年 8 月30 日实 验 安 排 表周次日期实验课题学时实验报告次 数49.19-9.23实验一 线性表(一)2059.26-9.30实验一 线性表(二)20710.10-10.14实验一 线性表(三)21810.17-10.21实验二 栈、队列的实现及应用21910.24-10.28实验三 串及数组的实验211411.28-12.2实验四 二叉树的基本操作21151

2、2.5-12.9实验五 查找和排序(一)201612.12-12.16实验五 查找和排序(一)21检查日期 检查人 一式三份: 一份交教务处,一份存教学系部,一份由本人保存.实验一 线性表(一)一、实验目的及要求1、掌握在TC环境下调试顺序表的基本方法2、掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。二、实验学时2学时三、实验任务1、 生成一个顺序表并动态地删除任意元素和在任意位置插入元素。2、 将两个有序表合并成一个有序表。四、实验重点、难点1、 在顺序表中移动元素。2、 在顺序表中找到正确的插入位置。五、操作要点 (一)顺序表基本操作的实现问题描述 当我们要在顺

3、序表的第i个位置上插入一个元素时,必须先将顺序表中第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。基本要求 要求生成顺序表时,可以键盘上读取元素,用顺序存储结构实现存储。实现提示 要实现基本操作,可用实现的基本操作,也可设计简单的算法实现。程序实现#include #include typedef int DataType ;# define maxnum 20typedef structint datamaxnum;int length;SeqList;/*插入函数*/int inser

4、t(SeqList *L , int i , DataType x)/* 将新结点x插入到顺序表L第i个位置 */ int j ;if( i(*L).length +1) printf( n i 值不合法 ! ); return 0;if(* L).length =maxnum-1) printf( n 表满不能插入!); return 0; for(j=(*L).length;j=i;j-) (*L).dataj+1=(*L).dataj;(*L).datai = x;(*L).length+;return 1;/*删除函数*/int delete( SeqList *L ,int i) /

5、*从顺序L中删除第i个结点*/ int j ;if( i(*L).length ) printf( n 删除位置错误 ! ) ;return 0;for(j=i+1;j=(*L).length;j+)(*L).dataj-1 =(*L).dataj;(*L).length-;return 1;/*生成顺序表*/void creatlist(SeqList * L) int n , i , j ;printf(请输入顺序表 L 的数据个数:n) ;scanf(%d , &n) ;for(i=0 ; in ; i+) printf(data%d = , i) ; scanf(%d,&(*L).da

6、tai);(*L).length=n-1;printf(n) ;/*creatlist */*输出顺序表 L*/printout(SeqList * L) int i ;for (i=0 ; i=(* L).length ; i+) printf( data%d=, i) ; printf(%d, (*L).datai);/*printout */printf(n);main() SeqList *L ;char cmd ;int i , t , x;clrscr() ;creatlist(L);doprintf(ni , I - 插入n) ;printf(d , D - 删除n) ;prin

7、tf(q , Q - 退出n) ;docmd=getchar() ;while(cmd!=i)&(cmd!=I)&(cmd!=d)&(cmd!=D)&(cmd!=q)&(cmd!=Q);switch(cmd) case i: case I:printf(nPlease input the DATA: );scanf(%d,&x) ;printf(nWhere? );scanf(%d,&i) ;insert(L,i,x) ;printout(L);break ;case d:case D :printf(nWhere to Delete? );scanf(%d,&i);delete(L,i);p

8、rintout(L);break ;while(cmd!=q)&(cmd!=Q);(二)有序顺序表的合并问题描述 已知顺序表la和lb中的数据元素按非递减有序排列,将la和lb表中的数据元素,合并成为一个新的顺序表lc基本要求 lc中的数据元素仍按非递减有序排列,并且不破坏la和lb表程序实现# include # define maxnum 20typedef int DataType ;typedef struct DataType datamaxnum ; int length ;SeqList ;int MergeQL(SeqList la , SeqList lb , SeqList

9、 *lc) int i , j , k ;if (la.length+1 + lb.length+1maxnum) printf(narray overflow!) ;return 0;i=j=k=0;while(i=la.length & j=lb.length) if (la.dataidatak+=la.datai+ ;else lc-datak+=lb.dataj+;/* 处理剩余部分 */while (idatak+=la.datai+;while (jdatak+=lb.dataj+;lc-length=k-1;return 1;main() SeqList la=3,4,7,12

10、,15,4 ;SeqList lb=2,5,7,15,18,19,5 ;SeqList lc ;int i ;if (MergeQL(la,lb,&lc) printf(n) ;for(i=0;i=lc.length ; i+)printf(%4d,lc.datai); 六、注意事项1、 删除元素或插入元素表的长度要变化。2、 在合并表中当某一个表到表尾了就不用比较了,直接将另一个表的元素复制到总表去即可。实验一 线性表(二)一、实验目的及要求1、掌握用在TC环境下上机调试单链表的基本方法2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现二、实验学时2学时三、实验任务1、在

11、带头结点的单链表h中第i个数据元素之前插入一个数据元素。2、将两个有序单链表合并成一个有序单链表。四、实验重点、难点1、 在单链表中寻找到第i-1个结点并用指针p指示。2、 比较两个单链表的节点数据大小。 五、操作要点 (一)单链表基本操作的实现问题描述要在带头结点的单链表h中第i个数据元素之前插入一个数据元素x ,首先需要在单链表中寻找到第i-1个结点并用指针p指示,然后申请一个由指针s 指示的结点空间,并置x为其数据域值,最后修改第i-1个结点,并使x结点的指针指向第i个结点,要在带头结点的单链表h中删除第i个结点,首先要计数寻找到第i个结点并使指针p指向其前驱第i-1个结点,然后删除第i

12、个结点并释放被删除结点空间。基本要求用链式存储结构实现存储实现提示链式存储结构不是随机存储结构,即不能直接取到单链表中某个结点,而要从单链表的头结点开始一个一个地计数寻找。程序实现# include # include # define NULL 0typedef char DataType ;typedef struct node DataType data; /*结点的数据域*/ struct node *next; /*结点的指针域*/ListNode;void Init_List(ListNode *L)(*L)=(ListNode *)malloc(sizeof(ListNode);

13、/*产生头结点*/(*L)-next=NULL;int List_Length(ListNode *L )int n=0;ListNode *p=L-next;while(p!=NULL)n+;p=p-next;return n;ListNode* GetNode(ListNode *L,int i) int j; ListNode *p; p=L;j=0; /*从头结点开始扫描*/ while(p-next&j!=i) /*顺指针向后扫描,直到p-next为NULL或i=j为止*/ p=p-next; j+; if(i=j) return p; /*找到了第i个结点*/ else retur

14、n NULL; /*当i0时,找不到第i个结点*/ void InsertList(ListNode *L,DataType x,int i) ListNode *p,*s; p=GetNode(L,i-1); /*寻找第i-1个结点*/ if (p=NULL) /*in+1时插入位置i有错*/ printf(position error); return ; s=(ListNode *)malloc(sizeof(ListNode); s-data=x;s-next=p-next;p-next=s; void DeleteList(ListNode *L ,int i)ListNode *p

15、,*r;p=GetNode(L,i-1); /*找到第i-1个结点*/if (p=NULL|p-next=NULL) /*in时,删除位置错*/ printf(position error); return ; r=p-next; /*使r指向被删除的结点a*/p-next=r-next; /*将ai从链上删除*/free(r); /*使用头插法建立带头结点链表算法*/ListNode * CreatListF(void)char ch;ListNode *head=(ListNode *)malloc(sizeof(ListNode); /*生成头结点*/ListNode *s; /*工作指

16、针*/head-next=NULL; ch=getchar(); /*读入第1个字符*/while(ch!=n) s=(ListNode *)malloc(sizeof(ListNode); /*生成新结点*/ s-data=ch; /*将读入的数据放入新结点的数据域中*/ s-next=head-next; head-next=s; ch=getchar(); /*读入下一字符*/return head; /*使用尾插法建立带头结点链表算法*/ListNode * CreatListR1(void) char ch; ListNode *head=(ListNode *)malloc(siz

17、eof(ListNode); /*生成头结点*/ ListNode *s,*r; /*工作指针*/ r=head; /*尾指针初值也指向头结点*/ while(ch=getchar()!=n) s=(ListNode *)malloc(sizeof(ListNode); s-data=ch; r-next=s; r=s; r-next=NULL; /*终端结点的指针域置空,或空表的头结点指针域置空*/ return head; /*复制链表A中的内容到表B中*/ void copy(ListNode *a, ListNode *b) ListNode *pa=a-next; ListNode

18、*u; ListNode *rb=b; while(pa!=NULL) u=( ListNode *)malloc(sizeof(ListNode); u-data=pa-data; rb-next=u; rb=u; pa=pa-next;rb-next=NULL;/*输出带头结点的单链表*/void DisplaySL(ListNode *la) ListNode *p ; p=la-next ; while(p)printf(%4c,p-data);p=p-next; printf(n) ;/*主函数*/main( ) ListNode *la ,*lb,*lc, *p ;int n,x,

19、i;printf(n用头插法建立链表la,请输入节点内容:);la=CreatListF();DisplaySL(la); printf(n链表la的长度: %2d,List_Length(la);printf(n请输入要插入的元素: );scanf(%c,&x) ;printf(n请输入要插入的位置:);scanf(%d,&i) ;InsertList(la,x,i);DisplaySL(la);printf(n请输入要删除元素的位置:);scanf(%d,&i);DeleteList(la,i);DisplaySL(la);printf(n用尾插法建立链表lb,请输入节点内容:);fflu

20、sh(stdin);lb=CreatListR1();DisplaySL(lb); Init_List(&lc);copy(la,lc);DisplaySL(lc); (二)有序单链表的合并问题描述 已知单链表la和lb中的数据元素按非递减有序排列,将la和lb中的数据元素,合并为一个新的单链表lc,lc中的数据元素仍按非递减有序排列。基本要求 不破坏la表和lb表的结构。程序实现# include #include#define NULL 0typedef int DataType;typedef struct SLNode DataType data; struct SLNode * ne

21、xt; slnodetype;int MergeSL(slnodetype *la,slnodetype *lb,slnodetype *lc);int CreateSL(slnodetype *la,int n);void DisplaySL(slnodetype *la);main( ) slnodetype *la, *lb, *lc ,*p;int n,m;la=(slnodetype *)malloc(sizeof(slnodetype);la-next=NULL;lb=(slnodetype *)malloc(sizeof(slnodetype);lb-next=NULL;lc=(

22、slnodetype *)malloc(sizeof(slnodetype);lc-next=NULL;printf(n 输入链la节点数:);scanf(%d,&n);printf(n 输入链la 节点内容:);CreateSL(la,n);DisplaySL(la);printf(n 输入链lb节点数:);scanf(%d,&m);printf(n 输入链lb节点内容:);CreateSL(lb,m);DisplaySL(lb);if(MergeSL(la,lb,&lc) DisplaySL(lc);getch();int MergeSL(slnodetype * la , slnodet

23、ype *lb,slnodetype * *lc) slnodetype * pa, * pb, * pc; *lc=(slnodetype *)malloc(sizeof(slnodetype); pa=la-next; pb=lb-next; pc= *lc; while(pa&pb) pc-next=(slnodetype*)malloc(sizeof(slnodetype);pc=pc-next; if(pa-datadata) pc-data=pa-data; pa=pa-next; else pc-data=pb-data; pb=pb-next; while (pa) /*插入l

24、a链的剩余段 */ pc-next=(slnodetype*)malloc(sizeof(slnodetype); pc=pc-next;pc-data=pa-data; pa=pa-next; /*插入lb链的剩余段*/ while(pb) pc-next=(slnodetype*)malloc(sizeof(slnodetype); pc=pc-next;pc-data=pb-data; pb=pb-next; return 1;/*生成单链表*/int CreateSL(slnodetype *la ,int n) int i ;slnodetype *p , *q ;q=la ;for

25、 (i=1 ; idata) ;q-next=p;q=p;q-next=NULL ;return 1 ;/*输出单链表*/void DisplaySL(slnodetype *la) slnodetype *p ;p=la-next ;while(p) printf(n%3d , p-data);p=p-next ;printf(n) ;六、注意事项 1、在第i个节点前删除或插入节点需要用指针来表示第i-1个节点。2、在合并链表时需要设置多个指针变量。实验一 线性表(三)一、实验目的及要求1、掌握用在TC环境下上机调试循环链表的基本方法2、进一步掌握循环单链表的插入、删除、查找算法的实现二、实

26、验学时2学时三、实验任务1、 生成一个循环单链表。2、 在循环单链表中删除一个节点。四、实验重点、难点1、 循环单链表中只有一个节点的判断条件。2、 在循环单链表中删除一个节点。五、操作要点(一) 约瑟夫环问题问题描述设有N个人围坐一圈,现从某个人开始报数,数到M的人出列,接着从出列的下一个人开始重新报数,数到M的人以出列,如此下去,直到所有人都出列为此。试设计确定他们的出列次序序列的程序。基本要求 选择单向循环链表作为存储结构模拟整个过程,并依次输出列的各人的编号。实现提示 程序运行之后,首先要求用户指定初始报数的下限值,可以n=30,此题循环链表可不设头节点,而且必须注意空表和非空表的界限

27、。如 n=8, m=4 时,若从第一个人, 设每个人的编号依次为 1,2,3,开始报数,则得到的出列次序为4,8,5,2,1,3,7,6,如下图所示,内层数字表示人的编号 ,每个编号外层的数字代表人出列的序号。程序实现#include #include typedef struct node int num; struct node *next; linklist;linklist * creat(linklist * head, int n) /*使n个人围成一圈,并给每个人标识号数*/ linklist *s,*p; int i; s=(linklist * )malloc(sizeof(

28、linklist); head=s; s-num=1; p=s; for(i=2;inum=i; p-next=s; p=s; p-next=head; return(head); /* creat */linklist * select(linklist *head, int m) linklist *p, *q; int i, t; p=head; t=1; q=p; /* q为p的前趋指针*/ p=p-next; do t=t+1 ; /*报一次数*/ if(t%m=0) printf(%4d, p-num); q-next=p-next; free(p); p=q-next; else

29、 q=p; p=p-next; while(q!=p); head=p; printf(%4d,p-num); return (head); /* select */main( ) int n,m; linklist *head; printf(ninput the total number:n=); scanf(%d, &n); printf(ninput the number to call:m=); scanf(%d, &m); head=creat(head,n); head=select(head,m); printf(nthe last one is :%d, head-num);

30、 /* main */六、注意事项1、 如果不是要删除的节点则指针后移,否则删除该节点。七、思考题1、编程实现两个循环单链表的合并。实验二 栈、队列的实现及应用一、实验目的及要求1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用。2、掌握栈和队列的特点,即先进后出与先进先出的原则。3、掌握栈和队列的基本操作实现方法。二、实验学时2学时三、实验任务1、 实现栈的顺序存储2、 利用栈实现数制转换四、实验重点、难点1、 进栈、出栈栈顶指针都要改变。2、 数制转换结束的判断条件。五、操作要点(一)实现栈的顺序存储# define MAXSIZE 100 typedef int El

31、emType;typedef struct ElemType dataMAXSIZE; int top;SeqStack; void InitStack(SeqStack *s) s-top=0;int StackEmpty(SeqStack *s) if(s-top=0) return 1; else return 0;int StackFull(SeqStack *s) if(s-top=MAXSIZE-1) return 1; else return 0; void Push(SeqStack *s,int x) if (StackFull(s) printf(the stack is

32、overflow!n); return 0; else s-datas-top=x; s-top+; void Display(SeqStack *s) int i;i=s-top;if(s-top=0) printf(the stack is empty!n); else while(i!=0) printf(%d-,s-data-i); ElemType Pop(SeqStack *s) if(StackEmpty(s) return 0; else return s-data-s-top; ElemType StackTop(SeqStack *s) int i;if(StackEmpt

33、y(s) return 0; else i=s-top-1;return s-datai; /*返回栈顶元素的值,但不改变栈顶指针*/ main(SeqStack *p) int n,i,k,h,x1,x2,select; printf(create a empty stack!n); InitStack(p); printf(input a stack length:n); scanf(%d,&n); for(i=0;i%dn,x1); Display(p); break; case 4:x2=StackTop(p);printf(x2-%d,x2);break;while(select);

34、 (二)利用栈实现数制转换 # define MAXSIZE 100typedef int ElemType; /*将顺序栈的元素定义为整型*/typedef struct ElemType dataMAXSIZE; int top;SeqStack; void InitStack(SeqStack *s) s-top=0; return 1;int StackEmpty(SeqStack *s) if(s-top=0) return 1; else return 0;int StackFull(SeqStack *s) if(s-top=MAXSIZE) return 1; else ret

35、urn 0; void Push(SeqStack *s,int x) if (StackFull(s) printf(the stack is overflow!n); return 0; else s-datas-top=x; s-top+; ElemType Pop(SeqStack *s) ElemType y; if(StackEmpty(s) printf(the stack is empty!n); return 0; else s-top=s-top-1;y=s-datas-top; return y; ElemType StackTop(SeqStack *s) if(Sta

36、ckEmpty(s) return 0; else return s-datas-top;void Dec_to_Ocx (int N) /* n是非负的十进制整数,输出等值的八进制数*/SeqStack *S; /*定义一个顺序栈*/ElemType x; Init_SeqStack(S); /*初始化栈*/if(Nstri=ti;i+; s-stri=0; s-len=i; void strcopy(strtype *s,strtype t) int i; for (i=0;istri=t.stri; int length(strtype s) return(s.len); int equ

37、al(strtype s,strtype t) int i=0; if (s.len!=t.len) return(0); else for (i=0;is.len;i+) if (s.stri!=t.stri) return(0);return(1); strtype concat(strtype s,strtype t) strtype r; int i,j; for (i=0;is.len;i+) r.stri=s.stri; for (j=0;j=t.len;j+) r.strs.len+j=t.strj; r.len=i+j; return(r); int index(strtype

38、 s,strtype t) int i,j,k; for (i=0;s.stri;i+) for (j=i,k=0;s.strj=t.strk;j+,k+) if (!t.strk+1) return(i); return(-1); strtype substr(strtype s,int i,int k) strtype t; int j; for (j=i;js-len) printf(位置参数值错误n); else for (j=i;jlen;j+) /*将s的第i个位置之后的字串复制到r中*/ r.strj-i=s-strj; r.len=j-i; r.strr.len=0; for

39、(j=0;jstri+j=t.strj; for (j=0;jstri+t.len+j=r.strj; s-len=s-len+t.len; /*修改s串长度*/ s-strs-len=0; void delete(strtype *s,int i,int k) int j; if (is-len | i+ks-len) printf(位置参数值错误n); else for (j=i+k;jlen;j+) /*将s的第i+k个位置之后的字串前移k位*/ s-strj-k=s-strj; s-len=s-len-k; /*修改s的长度*/ s-strs-len=0; strtype replac

40、e(strtype s,strtype t,strtype v) int i; i=index(s,t); while (i=0) delete(&s,i,t.len); insert(&s,i,v); i=index(s,t); return(s); void display(strtype s) printf(字符串:%sn,s.str); main() strtype s,t,r,v; assign(&s,aababababad); assign(&t,aba); assign(&v,121); display(s); display(t); display(v); printf(s长度

41、=%dn,length(s); printf(t与v连接); display(concat(t,v); printf(s中的t替换成v后的); display(replace(s,t,v); (二)三元组稀疏矩阵的基本操作 #include #define Max 100 #define M 3 #define N 3 #define K 3 typedef int smatMax3; void display(); void creatmat(int AMN,smat B)/*A是一个稀疏矩阵,B是产生的相对应的三元组存储*/ int i,j,k=1; for (i=0;iM;i+) /*按

42、行优先顺序扫描A的元素,不为0者存入B中*/ for (j=0;jN;j+) if (Aij!=0) Bk0=i;Bk1=j;Bk2=Aij; k+; B00=M;B01=N; B02=k-1; /*存入非0元素个数*/ int findval(smat A,int x) int i,t; t=A02; /*非0元素个数*/ i=1; while (i=t & Ai2!=x) i+; /*查找等于x的元素值*/ if (i0) /*非0元素才做转置*/ q=1; for (col=0;coln;col+) /*按列转置*/ for (p=1;p=t;p+) if (Ap1=col) Bq0=Ap1;Bq1=Ap0;Bq2=Ap2; q+; void matadd(smat A,smat B,smat C) int i=1,j=1,k=1; while (i=A02 & j=B02) /*若A的当前项的行号等于B的当前项的行号,则比较其列号,将较小列的项*/ /*存入C中,如果列号也相等,则将对应的元素值相加后存入C中*/ if (Ai0=Bj0) if (Ai1Bj1) Ck0=Ai0;Ck1=Ai1;Ck2=Ai2; k+;i+; e

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!