logo资料库

数据结构上机实验报告4个(含代码和报告).doc

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
实验一:顺序表
实验二:栈和队列的应用
实验三:树和二叉树的应用
实验四:查找的应用
数据结构实验报告 题目:数据结构实验报告 学院:工商管理学院 班级:信息 1001 姓名:彭振宇 学号:20100594 时间:2012/6/28 目录 1
实验一:顺序表....................................................2 实验二:栈和队列的应用....................................5 实验三:树和二叉树的应用..............................14 实验四:查找的应用..........................................19 实验一:顺序表 2
一.实验题目:线性表的应用 二.实验内容:有序表的合并 三.实验目的:掌握线性表的概念及原理,运用线性表的原理完成如下内容:已知线性表 La 和 Lb 中的元素分别按非递减顺序排列,要求将它们合并成一个新线性表 Lc,并使得 Lc 中的元素依然按照非递减顺序排列。 四.实验要求:更好的掌握与理解课堂上老师所讲的概念与原理,实验前认真预习所做的 实验内容及编写源程序代码,以便在实验课中完成老师所布置的实验内容。 五.概要设计原理:应该实现线性表存储机制,再将其连接在一起 六.详细程序清单及注释说明: #include #include typedef char datatype; typedef struct node { char ch; linklist head=(linklist)malloc(sizeof(listnode)); linklist p,q; q=head; while((ch=getchar())!='\n') { p=(linklist)malloc(sizeof(listnode)); p->data=ch; q->next=p; q=p; } q->next=NULL; datatype data; struct node *next; }listnode; typedef listnode *linklist; void main() { linklist creatlist(); void printlist(linklist); linklist listadd(linklist,linklist); linklist la=creatlist(); linklist lb=creatlist(); //printlist(la); //printlist(lb); linklist lc=listadd(la,lb); printlist(lc); } linklist creatlist()//创建单链表 { 3
return head; } void printlist(linklist head)//输出单链表 { linklist p; for(p=head->next;p;p=p->next) printf("%c",p->data); printf("\n"); } linklist listadd(linklist la,linklist lb)//两链表合并 { linklist pb,pa,p,q; linklist head=(linklist)malloc(sizeof(listnode)); q=head; for(pa=la->next,pb=lb->next;pa&&pb;) { p=(linklist)malloc(sizeof(listnode)); p->data=pb->data; q->next=p; q=p; pb=pb->next; pa=pa->next; } if(pa==NULL&&pb!=NULL) { while(pb!=NULL) 4 if(pa->data>pb->data) { p=(linklist)malloc(sizeof(listnode)); p->data=pb->data; q->next=p; q=p; pb=pb->next; } else if(pa->datadata) { p=(linklist)malloc(sizeof(listnode)); p->data=pa->data; q->next=p; q=p; pa=pa->next; } else {
p=(linklist)malloc(sizeof(listnode)); p->data=pb->data; q->next=p; q=p; pb=pb->next; p=(linklist)malloc(sizeof(listnode)); { } } } } if(pa!=NULL&&pb==NULL) { while(pa!=NULL) { p->data=pa->data; q->next=p; q=p; pa=pa->next; } q->next=NULL; return head; } 七.运行与测试及结果: 输入第一链表 12589 输入第二链表 23458 合并 1234589 实验二:栈和队列的应用 5
一.实验题目:栈和队列的应用 二.实验内容:迷宫问题 三.实验目的:掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。 四.实验要求:为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验前每个 学生要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可) 以便在实验课中完成老师所布置的实验内容 五.概要设计原理: 使用穷举求解的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否 则沿原路退回,换一个方向再继续探索,直至所有可能的通路都被探索为止。 六.详细程序清单及注释说明: typedef struct { int x; int y; }PosType; // 行值 // 列值 #define MAXLENGTH 25 // 设迷宫的最大行列为 25 typedef int MazeType[MAXLENGTH][MAXLENGTH]; // 迷宫数组[行][列] typedef struct // 栈的元素类型 { int ord; // 通道块在路径上的"序号" PosType seat; // 通道块在迷宫中的"坐标位置" int di; // 从此通道块走向下一通道块的"方向"(0~3 表示东~北) }SElemType; // 全局变量 MazeType m; // 迷宫数组 int curstep=1; // 当前足迹,初值为 1 #define STACK_INIT_SIZE 10 // 存储空间初始分配量 #define STACKINCREMENT 2 // 存储空间分配增量 // 栈的顺序存储表示 P46 typedef struct SqStack { SElemType *base; // 在栈构造之前和销毁之后,base 的值为 NULL SElemType *top; int stacksize; // 当前已分配的存储空间,以元素为单位 // 栈顶指针 6
}SqStack; // 顺序栈 // 构造一个空栈 S int InitStack(SqStack *S) { // 为栈底分配一个指定大小的存储空间 (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if( !(*S).base ) exit(0); (*S).top = (*S).base; (*S).stacksize = STACK_INIT_SIZE; // 栈底与栈顶相同表示一个空栈 return 1; } // 若栈 S 为空栈(栈顶与栈底相同的),则返回 1,否则返回 0。 int StackEmpty(SqStack S) { if(S.top == S.base) else return 1; return 0; } // 插入元素 e 为新的栈顶元素。 int Push(SqStack *S, SElemType e) { if((*S).top - (*S).base >= (*S).stacksize) { // 栈满,追加存储空间 (*S).base = (SElemType *)realloc((*S).base , ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); if( !(*S).base ) exit(0); (*S).top = (*S).base+(*S).stacksize; (*S).stacksize += STACKINCREMENT; } *((*S).top)++=e; // 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左 return 1; } 7
// 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 1;否则返回 0。 int Pop(SqStack *S,SElemType *e) { if((*S).top == (*S).base) return 0; *e = *--(*S).top; // 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左 return 1; } // 定义墙元素值为 0,可通过路径为 1,不能通过路径为-1,通过路径为足迹 // 当迷宫 m 的 b 点的序号为 1(可通过路径),return 1; 否则,return 0。 int Pass(PosType b) { if(m[b.x][b.y]==1) else return 1; return 0; } // 使迷宫 m 的 a 点的序号变为足迹(curstep),表示经过 void FootPrint(PosType a) { m[a.x][a.y]=curstep; } // 根据当前位置及移动方向,返回下一位置 PosType NextPos(PosType c,int di) { PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; // {行增量,列增量} // 移动方向,依次为东南西北 c.x+=direc[di].x; c.y+=direc[di].y; return c; } 8
分享到:
收藏