实验一 线性表实训报告Word文档下载推荐.docx

上传人:b****3 文档编号:18460666 上传时间:2022-12-16 格式:DOCX 页数:19 大小:19.55KB
下载 相关 举报
实验一 线性表实训报告Word文档下载推荐.docx_第1页
第1页 / 共19页
实验一 线性表实训报告Word文档下载推荐.docx_第2页
第2页 / 共19页
实验一 线性表实训报告Word文档下载推荐.docx_第3页
第3页 / 共19页
实验一 线性表实训报告Word文档下载推荐.docx_第4页
第4页 / 共19页
实验一 线性表实训报告Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

实验一 线性表实训报告Word文档下载推荐.docx

《实验一 线性表实训报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验一 线性表实训报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。

实验一 线性表实训报告Word文档下载推荐.docx

);

j;

%d"

\n,a[i]);

2.2代码:

INSERT(L,i,b)。

voidInsert(Linklist&

L,inti,elemtypex)

if(!

L)

{

L=(Linklist)malloc(sizeof(Lnode));

(*L).data=x;

(*L).next=NULL;

if(i==1)

{

s=(Linklist)malloc(sizeof(Lnode));

s->

data=x;

s->

next=L;

L=s;

}

else

p=L;

j=1;

while(p&

j<

i-1)

{j++;

p=p->

next;

if(p||j>

returnerror;

next=p->

p->

next=s;

2.3代码:

typedefintelemtype

typedefstructlinknode

elemtypedata;

structlinknode*next;

}nodetype;

nodetype*create()

elemtyped;

nodetypeh=NULL,*s,*t;

inti=1;

建立单链表:

while

(1)

printf("

输入第%d个结点数据域"

i);

%d"

d);

if(d==0)break;

h=(nodetype*)malloc(sizeof(nodetype));

h->

data=d;

h->

next=NULL;

t=h;

s=(nodetype*)malloc(sizeof(nodetype));

t->

t=s;

i++;

returnh;

voidsat(nodetype*h,inta[])

nodetype*p=h;

while(p!

=NULL)

a[p->

data]++;

p=p->

inta[N+1],i;

N;

a[i]=0;

nodetype*head;

head=create();

sat(head,a);

候选人:

"

for(i=1;

=N;

i++)printf("

%3d"

\n得票数\n"

a[i]);

4.实验小结

线性表是最简单的、最常用的一种数据结构,是实现其他数据结构的基础。

 

实验二栈与队列

1.1了解栈和队列的特性,以便灵活运用。

1.2熟练掌握栈和有关队列的各种操作和应用。

2.1设一个算术表达式包括圆括号,方括号和花括号三种括号,编写一个算法判断其中的括号是否匹配。

malloc.h>

string.h>

#defineNULL0

typedefstructlist

charstr;

structlist*next;

}list;

voidpush(char,list*);

intpop(char.list*);

voiddeal(char*str);

main(void)

charstr[20];

