1、依次对L的每个数据元素进行输出;. “销毁算法”初始条件:销毁顺序线性表 L;. “置空表算法”初始条件:将L重置为空表;. “求表长算法”初始条件:返回L中数据元素个数;. “按序号查找算法”初始条件:顺序线性表 L 已存在,元素位置为 i,且 1iListLength(L) 操作结果:返回 L 中第 i 个数据元素的值. “按值查找算法”初始条件:顺序线性表 L 已存在,元素值为 e;返回 L 中数据元素值为 e 的元素位置;. “判表空算法”初始条件:顺序线性表 L 已存在;若 L 为空表,则返回 TRUE,否则返回 FALSE;分析:修改输入数据,预期输出并验证输出的结果,加深对有关算
2、法的理解。(二) 基本实验内容(单链表): 建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出、求前驱、求后继、两个有序链表的合并操作。其他基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。利用线性表的链式存储结构,设计一组输入数据(假定为一组整数),能够对单链表进行如下操作:. 初始化一个带表头结点的空链表;. 创建一个单链表是从无到有地建立起一个链表,即一个一个地输入各结点数据,并建立起前后相互链接的关系。又分为逆位序(插在表头)输入 n 个元素的值和正位序(插在表尾)输入 n 个元素的值;. 插入结点可以根据给定位置进行插入(
3、位置插入),也可以根据结点的值插入到已知的链表中(值插入),且保持结点的数据按原来的递增次序排列,形成有序链表。. 删除结点可以根据给定位置进行删除(位置删除),也可以把链表中查找结点的值为搜索对象的结点全部删除(值删除);. 输出单链表的内容是将链表中各结点的数据依次显示,直到链表尾结点;其它的操作算法描述略。2. 实现要求:对链表的各项操作一定要编写成为 C(C+) 语言函数,组合成模块化的形式,还要针对每个算法的 实现从时间复杂度和空间复杂度上进行评价。构造一个空的线性表 L,产生头结点,并使 L 指向此头结点;. “建立链表算法”初始条件:空链存在;选择逆位序或正位序的方法,建立一个单
4、链表,并且返回完成的结果;. “链表(位置)插入算法”初始条件:已知单链表 L 存在;在带头结点的单链线性表 L 中第 i 个位置之前插入元素 e;. “链表(位置)删除算法”初始条件:在带头结点的单链线性表 L 中,删除第 i 个元素,并由 e 返回其值;. “输出算法”初始条件:链表 L 已存在;依次输出链表的各个结点的值;(三) 扩展实验内容(顺序表) 查前驱元素、查后继元素、顺序表合并等. 根据给定元素的值,求出前驱元素;. 根据给定元素的值,求出后继元素;. 对已建好的两个顺序表进行合并操作,若原线性表中元素非递减有序排列,要求合并后的结果还是有序(有序合并);对于原顺序表中元素无序
5、排列的合并只是完成 A=AB (无序合并),要求同样的数据元素只出现一次。. 修改主程序,实现对各不同的算法调用。. “查前驱元素算法”初始条件:若数据元素存在且不是第一个,则返回前驱,否则操作失败;. “查后继元素算法”初始条件:若数据元素存在且不是最后一个,则返回后继,否则操作失败;. “无序合并算法”的初始条件:已知线性表 La 和 Lb;将所有在线性表 Lb 中但不在 La 中的数据元素插入到 La 中;. “有序合并算法”的初始条件:已知线性表 La 和 Lb 中的数据元素按值非递减排列;归并 La 和 Lb 得到新的线性表 Lc,Lc 的数据元素也按值非递减排列;(四) 扩展实验内
6、容(链表). 求前驱结点是根据给定结点的值,在单链表中搜索其当前结点的后继结点值为给定的值,将当前结点返回;. 求后继结点是根据给定结点的值,在单链表中搜索其当前结点的值为给定的值,将后继结点返回;. 两个有序链表的合并是分别将两个单链表的结点依次插入到第 3 个单链表中,继续保持结点有序;. “求前驱算法”初始条件:线性表 L 已存在;若 cur_e 是 L 的数据元素,且不是第一个,则用 pre_e 返回它的前驱;. “求后继算法”初始条件:若 cur_e 是 L 的数据元素,且不是最后一个,则用 next_e 返回它的后继;. “两个有序链表的合并算法”初始条件: 线性表单链线性表 La
7、 和 Lb 的元素按值非递减排列;归并 La 和 Lb 得到新的单链表。三、 实验环境和实验步骤实验环境:利用CodeBlocks10.05集成开发环境进行本实验的操作。实验步骤顺序表的定义与操作:1.启动CodeBlocks10.5;2.按“Create a new project”, 通过”file”, 按“C/C+ source”,选择”c”,然后GO.储存文件“D:c语言顺序表.c “,3.进行编代码。4、编好之后,搞ctrl+shift+F9进行编译。然后按ctrl+F10.5.如果编译出问题,然后进行调试。实验步骤链表的定义与操作:c语言单链表.c “,四、 实验分析顺序表代码如下
8、:#include #include stdlib.hmalloc.h#define LIST_INIT_SIZE 100#define ok 1#define ERROR 0#define OVERFLOW -1#define Num 3typedef int DataType;typedef int Status;typedef struct DataType *elem; int Length; int Listsize;SeqList;SeqList L;Status InitSeqList(SeqList *L) L-elem=(DataType*)malloc(LIST_INIT_
9、SIZE*sizeof(DataType); if(!L-elem) exit(OVERFLOW);Length=0;Listsize=LIST_INIT_SIZE; return ok;Status InsertSeqList(SeqList *L,int i,DataType e) DataType *q,*p; if(iLength+1) return ERROR; else if(L-Length=L-Listsize) printf(TheSeqList is full!); q=L-elem+i-1; for(p=L-elem+L-Length-1;p=q;-p) *(p+1)=*
10、p; *q=e; +L-Length;int DeleteSeqList(SeqList *L,int i) int j;Length)the i number is not exist! for(j=i-1;jelem+j)=*(L-elem+j+1);Length-;/void SearchSeqList(SeqList *L, DataType x)void SearchSeqList(SeqList *L,int x) int j=0; while (jelem+j)!=x) j+; if(jerror运行结果%d,j+1);void PrintfSeqList(SeqList *L)
11、 Printf(运行结果: int i; for (i=0;ielem+i);void LenSeqList(SeqList *L) int i=0,*j; for(j=L-elem; i+;n 元素个数为:,i);void PriorSeqLement(SeqList *L,int i) int *j;输入有误 else if(i=1)无前驱 else j=L-elem+i-2;运行结果:,*j);Status NextSeqElement(SeqList *L,int i) int*j;1|L-无后继elem+i;void ListSeqEmpty(SeqList *L)Length=0)
12、书序表为空 else printf(顺序表非空Status ChangSeqList(SeqList *L) int i,j,q; for(i=0,j=L-Length/2;i+,j-) q=*(L-elem+i);elem+i)=*(L-elem+j);elem+j)+q;Status ClearSeqList(SeqList *L)void DestorySeqList(SeqList *L) free(L);Listsize=0;void main() SeqList *LA=&L; int i,e,j,x,k,m,*p,q=0; InitSeqList(&L);输入元素: for(p=
13、LA-qLength+;PrintfSeqList(&printf(n 输入要插入元素的位置和元素:scanf(%d,%d,&i,&e);InsertSeqList(LA,i,e);n 输入要删除元素的位置:j);DeleteSeqList(&L,j);n 输入要查找的值:x);SearchSeqList(&L,x);n 输入元素求其前驱:k);PriorSeqList(&L,k);n 输入元素求其后继:m);NextSeqList(&L,m);n 求表长:LenSeqList(&/判断表是否为空n判断表是否为空:nListSeqEmpty(&逆转:ChangSeqList(&置空表:Clea
14、rSeqList(&销毁:DestorySeqList(&单链表代码:/ List.hfstreamusing namespace std;typedef int ElemType ;typedef struct student ElemType n; struct student *next;Student,*SListLink;class SListpublic: SList(); /建立一个空链表 * void CreateSList(); /建立链表* void ClearSList(); /将链表重置为空链表* ElemType SListLength(); /返回链表中的长度* b
15、ool SListEmpty(); /判断链表是否为空链表* ElemType GetElem(); /返回链表的一个元素* void SortElem(); /对链表排序 void SListInsert(); /插入一个元素* void SListDelete(); /删除一个元素* bool SlistDeleteSame(); /删除相同的元素 void ShowSList(); /显示一个链表* void FileSave(); /写入文件 void FileRead(); /从文件打开 void FileDelete(); /从文件删除 void FileCheck(); /查看文
16、件内容 SList(); /销毁链表private: SListLink head; SListLink p; SListLink q; SListLink temp; int slistlength;SList:SList() /建立一个空链表 head=p=q=temp=NULL; slistlength=0;void SList:CreateSList() /建立链表 if (head=NULL) ElemType m; coutm; if (m0) head=q=p=temp=new Student; q-n=m; +slistlength; while (m!=0&m=0) if (
17、m! p=new Student; p-next=p; q=p;next=NULL;链表创建成功 /没有输出? head=p=q=NULL;你已经创建过新链表了int SList:SListLength() /返回链表中的长度链表中的元素个数是:slistlength=m) int indx=1; p=head; while(1) if (m=indx)链表返回你查找的数:head-nn; p=p-next; +indx;p- return p-序号超出链表范围 return -1;不允许非法输入此链表是空链表bool SList:SListEmpty() /判断链表是否为空链表此链表不是空链表 return false; return true;SlistDeleteSame() /删除链表中相同元素删除链表中相同元素的节点,请输入一个要删除的数:这是一个空链表SortElem() /对链表排序 for (p=head;p!=NULL;p=p-next) temp=p; for (q=p-q!q=q- if (q-n=temp-n) temp=q; if (temp!=p) ElemType t=p-n=temp- temp-n=t;排序成功此链表是空链表,不能进行此操作ClearSList() /将链表重置为空表
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1