数据结构演示系统报告(附源代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;jlength;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++;

相关文档
最新文档