您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页数据结构实验指导书

数据结构实验指导书

来源:五一七教育网


数据结构实验指导书

原慧琳 编写

东北大学秦皇岛分校

二○○四年十二月

前 言

数据结构课程是信息管理与信息系统专业的一门专业平台课。它是数据库、计算机网络、软件工程等课程的先修课。这门课程要求学生不但要学会针对实际问题,快速的建立起数学模型,而且还要有效地解决实际问题,这是单独的课堂教学所无法达到的。

课程的特点决定了学生必须加强实践,亲自输入算法、运行程序、输出结果,有了一定基础后,亲自进行算法设计。学中练、练中学,在模拟环境中学会用理论知识解决实际问题的能力。

本实验指导书针对课程和学生的特点和时间安排,设计了三个试验,它们是:线性表的插入和删除、单链表的操作、栈和队列的操作。其中线性表的插入和删除、单链表的操作是为了学生熟悉C++环境而设计,栈和队列的操作要求学生针对实际问题进行数学建模与算法设计。

目 录

实验一 线性表的插入和删除 ……………………………4

未找到目录项。实验二 单链表的操作 ……………………………………7

实验三 栈和队列 …………………………………………11

实验一 线性表的插入和删除

[实验目的]

1. 掌握使用MinGW Developer上机调试线性表的基本方法;

2. 掌握线性表的基本操作:插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。

[实验要求]

1. 认真阅读和掌握本实验的程序。

2. 上机运行本程序。

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

4. 按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果

[注意事项]

在磁盘上创建一个目录,专门用于存储数据结构实验的程序。

[实验内容]

线性表基本操作的实现:这个程序中演示了顺序表的创建、插入、删除和查找。

程序如下:

PROGRAM seqlist(input,output);

{线性表可能达到的最大长度}

CONST

maxlen = 1024;

TYPE

elemtp = integer;

{线性表的顺序存储结构}

TYPE

seqlisttp = RECORD

{用一维数组来描述线性表的顺序存储结构}

elem: ARRAY[1..maxlen] OF elemtp;

{定义子界类型last,它的取值范围是0到maxlen}

last: 0..maxlen {线性表长度}

END;

{初始化线性表}

PROCEDURE initlist(VAR v:seqlisttp; ml:integer);

BEGIN

v.last:=0;

END;

{向线性表的第i个元素之前插入一个元素x}

PROCEDURE insertlist(VAR v:seqlisttp; i:integer; b:elemtp);

VAR j:integer;

BEGIN

IF (i<1) OR (i>v.last+1)

THEN writeln('error!')

ELSE IF v.last>=maxlen

THEN writeln('overflow')

ELSE BEGIN

FOR j:=v.last DOWNTO i DO

v.elem[j+1]:=v.elem[j];

v.elem[i]:=b;

v.last:=v.last+1;

END;

END;

{从线性表中删除第i个位置的元素}

PROCEDURE deletelist(VAR v:seqlisttp; i:integer);

VAR j:integer;

BEGIN

IF (i<1) OR (i>v.last+1)

THEN writeln('error!')

ELSE IF v.last>=maxlen

THEN writeln('overflow')

ELSE BEGIN

FOR j:=i+1 TO v.last DO

v.elem[j-1]:=v.elem[j];

v.last:=v.last-1;

END;

END;

{从线性表中查找元素}

FUNCTION findlist(v:seqlisttp; x:elemtp):integer;

VAR i:integer;

BEGIN

i:=1;

WHILE (i<=v.last) AND (v.elem[i]<>x) DO

i:=i+1;

IF i<=v.last THEN findlist:=i

ELSE findlist:=0;

END;

{遍历线性表}

PROCEDURE traverlist(v:seqlisttp);

VAR i:integer;

BEGIN

FOR i:=1 TO v.last DO

BEGIN

writeln(v.elem[i]);

END;

END;

{建立线性表}

VAR

a:seqlisttp;

i,k:integer;

x:elemtp;

BEGIN

{初始化线性表}

InitList(a,maxlen);

{相线性表a的末尾插入5个元素}

writeln('Input 5 integers: ');

FOR i:=1 TO 5 DO

BEGIN

readln(x);

insertlist(a,a.last+1,x);

END;

{遍历线性表a}

traverlist(a);

{删除线性表的第三个元素}

deletelist(a,3);

{遍历线性表a}

traverlist(a);

{在线性表中查找元素}

writeln('Input the integer to be found: ');

readln(x);

k:=findlist(a,x);

IF k>0 THEN writeln('The location of first ',x,' is ',k)

ELSE writeln('not found');

writeln(a.last);

END.

实验二 单链表的操作

[实验目的]

