数据结构演示系统报告(附源代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中南大学
完成日期2010/07/09
1需求分析
线性表:
(1)顺序表的建立;输入为一个int型的数据,输入输出的最大元素都是100 为空间建立一个有序的顺序表,然后以负数结束输入
(2)顺序表的插入输入两个整型数据,用来表示插入的位置和元素,输出为建立时候有序的顺序表和插入的元素,是有序的整型数据
顺序表的删除输入一个整型数据,但是不能超过其数据的长度。输出为删除后的整型变量
(3)顺序表合并先分配储存空间,然后分别建立两个整型变量,分别以负数结束输入,输出为一串整型变量
链表
(1)链表插入首先输入一个整型变量,改变量用来限定链的长度,在输入整型变量,输出为该输入的整型变量,在插入两个整型变量,第一个变量不能超过你所限定链的长度,,第二是你所要插入的数据,输入是改链插入之后的整型数据
(2)链表的删除同理,首先输入一个整型变量,改变量用来限定链的长度,在输入整型变量,输入数据,在输入一个整型数据,表示你所以删除位置,输出的是改删除后的整型变量
(3)链表的查找首先输入一个整型变量,改变量用来限定链的长度,在输入整型变量,输入数据,在输入一个整型数据,表示你要查找的元素位置,输出是一个整型数据,表示你所要查找的元素
(4)链表的合并首先输入一个整型变量,改变量用来限定链的长度,在输入整型变量,输入数据,在输入整型变量,改变量用来限定链的长度,在输入整型变量,输入数据,输出的表示两个链表是数据元素
串的模式匹配
输入是字符型数据,输出是其模式匹配成功的位置,是整型数据
2概要设计
上面是程序框图
3详细设计,测试结果和算法分析
算法分析
注:算法后面是数字是程序框图所对应的算法
算法1:
数组指针elem表示线性表的基地址,length表示线性表的当前长度,顺序表的初始化操作就是为顺序表分配一个预定义大小的数组空间,并将线性表的当前长度设为“0”。Listsize,表示当前储存空间的大小,一但插入元素而空间不足时,
可在进行分配,即为顺序表增加一个大小为储存LISTINCERMENT个数据元素的空间。
Status InitList_Sq(SqList *L){
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return 1;
}//InitList_Sq;//初始化线性表
算法2:
假设有n个数据,线性表的插入操作是指在线性表中的第i-1个数据元素和第i 个数据元素之间插入一个新的数据元素。数据元素ai-1和ai直接的逻辑关系也发生了变化,所以此时需要将第n至第i个元素向后移动一个位置,表长度增加1。
Status ListInsert_Sq(SqList *L,int i,ElemType e){
//在顺序线性表L中第i个位置之前插入新的元素e,
ElemType *newbase, *p, *q;
if(i<1||i>L->length+1) return ERROR;
if(L->length>=L->listsize){
newbase = (ElemType *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L->elem = newbase;
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 1;
}//ListInsert_Sq
算法3:
长度为n 的线性表变成长度为n-1 的线性表,数据元素ai-1,ai,ai+1直接的逻辑关系发生变化,为了在存储结构上反应这个变化,同样需要移动元素,删除第i 个元素时需将从第i+1至n个元素一次向前移动一个位置。
int ListDelete_Sq(SqList *L, int i)
{
int j; // i--;
//要删除的元素下标不在长度范围内
if(i<1 || i>L->length+1)
return 0;
//删除第i个元素,即删除下标为[i-1]的元素
i--;
//使得第i-1个元素后面的所有元素往前移
for(j=i;j
L->elem[j] = L->elem[j+1];
//i--;
//使得线性表的长度减
L->length--;
return 1;
}
算法4;
分出元素比较有三种情况,当*pa=*pb,只需要将两者之一插入Lc中,由于La 和Lb的元素一次递增,在对Lb 中的每个元素,不需要在La中从表头至表尾进行全程搜索,由于用新的线性表Lc,表示并集,则插入实际上是借助复制来操作完成的。
Status MergeList_Sq(SqList La, SqList Lb, SqList *Lc)
{
ElemType *pa = La.elem, *pb = Lb.elem, *pc;
ElemType *pa_last, *pb_last;
//确定Lc线性表的长度为两个线性表的长度之和
Lc->listsize = Lc->length = La.length+Lb.length;
//为Lc线性表分配内存空间
pc = Lc->elem = (ElemType*)malloc(Lc->listsize*sizeof(ElemType));
//若分配内存溢出,则退出
if(!Lc->elem)
exit(OVERFLOW);
//使得pa_last指针指向La线性表的最后一个元素
pa_last = La.elem + La.length - 1;
//使得pb_last指针指向Lb线性表的最后一个元素
pb_last = Lb.elem + Lb.length - 1;
//将两个线性表中的值都逐个赋值到新的线性表Lc中
//当两个线性表中的值都还未完成赋值时,先将两个值中较小的赋值给Lc 线性表的当前元素
while(pa<=pa_last&&pb<=pb_last)
*pc++ = (*pa <= *pb ? *pa++:*pb++);
//如果两个线性表中的任一个较长的部分继续赋值给Lc线性表
while(pa<=pa_last)
*pc++ = *pa++;
while(pb<=pb_last)
*pc++ = *pb++;