1、数据结构实验报告一一、 上机实验的问题:1、 LIST_INIT_SIZE 不被计算机程序所认可2、 getchar()在程序中的作用,是否作用于运行结果中的“Press any key to contiune”二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)基本思想和原理:利用线性表的顺序存储方式和求余运算符的运用,将 1000 次进洞逐一与线性表中的相应元素对应:先运用 for 语句将线性表中的所有元素赋值为 0,再运用 for 语句达到随着狐狸进入次数的增加和进入的洞口的改变,改变线性表中相应元素的值的目的(用 0 标记进入的洞口,用 1
2、 表示未进入的洞口,并分别赋值给每一个洞口相对应的线性表元素) 。利用 for 语句遍历整个线性表,利用 if 语句挑选出所需线性表元素,最后再利用 printf 函数输出结果。算法描述:Status InitList_Sq(SqList if(!L.elem) return(OVERFLOW); /存储分配失败L.length = 0; /空表长度为 0L.listsize = LISTSIZE; /初始存储容量return OK;/InitList_SqStatus Where(SqList /i 为所找次数,j 为所找的洞口号,先初始所找洞口号为 1for(j=1;j#include#d
3、efine OK 1#define OVERFLOW 0typedef int Status;typedef int ElemType;#define LISTSIZE 10 /线性表存储空间的初始分配量typedef structElemType *elem; /存储空间基址int length; /当前长度int listsize; /当前分配的存储空间(以 sizeof(ElemType)为单位)SqList;Status InitList_Sq(SqList *L)/构造一个空的线性表 L(*L).elem = (ElemType *)malloc(LISTSIZE*sizeof(El
4、emType);if(! (*L).elem) return(OVERFLOW); /存储分配失败(*L).length = 0; /空表长度为 0(*L).listsize = LISTSIZE; /初始存储容量return OK;/InitList_SqStatus Where(SqList *L)/构造狐狸逮兔子函数int i,j=1; /i 为所找次数,j 为所找的洞口号,先初始所找洞口号为 1for(j=1;j=LISTSIZE;j+)(*L).elemj=0; /记未进入的洞为 0,进入的洞为 1,初始所有洞口为 0(*L).elem1=1; /第一次进入洞口号为 1for(i=2
5、;i=1000;i+)j=(j+i)%LISTSIZE; /第 i 次进入的洞口号(*L).elemj=1; /标记进入的洞口为 1 /第二次隔一个洞找,第三次隔两个洞找,以此类推,经过 1000 次printf(“兔子可能的藏身洞口有:n“);for(j=1;j=LISTSIZE;j+)if(*L).elemj=0) printf(“第%d 号洞n“,j); /实现结果的输出return OK;void main()SqList L;InitList_Sq(Where(四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:1、产生的问题:将算法直接运用于 C 程序语言中,导致在调
6、试时没错,运行时出错。 采取的措施:按照 C 语言的代码规则,将算法中的不符合 C 语言编程的代码进行修改,如:Status InitList_Sq(SqList InitList_Sq(L);Rabbit(L);getch();采取的措施:在老师的帮助下将代码修改正确:void main()SqList L;InitList_Sq(getchar();六、对算法的程序的讨论、分析,改进设想,其它经验教训:1、讨论、分析:此算法运用了线性表顺序存储的存储结构,利用 for 语句和求余符号实现个线性表的循环遍历,同时,for 语句也可用 while 所代替,例如:for(j=1;j=LISTSI
7、ZE;j+) (*L).elemj=0;可替换为:while(j=LISTSIZE) (*L).elemj=0; j+;2、改进设想:减少第一次为所有线性表元素赋值的 for 循环,将址不是 1 的元素输出;将 从第二次进入洞口开始循环遍历修改为从第一次进入洞口开始循环遍历,更方便理解。代码如下:Status Where(SqList *L)/构造狐狸逮兔子函数int i,j=0; /i 为所找次数,j 为所找的洞口号,先初始未开始进入洞口前所找洞口号为 0for(i=1;i=1000;i+)j=(j+i)%LISTSIZE; /第 i 次进入的洞口号(*L).elemj=1; /标记进入的洞口为 1 /第二次隔一个洞找,第三次隔两个洞找,以此类推,经过 1000 次printf(“兔子可能的藏身洞口有:n“);for(j=1;j=LISTSIZE;j+)if(*L).elemj!=1) printf(“第%d 号洞n“,j); /实现结果的输出return OK;3、其它经验教训:算法和 C 语言程序有许差别,不可直接复制,需加强对 C 语言的学习掌握,并在真正理解算法的基础上根据 C 语言的语法进行编译。七、对实验方式、组织、设备、题目的意见和建议:无。