printf("

\n请输入一个算式:

gets(str);

deal(str);

正确!

getchar();

return0;

voiddeal(char*str)

list*L;

L=(list*)malloc(sizeof(list));

if(!

错误!

exit(-2);

L->

while(*str)

if(*str=='

('

||*str=='

['

{'

push(*str,L);

if(*str=='

)'

]'

}'

if(pop(*str,L))

{puts("

错误,请检查!

puts("

按回车键退出"

getchar();

exit(-2);

}

str++;

if(L->

next)

puts("

按任意键退出"

voidpush(charc,list*L)

list*p;

p=(list*)malloc(sizeof(list));

p)

str=c;

next=L->

next=p;

#definecheck(s)if(L->

next->

str==s){p=l->

free(p);

return(0);

intpop(charc,list*L)

list*p;

if(L->

next==NULL)return1;

switch(c)

case'

:

check('

)break;

return1;

栈和队列是最基础的一种数据结构之一,为实现其他数据结构的奠定基石。

实验三树

1.1掌握二叉树,二叉树排序数的概念和存储方法。

1.2掌握二叉树的遍历算法。

1.3熟练掌握编写实现树的各种运算的算法。

2.1编写程序,求二叉树的结点数和叶子数。

2.2编写递归算法,求二叉树中以元素值为X的结点为根的子数的深度。

2.3编写程序,实现二叉树的先序,中序,后序遍历,并求其深度。

structnode{

chardata;

structnode*lchild,*rchild;

}bnode;

typedefstructnode*blink;

blinkcreat()

blinkbt;

charch;

ch=getchar();

if(ch=='

'

)return(NULL);

bt=(structnode*)malloc(sizeof(bnode));

bt->

data=ch;

lchild=creat();

rchild=creat();

returnbt;

intn=0,n1=0;

voidpreorder(blinkbt)

if(bt)

n++;

if(bt->

lchild==NULL&

bt->

rchild==NULL)

n1++;

preorder(bt->

lchild);

rchild);

blinkroot;

root=creat();

preorder(root);

此二叉数的接点数有:

%d\n"

n);

此二叉数的叶子数有:

n1);

intget_deep(bitreeT,intx)

if(T->

data==x)

get_deep(T));

exit1;

if(T->

lchild)get_deep(T->

lchild,x);

rchild)get_deep(T->

rchild,x);

intget_depth(bitreeT)

T)return0;

m=get_depth(T->

n=get_depth(T->

return(m>

n?

m:

n)+1;

%c"

bt->

data);

voidinorder(blinkbt)

if(bt)

{

inorder(bt->

voidpostorder(blinkbt)

postorder(bt->

intmax(intx,inty)

if(x>

y)

returnx;

else

returny;

intdepth(blinkbt)

return1+max(depth(bt->

lchild),depth(bt->

rchild));

return0;

按先序排列:

preorder(root);

按中序排列:

inorder(root);

按后序排列:

postorder(root);

此二叉数的深度是:

depth=%d\n"

depth(root));

通过本章学习实验,对树有了初步的认识。

树就是一种非线性的数据结构,描述了客观世界中事物之间的层次关系。

这种结构有着广泛的应用,一切具有层次关系的问题都可以用树来表示。

实验四图

1.1熟悉图的各种存储方法。

1.2掌握遍历图的递归和非递归的算法。

1.3理解图的有关算法。

2.1写出将一个无向图的邻接矩阵转换成邻接表的算法。

2.2以邻接表作存储结构,给出拓扑排序算法的实现。

voidmattolist(inta[][],adjlistb[],intn)/*n为图的结点个数*/

n;

i++)b[i].firstarc=NULL;

/*邻接表置空*/

i++)/*逐行进行*/

for(j=n-1;

j>

=0;

j--)

if(a[i][j]!

=0)

{p=(arcnodetp*)malloc(sizeof(arcnodetp));

/*产生邻接点*/

p->

adjvex=j;

nextare=b[i].firstare;

b[i].firstarc=p;

typedefstructvexnode

VertexTypevertex;

intin;

/*增加一个入度域*/

ArecNodeTp*fristarc;

}AdjList[vnum];

typedefstructgraph

AdjListadjlist;

intvexnum,arcnum;

}GraphTp;

Top_Sort(GraphTpg)

LstackTp*p;

/*建立入度为0的顶点栈S*/

intm,i,v;

initStack(S);

g.vexnum;

if(g.adjlist[i].in==0)/*if(w的入度==0)*/

push(S,&

v);

/*w入S栈*/

m=0;

