华中科技大学计算机 学院课程实验报告 1 开始 N 从文件读取 case 4 Y N Y N 从文件读取数据(LoadList函数) N 简易菜单界面 N 用户输入op值 case 8 case 7 case 6 case 5 Y 判断空否ListEmpty Y 求表长ListLength Y 取元素操作GetElem Y 寻找操作LocatElem N 3 重新输入 0≤op≤12 case 9 Y 先驱操作PriorElem N Y case 10 Y 后继操作NextElem N switch(op) 2 Y case 1 N case 11 Y 插入操作ListInsert N N case 12 Y 删除操作ListDelete 初始化操作InitList N 遍历ListTrabverse N case 2 case 0 Y 销毁函数Destroy Y 结束 2 Y case 3 3 N 清空操作Clear 1 图2.1 主函数流程图 3
华中科技大学计算机 学院课程实验报告 2.3.3 子函数算法设计
初始化操作:用malloc函数分配LIST_INIT_SIZE个大小为Elemtype的空间,若分配成功,将表长置零,大小置为LIST_INIT_SIZE;若失败返回OVERFLOW。流程图如图2.2所示。
malloc函数分配空间 Y 分配成功 N 表长置零 返回OVERFLOW 大小设置LIST_INIT_SIZE 返回OK 图2.2初始化操作流程图
销毁操作:参数合法性判断,若合法,释放L->elem的空间,返回OK;否则返回ERROR。
清空操作:参数合法性判断,若合法,依次调用销毁操作和初始化操作,返回OK;否则返回ERROR。
判断表是否为空操作:判断表长L.length,如果为0返回TRUE,否则返回FALSE。
求表长操作:直接返回表长L.length。
取元素操作:参数合法性判断,若合法,即取的位置i不小于并且不大于表长,表不空时,用for语句到相应位置,赋值回主函数,返回OK;若参数非法,返回ERROR。流程图如图2.3所示。
Y 参数合法 Y j,p=0 j 4 华中科技大学计算机 学院课程实验报告 寻找操作:遍历线性表,如果找到了,返回下标位置,否则返回0。 寻找先驱操作:先调用寻找操作,若i为0(表示无该元素)或者i为1(表示该元素在第一个位置,无先驱),返回OVERFLOW,否则返回i-1号位置的元素值。流程图如图2.4所示。 调用LocatElem赋给i N i为0或1 L.elem[p-1]赋给*e Y 返回OVERFLOW 返回OK 图2.4寻找先驱操作流程图 寻找后继操作:先调用寻找操作,若i为0(表示无该元素)或者i为表长(表示该元素在最后一个位置,无后继),返回OVERFLOW,否则返回i+1号位置的元素值。流程图如图2.5所示。 调用LocatElem赋给i N i为0或表长 L.elem[p+1]赋给*e Y 返回OVERFLOW 返回OK 图2.5寻找后继操作流程图 插入操作:参数合法性判断,如果插入位置小于1且大于表长加一,则返回ERROR;如果表长此时以及大于或者等于L->listsize,需要使用realloc动态分配扩大空间,用for语句将插入位置元素后移,插入元素,表长加一,返回OK。流程图如图2.6所示。 Y 参数合法 表是否溢出 N N Y realloc函数重新分配 i位置起元素全部后移 返回OVERFLOW i位置赋值 返回OK L.length++ 图2.6插入操作流程图 5 华中科技大学计算机 学院课程实验报告 删除操作:参数合法性判断,如果插入位置小于1且大于表长加一,则返回ERROR;否则将i位置元素赋值给e用于传递回到主函数,用for语句将删除位置元素前移,表长减一,返回OK。流程图如图2.7所示。 Y 参数合法 N 返回OVERFLOW i位置元素赋给e L.length-- i位置起元素全部前移 返回OK 图2.7删除操作流程图 遍历操作:依次遍历顺序表,输出即可。 2.4 输入输出设计 线性表初始磁盘数据设置为: L1:123,666,111 L2:222,233 程序利用case函数,根据用户端输入的对应功能序号实现各自功能。调试各个函数的输入输出结果见2.6程序测试与结果。 2.5 源程序及注释 #include #define INFEASIBLE -1 #define OVERFLOW -2 #define LIST_INIT_SIZE 30 #define LISTINCREMENT 10 6 华中科技大学计算机 学院课程实验报告 typedef int status; typedef struct{ int item1; }Elemtype; typedef struct{ Elemtype * elem; int length; int listsize; }SqList; status InitList(SqList * L); status DestroyList(SqList * L); status ClearList(SqList *L); status ListEmpty(SqList L); int ListLength(SqList L); status GetElem(SqList L,int i,Elemtype * e); int LocatElem(SqList L,Elemtype e,status (* compare)(Elemtype x,Elemtype y)); status PriorElem(SqList L,Elemtype cur_e,Elemtype * pre_e); status NextElem(SqList L,Elemtype cur_e,Elemtype * next_e); status ListInsert(SqList * L, int i,Elemtype e); status ListDelete(SqList * L, int i,Elemtype * e); status ListTrabverse(SqList L,void (* visit)(Elemtype e)); /*------------------------------------------------------*/ status equal(Elemtype x, Elemtype y); void display(Elemtype e); /*------------------------------------------------------*/ void menu(void); /*------------------------------------------------------*/ BOOL SaveListToFile(SqList *L1,SqList *L2); BOOL LoadList(SqList *L1,SqList *L2); int main(void){ SqList L1,L2; int op=0,i; int jud1,jud2; Elemtype e1,e2,a; Elemtype *pe1, *pe2; pe1=&e1; pe2=&e2; 7