当前位置:文档之家› 数据结构实验指导书

数据结构实验指导书

实验一顺序表操作实验二栈和队列实验三栈实验四二叉树的操作实验五图的遍历操作实验六数据查找实验七哈希表设计实验八排序实验一顺序表操作一、实验目的1.熟悉C语言的上机环境,掌握C语言的基本结构。

2.会定义线性表的顺序存储结构。

3.熟悉对顺序表的一些基本操作和具体的函数定义。

二、实验要求1.认真阅读和掌握本实验内容所给的全部程序。

2.保存和打印出程序运行结果,并结合程序进行分析。

注意事项在做第一次“数据结构”课程实验之前,要在硬盘(e:\)上建立好自己的工作目录,专门来存储你所做的实验程序及相关信息,以后每次做实验都采用这个目录。

三、实验内容a.以输入整形数据为主,输入后按“?”结束输入。

b.程序所能表达到的功能为:实现顺序表的创建、查找、插入、删除等功能。

c.程序运行后,输入数据并执行。

#include "stdio.h"#include "conio.h"#define MaxSize 50typedef char elemtype;typedef struct node{elemtype data[MaxSize];int len;}lnode,*List;void init(List L)//创建链表{ L->len=0;}int length(List L)//获得链表长度{ return L->len;}elemtype getnode(List L,int pos)//返回指定元素{if(pos<1 || pos>L->len) printf("error");else return L->data[pos-1];}int locate(List L,elemtype x)//返回所找元素位置{ int i=0;while(i<L->len && L->data[i]!=x) i++;if(i==L->len) return -1;else return(i+1);}void insert(List L,int pos,elemtype x)//在指定位置插入元素{ int j;if(pos<1 || pos>L->len+1) printf("insert error\n");else {L->len++;for(j=L->len;j>=pos;j--) L->data[j]=L->data[j-1];L->data[pos-1]=x; };}void delnode(List L,int pos)//删除指定位置元素{ int j;if(pos<1 ||pos>L->len)printf("del error\n");else {for(j=pos;j<L->len;j++)L->data[j-1]=L->data[j];L->len--;}}void print(List L)//打印元素{ int i;for(i=1;i<L->len;i++)printf("%c->",L->data[i-1]);printf("%c",L->data[L->len-1]);}main(){int i=1,n;lnode L;char ch,x;init(&L);printf("\n\n\n*******************************顺序表演示程序***********\n"); printf("请输入你想建立的顺序表的元素,以?结束:");ch=getchar();while(ch!='?'){insert(&L,i,ch);i++;ch=getchar();};printf("你建立的顺序表为:");print(&L);printf("\n顺序表的长度为:%d",L.len);printf("\n输入你想查找的元素:");fflush(stdin);scanf("%c",&x);printf("你查找的元素为%c序位为%d",x,locate(&L,x));printf("\n输入你想查找的元素序位:");scanf("%d",&n);printf("\n你查找的元素为:%c",getnode(&L,n));printf("\n输入你想插入的元素以及序位:<用逗号隔开>");fflush(stdin);scanf("%c,%d",&x,&n);insert(&L,n,x);printf("\n插入后顺序表为:");print(&L);fflush(stdin);printf("\n请输入你想删除的元素序位:");scanf("%d",&n);delnode(&L,n);printf("\n删除后的顺序表为:");print(&L);getch();}四、测试结果运行程序,屏幕显示:“请输入你想建立的顺序表的元素,以?结束:”输入:54381你建立的顺序表为:5—>4—>3—>8—>1顺序表的长度为:5输入你想查找的元素:4你查找的元素为4序位为2输入你想查找的元素序位:4你查找的元素为:8输入你想插入的元素以及序位:<用逗号隔开>":6,3插入后顺序表为:5—>4—>6—>3—>8—>1请输入你想删除的元素序位:5删除后的顺序表为:5—>4—>6—>3—>1实验二栈和队列一、实验目的:1、掌握队列和栈的顺序存储结构和链式结构,以便在实际背景下灵活运用。

2、掌握栈和队列的特点,即先进后出与先进先出的原则。

二、实验内容:停车场管理[问题描述]设有一个可以停放N辆汽车的狭长停车场,它只有一个大门利用供车辆进出,车辆按到达停车场时间早晚依次可以从停车场最里面向大门处停放(最先到达的第一辆放在停车场最里面)。

然后停车场已放满N辆车,则后来的车辆只能停在车场大门外的便道上等待,一旦停车场有车开走,在它之后进入停车场的车必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。

每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。

如果停留在便道上的未能进停车场就离去,允许它走,不收停车费,而且仍然保持在便道上的等待的车辆的次序。

编制一程序模拟停车场的管理。

[实现要求]要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交的费用和它在停车场内停留时间;[实现提示]汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。

例如,(A,1,5)表示1号牌照车在5这个时刻到达,而(D,5,20)表示5号车在20这个时刻离去,整个程序可以在输入信息为(E,0,0)时结束。

本题可用栈和队列来实现。

[程序实现](1)设计思想根据题目要求,停车场只有一个大门,因此可用一个栈来模拟;而当栈满后,继续来的车辆只能停在便道上,根据便道停车的特点,可知这可以用一个队列来模拟,安排队的车辆先离开便道,进入停车场。

