数据结构实验报告
题目:数据结构实验报告
学院:工商管理学院
班级:信息 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->data
data)
{
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