数据结构实验指导
本部分为读者设置了九个实验,读者可根据需要选做。每个实验都分为两部分内容:实验内容和实验题目,实验内容是引导读者有效地掌握相关章节的算法,而实验题目则要求读者独立完成。本书中所有结构的数据域部分均以整型数据或字符型示例,读者可根据需要自己调整实际数据类型。
一、实验要求
(1) 上实验以前应该明确当次实验的目的,阅读实验内容,写好实验题目程序清单。 (2) 实验环境可用Turboc2.0或者Turboc3.0,要求读者事先复习好编译环境的使用
方法,在实验时把主要精力放在算法设计上,而不是放在程序调试上。
(3) 实验结束要书写实验报告。
(4) 充分利用上机时间,提高上机效率。
二、实验报告的内容
实验报告要包括以下几部分: (5) 实验目的。
(6) 实验内容。
(7) 实验题目清单及必要的注释。 (8) 程序的运行结果。
(9) 实验总结(实验结果的分析,自己的经验及不足等)。
实验一 线性结构的操作
实验1.1 顺序表的插入和删除的实现
一、实验目的:
掌握线性表的顺序存储结构的实现方法,能够实现顺序表插入和删除的程序。
二、实验内容:
建立一个顺序表(有n个数据结点),输入n个数据值,并能够完成在第i个结点之前插入数据e的操作。
1进入visual c++6.0集成环境。
2书写程序清单。注意如下问题。 插入函数的实现。
插入之后线性表如何输出,插入成功与否如何表示。
3调试程序,运行,输入数据。注意应输入一些边界数据和一些非法数据以证明算法的健壮性。
三、实验题目:
参照实验内容的方法,实现顺序表的删除。 附:实验内容的程序清单。 #include \typedef int status; typedef struct {
int *elem; int length; int listsize; }Sqlist;
status Create_sq(Sqlist *L,int n) {
int i;
L->elem=(int *)malloc(100*sizeof(int)); if(!L->elem) return 0;
for(i=0;i scanf(\输入n个数据值*/ L->length=n; L->listsize=100; return 1; } status Listinsert_sq(Sqlist *L,int i,int e) { int *q,*p, *newbase; if(i<1||i>L->length+1) return 0; if(L->length>=L->listsize) { newbase=(int *)realloc(L->elem,(L->listsize+10)*sizeof(int)); if(!newbase) exit(-2); L->elem=newbase; L->listsize+=10; } q=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; *q=e; ++L->length; return 1; } main() { Sqlist L1; int j,n,a; int i,e; printf(\ scanf(\ if(Create_sq(&L1,n)==1) { scanf(\输入i为插入位置,e为要插入元素的数值)*/ a=Listinsert_sq(&L1,i,e); if(a==1) printf(\ else printf(\ printf(\ for(i=1;i<=L1.length;i++) { printf(\ } } } 实验1.2 单链表插入和删除的实现 一、实验目的: 掌握线性表的链式存储结构的实现方法,能够实现单链表插入和删除的程序。 二、实验内容: 建立一个带头结点的单链表(有n个数据结点),输入n个数据值,并能够完成在第i个结点之前插入数据e的操作。 1进入visual c++6.0集成环境。 2书写程序清单。注意如下问题。 头结点的使用方法。 链表建立的函数的书写和参数的传入方法。 插入函数的实现。 插入之后线性表如何输出,插入成功与否如何表示。 3调试程序,运行,输入数据。注意应输入一些边界数据和一些非法数据以证明算法的健壮性。 三、实验题目: 1参照实验内容的方法,实现带头结点的单链表的删除。 2 思考不带头结点单链表的插入和删除应该如何进行,试实现。 3 思考并实现双向链表的实现方法。 附:实验内容的程序清单。 #include \ typedef struct Lnode { int data; struct Lnode *next; }Lnode,*Linklist; void Createlist_L(Linklist *L,int n) { Linklist p; int i; *L=(Linklist)malloc(sizeof(Lnode)); (*L)->next=0; for (i=n;i>0;--i) { p=(Linklist)malloc(sizeof(Lnode)); scanf(\输入n个数据值*/ p->next=(*L)->next; (*L)->next=p; } } int Listinsert_L(Linklist L,int i,int e) { Linklist p,s; int j; p=L; j=0; while(p&&j p=p->next;j++; } if(!p||j>i-1) return 0; s=(Linklist)malloc(sizeof(Lnode)); s->data=e; s->next=p->next; p->next=s; return 1; } main() { Linklist L1,p; int n,a; int i,e; printf(\ scanf(\ Createlist_L(&L1,n); printf(\ p=L1->next; while(p) { printf(\ p=p->next; } scanf(\输入i为插入位置,e为要插入元素的数值)*/ a=Listinsert_L(L1,i,e); if(a==1) { printf(\ p=L1->next; while(p) { printf(\ p=p->next; } } else printf(\