whlie(!

EmptyStack(S)){

Pop(S,&

v)//S出栈->

v

printf("

v);

/*输出v*/

m++;

p=g.adjlist[i].fristarc;

/*p=图g中顶点v的第一个邻接点*/

while(p!

=NULL){//p存在

(g.adjlist[p->

adjvex].in)--;

/*p的入度--*/

if(g.adjlist[p->

adjvex].in==0)/*if(p的入度==0)*/

Push(S,p->

adjvex);

/*p入S栈*/

p=p->

nextarc;

/*p=图g中的顶点v的下一个邻接点*/

if(m<

g.vexnum)return0;

/*图含有环*/

elsereturn1;

通过本章学习实验,对图有了具体的认识。

图也是一种非线性的数据结构,这种结构有着广泛的应用,一切具有关系的问题都可以用图来表示。

实验五查找

1.1掌握顺序查找、二分法查找、分块查找和哈希表查找的算法。

1.2能运用线性表的查找方法解决实际问题。

2.1编写一个算法,利用二分查找算法在一个有序表中插入一个元素X,并保持表的有序性。

2.2根据给定的数据表,先建立索引表,然后进行分块查找。

#include<

#defineMAXNUM20

intinput(int*);

/*输入数据*/

intsearch(int*,int,int);

/*查找插入位置*/

voidplug(int*,int,int);

/*插入数据*/

voidmain(void)

intdata[MAXNUM],m;

intinsert=1;

m=input(data);

Inputtheinsertnum:

scanf("

data);

insert=search(data,1,m);

/*返回插入位置*/

plug(data,insert,m);

for(insert=1;

insert<

=m+1;

insert++)/*显示数据*/

*(data+insert));

getch();

intinput(int*data)

inti,m;

\nInputthemaxnum:

scanf("

m);

inputdata\n"

for(i=1;

=m;

data+i);

returnm;

intsearch(int*data,intlow,inthigh)/*递归查找插入位置*/

intmid;

if(low>

high)returnlow;

/*没有找到插入数据,返回low*/

else{

mid=(low+high)/2;

if(*(data+mid)==*data)retunmid;

/*找到插入数据,返回mid*/

elseif(*(data+mid)<

*data)

elseif(*()data+mid)>

search(data,low,high);

voidplug(int*data,intinsert,intm)

inti;

for(i=m;

i>

insert;

i--)

*(data+i+1)=*(data+i);

*(data+insert)=*data

conio.h>

#definrN18/*元素个数*/

#definrBlocknum3/*分块数*/

typedefstructindexterm

intkey;

/*最大关键字*/

intaddr;

/*块的起始地址*/

}index;

/*索引表数据类型*/

index*CreateList(intdata[],intn)/*建索引表*/

index*p;

intm,j,k;

m=n/BlockNum;

/*分为BlockNum块,每块有m个元素*/

p=(index*)malloc(BlockNum*sizeof(index));

for(k=0;

k<

BlockNum;

k++){

(p+k)->

key=data[m*k];

addr=m*k;

for(j=m*k;

m*k+m;

j++)

if(data[j]>

(p+k)->

key)

(p+k)->

key=data[j];

/*块的最大关键字*/

returnp;

intBlockSearch(index*list,intrectab[],intn,intm,intk)/*分块查找*/

intlow=0,high=m-1,mid,i;

intb=n/m;

/*每块有b个元素*/

while(low<

=high){/*块间折半查找*/

if((list+mid)->

key>

=k)

high=mid+1;

elselow=mid+1;

if(low<

m){/*索引表申请成功后,块内顺序查找*/

for(i=(list+low)->

addr;

=(list+low)->

adder+b-1&

rectab[i]!

=k;

i++);

if(i<

addr+b-1)

returni;

elsereturn-1;

return-1;

intrecord[N]={22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,49,86,53};

index*list;

pleaseinputkey:

key);

list=CreateList(record,N);

datapostionid%d\n"

BlockSearch(list,record,N,BlockNum,key));

通过本章的学习,对排序有较高层次的理解与认识,从平时的练习中可以看出排序是数据处理中经常用到的重要运算。

有序的顺序表可以采用查找效率较高的折半查找法,而无序的顺序表只能用效率较低的顺序查找法。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1