实验目的:
了解和掌握线性表的逻辑结构和顺序存储结构,掌握线性表的基本算法及相关的时间性能分析。 实验要求:
建立一个数据域定义为整数类型的线性表,在表中允许有重复的数据;根据输入的数据,先找到相应的存储单元,后删除之。 实验主要步骤:
1、分析、理解给出的示例程序。
2、调试程序,并设计输入一组数据(3,-5,6,8,2,-5,4,7,-9),测试程序的如下功能:根据输入的数据,找到相应的存储单元并删除,显示表中所有的数据。 程序代码:
#includestdio.h #includemalloc.h #includestdlib.h #define ok 1 #define error 0
#define overflow -2
#define list_init_size 100 typedef int status; typedef int elemtype; typedef struct{ elemtype *elem; int length; int listsize; }sqlist;
status initlist_sq(sqlist l)
{ l.elem=(elemtype*)malloc(list_init_size*sizeof(elemtype)); if(!l.elem)exit(overflow); l.length=0; l.listsize=list_init_size; return ok; }//initlist.sq
status getelem_sq(sqlist l) { int i=0,e,d;
printf(please input how many number you want to init\\n);
scanf(%d,d); printf(please input the number you want to init\\n); while(1) {scanf(%d,e);l.elem[i]=e;l.length++;i++;if(i=d)break; } return ok; }
status listdelet_sq(sqlist l) { int i=0,e; int *p; int *q; printf(please input the number you want to delete\\n);
scanf(%d,e); for(i=0;il.length;i++) {if(l.elem[i]==e){ p=l.elem[i]; q=l.elem+l.length-1;for(++p;p=q;++p) *(p-1)=*p;--l.length;break;} } return ok; }
main() { int i=0; sqlist l; initlist_sq(l);
getelem_sq(l); listdelet_sq(l); while(il.length) {printf(M,l.elem[i]); } }
i++;
实验结果: 心得体会:
经过这次了解和掌握了线性表的逻辑结构和顺序存储结构,明白了线性表的基本算法。 实验2
实验题目:单链表的插入和删除 实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求:
建立一个数据域定义为字符类型的单链表,在链表中不允许有重复的字符;根据输入的字符,先找到相应的结点,后删除之。 实验主要步骤:
3、分析、理解给出的示例程序。
4、调试程序,并设计输入数据(如:a,c,e,f,h,j,q,m),测试程序的如下功能:不允许重复字符的插入;根据输入的字符,找到相应的结点并删除。 5、修改程序: (1) 增加插入结点的功能。
(2) 建立链表的方法有“前插”、“后插”法。 程序代码: 实验结果: 心得体会:
【篇三:数据结构实验报告动态查找表】
数据结构实验报告 题目:动态查找表 学 院计算机学院
专 业计算机科学与技术
年级班别2010级计科4 班 学 号 3110006015 学生姓名 张法光 指导教师 张巍
成 绩 ____________________ 2012年6月 1.题目
动态查找表的设计与实现
实现下列操作:构造空表、销毁表、查找关键字的元素、插入新元素、删除指定关键字的元素、遍历表中所有元素. 抽象数据类型定义:
adt dynamicsearchtable {
数据对象 d:d是具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可
唯一标识数据元素的关键字
数据关系r:数据元素同属一个集合。 基本操作p: );
操作结果:构造一个空的动态查找表dt。 destroydstable(dt)
初始条件:动态查找表dt存在。 操作结果:销毁动态查找表dt。 searchdstable(dt,key);
初始条件:动态查找表dt存在,key为和关键字类型相同的给定值。 操作结果:若dt中存在其关键字等于key的数据元素,则函数值为该元素的值或在
表中的位置,否则为“空”。 insertdstable(dt,e);
初始条件:动态查找表dt存在,e为待插入的数据元素。
操作结果:若dt中不存在其关键字等于e.key的数据元素,则插入e到dt。 deletedstable(dt,key);
初始条件:动态查找表dt存在,key为和关键字类型相同的给定值。 操作结果:若dt中存在其关键字等于key的数据元素,则删除之。 traversedstable(dt,visit());
初始条件:动态查找表dt存在,visit是对结点操作的应用函数。 操作结果:按某种次序对dt的每个结点调用函数visit()一次且至多一次,一旦visit()
失败,则操作失败。
}adt dynamicsearchtable 2. 存储结构定义:
公用头文件ds0.h和宏定义: #includestdio.h #includestdlib.h
#define true 1 /* true函数值为1*/
#define false 0
#define n 10 /* 数据元素个数 */
typedef int status; /* status为函数类型*/ typedef int keytype; /* 关键字域为整型 */ #define eq(a,b) ((a)==(b)) /*定义等于*/ #define lt(a,b) ((a)(b)) /*定义小于*/ 二叉排序树存储结构:
二叉排序树的类型bitree定义如下:
typedef int keytype; /* 关键字域为整型 */ typedef struct {
keytype key; int others;
} elemtype; /* 数据元素类型 */ typedef elemtype telemtype; typedef struct bitnode {
telemtype data;
struct bitnode *lchild,*rchild; /* 左右孩子指针 */ }bitnode,*bitree; 3. 算法设计
/* 操作结果: 构造一个空的动态查找表dt */ status initdstable(bitree *dt) {
*dt=null;
return true; }
/* 初始条件: 动态查找表dt存在。操作结果: 销毁动态查找表dt */ void destroydstable(bitree *dt) {
if(*dt) {
if((*dt)-lchild)
destroydstable((*dt)-lchild); /* 销毁左孩子子树 */ if((*dt)-rchild)
destroydstable((*dt)-rchild); /* 销毁右孩子子树 */ free(*dt); *dt=null; } }
/* 在根指针t所指二叉排序树中递归地查找某关键字等于key的数据元素, *//* 若查找成功,则返回指向该数据元素结点的指针,否则返回空指针。*/
bitree searchbst(bitree t,keytype key) {
if((!t)||eq(key,t-data.key)) return t; /* 查找结束 */
else if lt(key,t-data.key) /* 在左子树中继续查找 */ return searchbst(t-lchild,key); else
return searchbst(t-rchild,key); /* 在右子树中继续查找 */ }
/* 在根指针t所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找 *//* 成功,则指针p指向该数据元素结点,并返回true,否则指针p指向查找路径上 *//* 访问的最后一个结点并返回false,指针f指向t的双亲,其初始调用值为null */ void
searchbst1(bitree *t,keytype key,bitree f,bitree *p,status *flag) {
if(!*t) /* 查找不成功 */ {
*p=f;
*flag=false; }
else if eq(key,(*t)-data.key) /* 查找成功 */ {
*p=*t;
*flag=true; }
else if lt(key,(*t)-data.key)
searchbst1((*t)-lchild,key,*t,p,flag); /* 递归调用-继续在左子树查找 */ else
searchbst1((*t)-rchild,key,*t,p,flag); /* 递归调用-继续在右子树查找 */ }
/* 当二叉排序树t中不存在关键字等于e.key的数据元素时,插入e并返回true, */ /* 否则返回false。*/ status insertbst(bitree *t, elemtype e)