由于在停车场中间的车辆可以提出离开停车场,而且要求在离开车辆到停车场大门之间的车辆都必须先离开停车场,让此车离去,然后再让这些车辆依原来的次序进入停车场,因此在一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,很显然这也应该用一个栈来模拟。

因此本题中用到两个栈和一个队列。

对于停车场和车辆规避所,有车辆进入和车辆离去两个动作,这就是栈的进栈和出栈操作,只是还允许排在中间的车辆先离开停车场,因此在栈中需要进行查找。

而对于便道,也有入队列和出队列的操作,同样允许排在中间的车辆先离去队列。

这样基本动作只需利用栈和队列的基本操作就可实现。

三、详细设计:#include "stdio.h"#define N 5 /*定义停车场长度*/#define M 10typedef struct /*定义栈元素的类型*/{int num;int arrtime;}elemtype;typedef struct /*定义栈*/{elemtype stack[N];int top;}stack;typedef struct node /*定义队列节点类型*/{int num;struct node*next;}queneptr;typedef struct /*定义队列*/{queneptr*front,*rear;}quene;void initstack(stack*s) /*初始化栈*/{s->top=-1;}int push(stack *s,elemtype x) /*数据元素X进入指针S所指的栈*/{if(s->top==N-1)return(0);else{s->stack[++s->top]=x;return(1);}}elemtype pop(stack *s){elemtype x;if(s->top<0){x.num=0;x.arrtime=0;return(x); /*如果栈不空,返回栈顶元素*/}else{x=s->stack[s->top];s->top--;return x;}}void initquene(quene*s) /*初始化队列*/{s->front=(queneptr*)malloc(sizeof(queneptr)); /*产生一个新结点,作为头结点*/s->rear=s->front;s->front->next=NULL;s->front->num=0; /*头结点的NUM保存队列元素的个数*/ }void enquene(quene *s,int num) /*数据入队列*/{queneptr *p;p=(queneptr*)malloc(sizeof(queneptr));p->num=num;p->next=NULL;s->rear->next=p;s->rear=p;s->front->num++;}int delquene(quene*s){queneptr*p;int n;if (s->front==s->rear)return(0); /*如果队列空*/else{p=s->front->next;s->front->next=p->next;if (p->next==NULL)s->rear=s->front;n=p->num;free(p);s->front->num--;return(n);}}void arrive(stack*s1,quene*p,elemtype x){int f;f=push(s1,x); /*新到达的车辆入停车栈*/if (f==0){enquene(p,x.num); /*如果停车场满,就进入队列*/printf("the %d car stops the %d seat of the quene\n",x.num,p->front->num);}else printf("the %d car stops the %d seat of the stack\n",x.num,s1->top+1);}void leave(stack *s1,stack *s2,quene*p,elemtype x) /*处理车辆离去函数*/{int n,f=0;elemtype y;queneptr *q;while((s1->top>-1)&&(!f)){y=pop(s1);if(y.num!=x.num)n=push(s2,y);else f=1;}if(y.num==x.num) /*如果栈顶元素不是要离开的车辆,就将其放入车辆规避所*/{printf("the money of the %d is %d yuan\n",y.num,(x.arrtime-y.arrtime)*M);while(s2->top>-1){y=pop(s2);f=push(s1,y);}n=delquene(p);if(n) /*在停车场中找到要离开的车辆*/{y.num=n;y.arrtime=x.arrtime;f=push(s1,y);printf("the %d car stops the %d seat of the stak\n",y.num,s1->top+1);}}else {while(s2->top>-1) /*车辆规避所不空,将其全放回停车场*/ {y=pop(s2);f=push(s1,y);}q=p->front;f=0;while(f==0&&q->next!=NULL)if(q->next->num!=x.num) /*如果便道上有车辆,将第一辆车放入停车场*/ q=q->next;else {q->next=q->next->next;p->front->num--;if(q->next==NULL)p->rear=p->front;printf("the %d car leave the quene\n",x.num);f=1;}if(f==0) /*在便道上没有找到要离开的车辆,输出数据错误*/ printf("error!the stack and the quene have no the%d car\n",x.num); }}void main() /*停车场模拟管理程序*/{char ch;stack *s1,*s2;quene*p;elemtype x;int i=1;clrscr();s1=(stack*)malloc(sizeof(stack));s2=(stack*)malloc(sizeof(stack));p=(quene*)malloc(sizeof(quene));initstack(s1);initstack(s2); /*初始化停车规避所栈*/initquene(p); /*初始化便道队列*/while(i){printf("what do you want to do?\n");printf("input---(Add/Del/Exit):");scanf("%c",&ch);switch (ch){case'a':printf("input the number:\n");scanf("%d",&x.num);printf("input the time:\n");scanf("%d",&x.arrtime);arrive(s1,p,x); /*车辆到达*/break;case'd':printf("input the number:\n");scanf("%d",&x.num);printf("input the time:\n");scanf("%d",&x.arrtime);leave(s1,s2,p,x); /*车辆离开*/break;case'e':printf("the end!");i=0;break;default:{printf("input error!---please input again:\n");break;} }ch=getchar();}}四、使用说明:1、按提示输入车进入停车场的情况2、按提示输入车离开停车场的情况3、车离开后计算车进入停车场的时间并得出应收费用。

相关主题