太原理工大学数据结构实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验
指导书
计算机学院
2012年10月
《数据结构》验证型实验
《数据结构》实验指导书
实验目的和要求
《数据结构》在计算机科学中是一门实践性较强的专业基础课,上机实习是对学生的一种全面综合训练,是与课堂听讲、自习和练习相辅相成的必不可少的一个教学环节。实习着眼于原理与应用的结合,使学生学会把学到的知识用于解决实际问题,起到深化理解和灵活掌握教学内容的目的。同时,通过本课程的上机实习,使学生在程序设计方法及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
实验包括的步骤
1.简要描述题目要求,对问题的描述应避开算法及所涉及的数据类型,只是对所需完成的任务做出明确的陈述,例如输入数据的类型、值的范围以及输入的形式,输出数据的类型、值的范围以及输出的形式。
2.选定数据结构,写出算法,根据自顶向下发展算法的方法,首先描述算法的基本思想,然后进行算法细化,再对所设计的算法的时间复杂性和空间复杂性进行简单分析。
3.准备好上机所需的程序,选定一种程序设计语言(如C语言),手工编好上机程序,并进行反复检查,使程序中的逻辑错误和语法错误减少到最低程度。对程序中有疑问的地方,应做出标记,以便在上机时给予注意。
4.上机输入和调试程序,在调试程序过程中除了系统的问题以外,一般应自己独立解决。在程序调试通过后,打印输出程序清单和运行结果。
5.上机结束后,总结和整理实验报告。
实验报告的内容
1.简述题目要解决的问题是什么,并说明输入和输出数据的形式。
2.简述存储结构和算法的基本思想。
3.列出调试通过的源程序。
4.列出上面程序对应的运行结果。
5.分析程序的优缺点、时空性能以及改进思想,写出心得体会。
实验一线性表
一.目的与要求
本次实习的主要目的是为了使学生熟练掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,提高分析和解决问题的能力。要求仔细阅读并理解下列例题,上机通过,并观察其结果,然后独立完成后面的实习题。
二.例题
[问题描述]
用链表形式存储一个字符串,插入、删除某个字符,最后按正序、逆序两种方式输出字符串。
[输入]
初始字符串,插入位置,插入字符,删除字符。
[输出]
已建立链表(字符串),插入字符后链表,删除字符后链表,逆转后链表。
[存储结构]
采用链式存储结构
[算法的基本思想]
建立链表:当读入字符不是结束符时,给结点分配存储空间,写数据域,将新结点插到表尾;插入字符:根据读入的字符在链表中找插入位置,将新结点插入到该位置之前;删除字符:根据读入的删除字符在链表中找到被删结点后,将其从链表中删除;链表逆转:从链表的第一个结点开始对所有结点处理,将每个结点的前驱变为它的后继;打印链表:从链表的第一个结点开始,依次打印各个结点的数据域。[参考源程序]
#define NULL 0
typedef struct node{
char a;
struct node *link;
}node,*nodelink;
void readlink(nodelink head){
nodelink p,q;
char c;
p=head;
printf("Input a linktable(a string):"); scanf("%c",&c);
if (c=='\n') printf("This string is empty。");
while(c!='\n')
{ q=(nodelink)malloc(sizeof(node)); q->a=c;
p->link=q; p=q;
scanf("%c",&c);
}
p->link=NULL;
}
void writelink(nodelink head)
{ nodelink q;
if (head->link==NULL) printf(" This link is empty。\n");
for(q=head->link;q;q=q->link) printf("%c",q->a);
printf("\n");
}
int insert(nodelink head,char k1,char k2)
{ nodelink p,q;
p=head->link;
while(p->a!=k1&&p) p=p->link;
if(p){ q=(nodelink)malloc(sizeof(node));
q->a=k2; q->link=p->link; p->link=q; return 1;
}
else { printf("There is no %c\n",k1); return 0; }
}
int delete(nodelink head,char k)
{ nodelink p,q;
q=head; p=head->link;
while(((p->a)!=k)&&p){ q=q->link; p=p->link; }
if(p) { q->link=p->link; return 1; }
else{ printf("There is no %c\n",k); return 0;}
}
void opside(nodelink head)
{ nodelink p,q;
p=head->link;
while(p->link){ q=p->link; p->link=q->link; q->link=head->link; head->link=q; } }
main()
{ char k1,k2,k3;
nodelink head;
head=(nodelink)malloc(sizeof(node)); head->link=NULL;
readlink(head);
if (head->link!=NULL)
{printf("Build link is :"); writelink(head); }
if (head->link!=NULL)
{ printf("Please input a char you want to insert after:");
k1=getch(); printf("%c\n",k1);
printf("Please input a char you want to insert:"); k2=getch();
printf("%c\n",k2);
if (insert(head,k1,k2))
{printf("After %c insert %c,link is:",k1,k2); writelink(head); }
printf("Please input a char you want to delete:"); k3=getch();
printf("%c\n",k3);
if (delete(head,k3))
{ printf("after delete %c,link is:",k3); writelink(head); }
if (head->link!=NULL)
{printf("Opsite result is :"); opside(head); writelink(head); free(head); } }
}
[运行情况]
Input a linktable(a string):lopui↙
Build link is :lopui
Please input a char you want to insert after:p↙
Please input a char you want to insert:y↙
After p insert y,link is:lopyui
Please input a char you want to delete:p↙
after delete p,link is:loyui
Opsite result is :iuyol
三.实习题
1.设顺序表A中的数据元素递增有序,试写一程序,将x插入到顺序表的适当位置上,使该表仍然有序。2.用单链表ha 存储多项式A(x )=a0+a1x1+a2x2+…+a n x n(其中a I为非零系数),用单链表hb 存储多项式B(x )=b0+b1x1+b2x2+…+b m x m(其中b j为非零系数),要求计算C(x )= A(x )+B(x ),结果存到单链表hc中。试写出程序。
3.设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到m的人又出列,如此重复,直到所有的人全部出列为止。Josephus问题是:对于任意给定的n,m,s,求出按出列次序得到的n个人员的顺序表。