1. 掌握握单链表的基本操作:插入、删除、查找等运算。

[实验要求]

1. 认真阅读和掌握本实验的程序。

2. 上机运行本程序。

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

4. 按照你对单链表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果

[实验内容]

单链表基本操作的实现

这个程序中演示了单链表的创建、插入、删除和查找。

程序如下:

PROGRAM linklist(input,output);

TYPE

elemtp = char;

{单链表中结点的类型}

TYPE

pointer=^node;

node=RECORD

data:elemtp;

next:pointer;

END;

{头插法建表,先进后出}

PROCEDURE createlistf(VAR v:pointer);

VAR

ch:elemtp;

head:pointer; {头指针}

p:pointer; {工作指针}

BEGIN

head:=NIL;

write('Please input chars: ');

{read(ch);} {上一条语句会输出一个换行符,}

{我们先把它读出来,丢掉}

read(ch);

WHILE (ord(ch)<>13) DO

BEGIN

new(p);

p^.data:=ch;

p^.next:=head;

head:=p;

read(ch);

END;

v:=head;

END;

{尾插法建表,先进先出}

PROCEDURE createlistr(VAR v:pointer);

VAR

ch:elemtp;

head:pointer; {头指针}

last:pointer; {尾指针}

p:pointer; {工作指针}

BEGIN

head:=NIL;

last:=NIL;

write('Please input chars: ');

read(ch);

read(ch);

WHILE (ord(ch)<>13) DO

BEGIN

new(p);

p^.data:=ch;

IF head=NIL THEN head:=p

ELSE last^.next:=p;

last:=p;

read(ch);

END;

IF last<>NIL THEN

last^.next:=NIL;

v:=head;

END;

{按序号查找操作}

PROCEDURE getnode(v:pointer; VAR listnode:pointer; i:integer);

VAR

p:pointer;

j:integer;

BEGIN

p:=v; j:=1;

WHILE (p^.next<>NIL) AND (jBEGIN

p:=p^.next;

j:=j+1;

END;

IF j=i THEN listnode:=p

ELSE listnode:=NIL;

END;

{插入操作,在第i个元素之后插入x,i大于等于0}

PROCEDURE insertlist(VAR v:pointer; x:elemtp; i:integer);

VAR

p,s:pointer; {工作指针}

j:integer;

BEGIN

new(p);

p^.data:=x;

IF i=0 THEN {如果i=0,则把p结点插入表头}

BEGIN

p^.next:=v;

v:=p

END

ELSE

BEGIN

getnode(v,s,i); {返回第i个结点的指针}

IF s<>NIL THEN

BEGIN

p^.next:=s^.next;

s^.next:=p;

END

ELSE writeln('not found');

END;

END;

{删除操作,删除第i个结点,i大于等于1}

PROCEDURE deletelist(VAR v:pointer; i:integer);

VAR

p:pointer; {工作指针}

BEGIN

IF v<>NIL THEN

BEGIN

IF i=1 THEN {如果i=1,则删除头结点}

v:=v^.next

ELSE

BEGIN

getnode(v,p,i-1); {返回第i-1个结点的指针}

IF p<>NIL THEN

p^.next:=p^.next^.next

ELSE writeln('erroe');

END;

END

ELSE writeln('The list is null.');

END;

{遍历单链表}

PROCEDURE traverlist(v:pointer);

VAR

p:pointer;

BEGIN

p:=v;

WHILE (p<>NIL)DO

BEGIN

write(p^.data,' ');

p:=p^.next;

END;

END; {建立线性表}

VAR

la,lb:pointer;

listnode:pointer;

c:elemtp;

m:integer;

BEGIN

createlistf(la);

writeln(la^.data);

createlistr(lb);

writeln(lb^.data);

getnode(la,listnode,3);

IF listnode<>NIL THEN writeln(listnode^.data)

ELSE writeln('null');

traverlist(la);

writeln('');

traverlist(lb);

writeln('');

writeln('Input a char and an integer:');

read(c);

read(c,m);

insertlist(la,c,m);

traverlist(la);

writeln('');

deletelist(lb,3);

traverlist(lb);

END.

实验三 栈和队列

[实验目的]

用数据结构知识解决实际问题,掌握栈和队列算法设计。

[实验要求]

设计一个算法,保证货架每次上货后始终保持生产日期越近的越靠近货架里侧。

[实验内容]

商店货架以栈的方式摆放商品。生产日期越近的越靠近占地,出货是从栈顶取货。一天营业结束,如果货架不满,则需上货。如果直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。这样就需要倒货架,仍使生产日期越近的越靠近栈底。

自主设计此算法,并上机运行,输出结果。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务