顺序表、链表、KMP算法-数据结构报告
- 格式:doc
- 大小:381.50 KB
- 文档页数:40
目录
需求分析-------------------------------------------------P3
概要设计-------------------------------------------------P4
详细设计-------------------------------------------------P9
调试分析-------------------------------------------------P11
测试结果-------------------------------------------------P11
课程设计总结---------------------------------------------P15
参考文献-------------------------------------------------P16
附录------------------------------------------------------P16
一:需求分析:
顺序表的插入、删除、合并等操作:涉及顺序表的创建、插入、删除、查找、合并、显示等。采用数组作为顺序表的结构,定义一个MAXSIZE作为数组的最大长度。从键盘接收用户输入的基本数据类型(这里以char为例,也可以是int等其他类型)为例演示方便,系统自带一个已经含有元素的顺序表。然后接收用户输入指令进行相应的操作。插入演示时,要求用户输入插入的字符串和要插入的位置;删除演示时要求用户输入要删除的长度和起始位置;合并操作演示时,要求用户输入一个字符串用来建立新的顺序表,然后两个顺序表合并并输出新的顺序表。
链表的查找、删除、计数、输出等功能以及有序链表的合并:涉及链表的创建、删除、查找、合并、显示等。需要动态分配内存,用指针连接各节点。先自定义一个ListNode节点用户存储数据和指针。为了演示方便,系统依然自带了一个创建好并且含有若干元素的链表,用户可以在此基础上进行操作。查找操作时,要求用户输入查找的字符,然后输出查找结果;插入操作时,要求用户输入要插入的字符以及要插入的位置;删除演示时要求用户输入要删除的长度和起始位置;合并操作演示时,要求用户输入一个字符串用来建立新的链表,然后两个顺序表合并并输出新的顺序表。
串的模式匹配:为了演示方便,系统依然自带了一个创建好并且含有若干元素的主串,然后接受用户输入的模式串。求出该模式串的next[]和nextval[],再由此验证模式串在主串中的匹配情况。 二:概要设计:
本程序中用到的所有抽象数据类型的定义如下。
1、顺序表
ADT SqList
{
数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n>=0}
数据关系:R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
InitList_Sq(&L)
操作结果:构造一个空的顺序表。
Create_Sq(&L)
初始条件:空顺序表L已经构造。
操作结果:在L中存放数据元素,创建顺序表L。
ListInsert_Sq&L,I,e)
初始条件:顺序表L存在,并且1<=i<=ListLength(L)+1。
操作结果:在L中的第i个位置之前插入新的数据元素e,L的表长加1。
Show_Sq(L)
初始条件:存在非空顺序表L。
操作结果:输出显示顺序表L。
MergeList_Sq(La, Lb, &Lc)
初始条件:存在顺序表La,Lb,Lc。
操作结果:把LaLb合并为Lc。 DeSameElem_Sq(&L)
初始条件:存在非空顺序表L。
操作结果:剔除L中的相同元素。
Sort_Sq(&L)
初始条件:存在非空顺序表L。
操作结果://对顺序表L按非递减顺序排序。
ListDelete_Sq(&L, i)
初始条件:存在顺序表L非空,1<=i<=ListLength(L)。
操作结果:在顺序表L中删除第i个元素,并用显示其值e
}ADT SqList
2、链表
ADT LinkList
{
数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n>=0}
数据关系:R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
InitList_L(& L)
操作结果:构造一个空的链表
CreateList_f(void)
初始条件:存在空的链表L。 操作结果:头插入法实现链表的创建,并且返回头结点给L。
CreateList_r(void)
初始条件:存在空的链表L。
操作结果:尾插入法实现链表的创建,并且返回头结点给L。
LocateElem_L(L, &e)
初始条件:存在空的链表L。
操作结果:查询L第一个与e相等的数据元素,若存在,则返回它的位序,否则返回 0。
NumberElem_L(L)
初始条件:存在链表L。
操作结果:计算并返回L数据元素的个数。
Show_L(L)
初始条件:存在非空链表L。
操作结果:输出显示链表L。
ListDelete_L(&L, i)
初始条件:存在链表L非空,1<=i<=ListLength(L)。
操作结果:在顺序链表L中删除第i个元素,返回其值。
DeSameElem_L(&L)
初始条件:存在非空顺序表L。
操作结果:剔除L中的相同元素。
MergeList_L(La, Lb, &Lc)
初始条件:存在链表La,Lb,Lc。
操作结果:把La,Lb合并为Lc。 SortList_L(&L)
初始条件:存在非空链表L。
操作结果:将L按非递减顺序排序。
ListInsert(&L,i,e)
初始条件:链表L存在非空,并且1<=i<=ListLength(L)+1。
操作结果:在L中的第i个位置之前插入新的数据元素e。
}ADT LinkList
3、串
ADT HString
{
数据对象:D={ai|ai∈CharacterSet,i=1,2,…,n,n>=0}
数据关系:R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
InitStr(&S)
操作结果:构造一个空串
CreateStr(&S,ch)
初始条件:ch是字符串常量。串S已经构造。
操作结果:生成一个其值等于ch 的串S。
ShowStr(S)
初始条件:存在非空串S。 操作结果:输出显示串S。
Index_KMP(S, T, pos, nextval[])
初始条件:串S和T存在,T是非空串,1<=pos<=SteLength(L),nextval是next修正值。
操作结果:若主串S中存在和串T相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;若不则函数值为0。
get_next(S, next[])
初始条件:串S存在且非空。
操作结果:求串S的next值。
get_nextval(S, nextval[])
初始条件:串T存在且非非空。
操作结果:求串S的nextval值。
}ADT HString
三:详细设计
#define MAXSIZE 100
typedef struct node
{
char data;//数据域
struct node *next; //指针域
}ListNode;//ListNode数据结构的定义
void PrintMenu();//打印菜单
void Demo1();//演示一
void Demo1Menu();//演示一的目录
int myinsert(char* s,char* t,int pos);//插入
int mydelete(char* s,int len,int pos);//删除
int mycombine(char* t1,char*t2,char* s);//合并
int mycut(char* s,char* temp,int len,int pos);//顺序表切割
void Demo2();//演示二
void Demo2Menu(); //演示二的菜单
ListNode* CreateList();//只创建一个空链表,返回表头
void Insert(ListNode* head,char data,int pos);//插入一个元素 void Append(ListNode* head,char data); //尾部追加一个元素
int Search(ListNode* head,char data);//某个元素是否在链表中,返回所在位置index
void DeleteByValue(ListNode* head,char data);//依据元素值删除元素
void DeleteByPos(ListNode* head,int pos);//依据元素索引删除元素
int ListLen(ListNode* head);//求链表长度
void DisplayList(ListNode* head);//打印链表
void ListCombine(ListNode *heada,ListNode *headb);
//合并链表,返回合并后的链表的表头
void Demo3();//演示三
int index_KMP(char *s,char *t,int pos,int *next); //模式匹配算法
void get_next(char *t,int * next); //获取next[j]数组的函数声明
void get_nextval(char *t,int *nextal) ;//获取nextval[j]数组的函数声明
int main()
{
……
……
return 0;
}