数据结构实验报告Word下载.docx
- 文档编号:1436113
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:51
- 大小:44.41KB
数据结构实验报告Word下载.docx
《数据结构实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告Word下载.docx(51页珍藏版)》请在冰点文库上搜索。
stdio.h>
stdlib.h>
string.h>
typedefstructstudent
{
charname[10];
charnum[10];
structscore*next;
}NAME1;
typedefstructscore
charsub[10];
doublegrade;
}NAME2;
NAME1*creat1()
NAME1*head1;
NAME2*head2,*p,*s;
chargra[10],k[3];
intkey=1,n,i;
head1=(NAME1*)malloc(sizeof(NAME1));
printf("
\n输入姓名:
"
);
gets(head1->
name);
\n输入学号:
num);
head2=(NAME2*)malloc(sizeof(NAME2));
p=head2;
while(key)
{
printf("
\n需要创建节点输入1,否则输入0:
gets(k);
n=atoi(k);
if(n!
=0)
{
s=(NAME2*)malloc(sizeof(NAME2));
printf("
\n输入科目:
gets(gra);
i=0;
while(gra[i]!
=NULL)
{
s->
sub[i]=gra[i];
i++;
}
s->
sub[i]=NULL;
\n输入成绩:
grade=atof(gra);
p->
next=s;
p=s;
}
elsekey=0;
}
head2=head2->
next;
p->
next=NULL;
head1->
next=head2;
returnhead1;
}
voiddisplay(NAME1*head)
NAME1*p1;
NAME2*p2;
inti=0;
p1=head;
\n%s%s\n"
p1->
name,p1->
p2=head->
do{
for(i=0;
p2->
sub[i]!
=NULL;
)
%c"
p2->
sub[i]);
i++;
%lf"
grade);
"
p2=p2->
}while(p2!
=NULL);
voidinsert(NAME1*head,intn,charz[10],doublegra)
NAME2*s,*p;
inti;
s=(NAME2*)malloc(sizeof(NAME2));
s->
grade=gra;
strcpy(s->
sub,z);
if(n==1)
{s->
next=head->
head->
else
p=head->
for(i=2;
i<
n;
i++)
p=p->
if(p->
next==NULL)
else
next=p->
voiddislayelement(NAME1*head,chars[10])
p2=p1->
while(p2!
if(strcmp(p2->
sub,s)==0)
puts(p2->
sub);
%f"
else
voiddel(NAME1*head,charsm[10])
NAME2*p,*t;
p=(NAME2*)malloc(sizeof(NAME2));
t=(NAME2*)malloc(sizeof(NAME2));
t=head->
if(strcmp(t->
sub,sm)==0)
next=t->
p=t;
t=t->
while(t->
next!
if(strcmp(t->
p->
t=NULL;
break;
else
p=p->
t=t->
if(t!
=NULL&
&
strcmp(t->
intmain(void)
intt;
head1=creat1();
//输入功能
display(head1);
//输出功能
\n"
输入插入位置\nt="
scanf("
%d"
&
t);
if(t!
输入插入的科目:
scanf("
%s"
sub);
输入插入的成绩:
%lf"
insert(head1,t,sub,grade);
//插入功能
输入删除的科目:
del(head1,sub);
//删除功能
输入输出的科目名:
dislayelement(head1,sub);
//输出特定科目功能
return0;
}
(5)调试记录
输入姓名:
ma
输入学号:
需要创建节点输入1,否则输入0:
输入科目:
a
输入成绩:
45
b
46
c
56
ma2
a45.000000b46.000000c56.000000
输入插入位置
t=1
d
54
d54.000000a45.000000b46.000000c56.000000
d54.000000a45.000000b46.000000
45.000000
d54.000000a45.000000b46.000000Pressanykeytocontinue
(6)运行说明
运行程序时根据弹出的提示分别执行不同的功能,插入,删除,查询。
实验二:
括号匹配
以文件的形式输入一串字符和括号,判断括号是否匹配,并以特殊符号标识出不匹配的括号。
线性结构(栈)
顺序存储方式(数组)
initstack
initstack(D*S)
创建一个空栈
gettop
gettop(D*S)
取栈顶元素
push
push(D*S,chare)
入栈
pop
pop(D*S)
出栈
5
judge
judge(D*S)
判断栈是否为空
用栈的方式实现括号匹配,当遇到左括号时,将左括号入栈,当遇到右括号时,先取栈顶元素看是否与右括号匹配,如果匹配就让栈顶元素出栈,如果不匹配就输出这是第几个括号来标识错误。
(4)源程序清单
malloc.h>
typedefcharSElemType;
#defineSIZE100
#defineSTACKINCREMENT20
typedefintsize;
typedefstruct
SElemType*base;
SElemType*top;
intsize;
}D;
S->
base=(SElemType*)malloc(SIZE*sizeof(SElemType));
top=S->
base;
size=SIZE;
returnNULL;
chargettop(D*S)
chare;
e=*(S->
top-1);
returne;
voidpush(D*S,chare)
if(!
(S->
top-S->
base>
=S->
size))
S->
size=S->
size+20;
*S->
top=e;
top++;
voidpop(D*S)
top--;
intjudge(D*S)
if(S->
base==S->
top)
return0;
return1;
chara[50],*p,q,m;
Ds;
intt=1,i=0,n,b;
FILE*in,*out;
//*********************
initstack(&
s);
in=fopen("
f1.txt"
"
r"
if(in==NULL)
f1cannotbeopen\n"
exit(0);
out=fopen("
f2.txt"
w"
if(out==NULL)
f2cannotbeopen\n"
while(!
feof(in))
a[i]=fgetc(in);
a[i]);
i++;
i=%d:
i-1);
n=i-1;
//
p=a;
//*******p指针指向数组a的首地址
for(i=0;
n&
t==1;
q=a[i];
if((q=='
('
)||(q=='
{'
['
))
push(&
s,q);
elseif(q=='
)'
\nq=%c"
q);
m=gettop(&
m=%c"
m);
if(m=='
pop(&
t=0;
b=i;
]'
}'
}//****************************************************
if(t==0)
\nThe%diswrong."
b+1);
\n匹配错误.\n"
elseif(judge(&
s)==0)
\nRight.\n"
\nWrong.\n"
//***************************
if(t==1)
fputc(a[i],out);
b;
fputc(a[i],out);
for(i=b;
if(a[i]=='
||a[i]=='
fputc('
_'
out);
fclose(in);
fclose(out);
return(0);
({{[}]})i=8:
q=}m=[
The5iswrong.
匹配错误.
Pressanykeytocontinue
(6)运行说明
先建一个文本文档,输入一串括号和字符,然后将文件的位置在程序的fopen中来进行修改,运行程序后,如果括号匹配,则会输出“括号匹配”,如果括号不匹配则会输出“匹配错误”。
实验三:
树操作
利用链表建立一棵族谱二叉树,要求树的深度不小于3,先序遍历树,依次输出遍历结点,最后输出树深度及所有叶子结点。
非线性结构(树状结构)
*creat
T*creat()
创建一棵二叉树
preOrder
voidpreOrder(T*s)
先序遍历二叉树
deep
intdeep(T*s)
求树的深度
printleaf
voidprintleaf(T*s)
输出所有叶子节点
首先建立一个结构体存储了结点的数据和左右指针,分别指向左孩子和右孩子。
创建二叉树中,用到的是先序输入,输入n个元素和n+1个空,即根据左根右的顺序输入到二叉树中;
先序遍历的过程中,若结点数据不为空则把数据元素递归地按先序输出来;
树的深度也用到了递归,由根节点出发,从左右子树搜寻,每一次h++,最后输出的深度为子树中最大的深度加根节点即h+1;
输出叶子结点是判断它的左右子树是否为空,若不为空,则接着查找判断,若为空,则把叶子结点输出来。
#defineN5
typedefstructbitree
chardata[N];
structbitree*left;
structbitree*right;
}T;
T*s;
charc[2],d[2];
inta,b;
s=(T*)malloc(sizeof(T));
\nEnterdata:
gets(s->
data);
\n如果'
%s'
有左子树?
输入1,否则输入0."
s->
gets(c);
a=atoi(c);
if(a==0)
s->
left=NULL;
left=creat();
有右子树?
输入1,否则输入0."
gets(d);
b=atoi(d);
if(b==0)
right=NULL;
right=creat();
returns;
}//*************创建
if(s!
%s"
if(s->
left!
preOrder(s->
left);
right!
right);
}//************先序输出
printleaf(s->
left==NULL&
s->
right==NULL)
%4s"
}//************输出叶子节点
inti,j;
if(s->
i=deep(s->
i=0;
j=deep(s->
j=0;
return(i>
j?
i:
j)+1;
}//输出树的深度
T*head;
intm;
head=creat();
//**********
preOrder(head);
printleaf(head);
m=deep(head);
\nThedepthis:
%2d"
。
Enterdata:
如果'
a'
输入1,否则输入0.1
b'
c'
输入1,否则输入0.0
输入1,否则输入0.0
输入1,否则输入0.1
d'
e
e'
g
g'
f
f'
abcdegf
cgf
Thedepthis:
5
创建一棵二叉树时,用到的是先序输入,当输入第一个字符时,判断它是否有左子树,若有的话,输入“1”,然后输入,再次判断;
则输入“0”,判断是否有右子树,依次递归来输入整个二叉树。
运行后程序即会输出先序遍历的结果,树的深度以及叶子结点。
实验四:
校园导览图
实现校园图的建立(顶点不少于5个),并且实现基于此图的最小生成树算法及最短路径算法。
非线性结构(图形结构)
output
voidoutput(P*s)
输出邻接矩阵
outputting
voidoutputting(Pa[N],intn)
普里姆
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告