数据结构C语言版实验报告Word文件下载.docx

上传人:b****5 文档编号:20984207 上传时间:2023-01-26 格式:DOCX 页数:17 大小:20.31KB
下载 相关 举报
数据结构C语言版实验报告Word文件下载.docx_第1页
第1页 / 共17页
数据结构C语言版实验报告Word文件下载.docx_第2页
第2页 / 共17页
数据结构C语言版实验报告Word文件下载.docx_第3页
第3页 / 共17页
数据结构C语言版实验报告Word文件下载.docx_第4页
第4页 / 共17页
数据结构C语言版实验报告Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数据结构C语言版实验报告Word文件下载.docx

《数据结构C语言版实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版实验报告Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

数据结构C语言版实验报告Word文件下载.docx

L.length=0;

L.listsize=LIST_INIT_SIZE;

returnOK;

}

intListInsert_Sq(Sqlist&

L,inti,inte){

if(i<

1||i>

L.length+1)returnERROR;

if(L.length==L.listsize){

int*newbase;

newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));

if(!

newbase)return-1;

L.elem=newbase;

L.listsize+=LISTINCREMENT;

}

int*p,*q;

q=&

(L.elem[i-1]);

for(p=&

(L.elem[L.length-1]);

p>

=q;

--p)

*(p+1)=*p;

*q=e;

++L.length;

intListDelete_Sq(Sqlist&

L.length)returnERROR;

p=&

e=*p;

q=L.elem+L.length-1;

for(++p;

p<

++p)

*(p-1)=*p;

--L.length;

intmain(){

SqlistL;

InitList_Sq(L);

//初始化

inti,a[]={3,-5,6,8,2,-5,4,7,-9};

for(i=1;

i<

10;

i++)

ListInsert_Sq(L,i,a[i-1]);

for(i=0;

9;

printf("

%d"

L.elem[i]);

\n"

);

//插入9个数

ListInsert_Sq(L,3,24);

//插入一个数

inte;

ListDelete_Sq(L,2,e);

//删除一个数

printf("

return0;

实验结果:

3,-5,6,8,2,-5,4,7,-9

3,-5,24,6,8,2,-5,4,7,-9

3,24,6,8,2,-5,4,7,-9

心得体会:

顺序存储结构是一种随机存取结构,存取任何元素的时间是一个常数,速度快;

结构简单,逻辑上相邻的元素在物理上也相邻;

不使用指针,节省存储空间;

但是插入和删除元素需要移动大量元素,消耗大量时间;

需要一个连续的存储空间;

插入元素可能发生溢出;

自由区中的存储空间不能被其他数据共享

实验2

单链表的插入和删除

了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。

建立一个数据域定义为字符类型的单链表,在链表中不允许有重复的字符;

根据输入的字符,先找到相应的结点,后删除之。

3、分析、理解给出的示例程序。

4、调试程序,并设计输入数据(如:

A,C,E,F,H,J,Q,M),测试程序的如下功能:

不允许重复字符的插入;

根据输入的字符,找到相应的结点并删除。

5、修改程序:

(1)增加插入结点的功能。

(2)建立链表的方法有“前插”、“后插”法。

#defineNULL0

typedefstructLNode{

intdata;

structLNode*next;

}LNode,*LinkList;

intInitList_L(LinkList&

L=(LinkList)malloc(sizeof(LNode));

L->

next=NULL;

intListInsert_L(LinkList&

LinkListp,s;

intj;

p=L;

j=0;

while(p&

&

j<

i-1){

p=p->

next;

++j;

p||j>

i-1)

returnERROR;

s=(LinkList)malloc(sizeof(LNode));

s->

data=e;

next=p->

p->

next=s;

intListDelete_L(LinkList&

L,inti,int&

e){

LinkListp,q;

while(p->

next&

(p->

next)||j<

q=p->

p->

next=q->

e=q->

data;

free(q);

LinkListL,p;

chara[8]={'

A'

'

C'

E'

F'

H'

J'

Q'

U'

};

inti,j;

InitList_L(L);

for(i=1,j=0;

=8,j<

8;

i++,j++)

ListInsert_L(L,i,a[j]);

p=L->

while(p!

=NULL){

%c\t"

p->

data);

}//插入八个字符

i=2;

inte;

ListInsert_L(L,i,'

B'

}//插入一个字符

i=3;

ListDelete_L(L,i,e);

return0;

ACEFHJQU

ABCEFHJQU

ABEFHJQU

单链表是通过扫描指针P进行单链表的操作;

头指针唯一标识点链表的存在;

插入和删除元素快捷,方便。

实验3

栈操作设计和实现

1、掌握栈的顺序存储结构和链式存储结构,以便在实际中灵活应用。

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

3、掌握栈的基本运算,如:

入栈与出栈等运算在顺序存储结构和链式存储结构上的实现。

回文判断:

对于一个从键盘输入的字符串,判断其是否为回文。

回文即正反序相同。

如“abba”是回文,而“abab”不是回文。

实验主要步骤

(1)数据从键盘读入;

(2)输出要判断的字符串;

(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。

stdlib.h>

#defineTRUE1

#defineFALSE0

#defineN100

#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10

typedefstruct{

int*base;

//在栈构造之前和销毁之后,base的值为NULL

int*top;

//栈顶指针

intstacksize;

//当前已分配的存储空间,以元素为单位

}SqStack;

intInitStack(SqStack&

S)

{//构造一个空栈S

(S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int))))

exit(OVERFLOW);

//存储分配失败

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

intStackEmpty(SqStackS)

{//若栈S为空栈,则返回TRUE,否则返回FALSE

if(S.top==S.base)

returnTRUE;

else

returnFALSE;

intPush(SqStack&

S,inte)

{//插入元素e为新的栈顶元素

if(S.top-S.base>

=S.stacksize)//栈满,追加存储空间

{

S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));

S.base)

//存储分配失败

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

*(S.top)++=e;

intPop(SqStack&

S,int&

e)

{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;

否则返回ERROR

returnERROR;

e=*--S.top;

intmain(){

SqStacks;

inti,e,j,k=1;

charch[N]={0},*p,b[N]={0};

if(InitStack(s))//初始化栈成功

请输入表达式:

gets(ch);

p=ch;

while(*p)//没到串尾

Push(s,*p++);

N;

i++){

StackEmpty(s)){//栈不空

Pop(s,e);

//弹出栈顶元素

b[i]=e;

if(ch[i]!

=b[i])

k=0;

if(k==0)

NO!

"

输出:

YES!

请输入表达式:

abcba

输出:

栈是仅能在表尾惊醒插入和删除操作的线性表,具有先进后出的性质,这个固有性质使栈成为程序设计中的有用工具。

实验4

二叉树操作设计和实现

掌握二叉树的定义、性质及存储方式,各种遍历算法。

采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。

1、分析、理解程序。

2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

实验5

图的遍历操作

掌握有向图和无向图的概念;

掌握邻接矩阵和邻接链表建立图的存储结构;

掌握DFS及BFS对图的遍历操作;

了解图结构在人工智能、工程等领域的广泛应用。

采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。

设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。

1.邻接矩阵作为存储结构

#include"

stdio.h"

stdlib.h"

#defineMaxVertexNum100//定义最大顶点数

charvexs[MaxVertexNum];

//顶点表

intedges[MaxVertexNum][MaxVertexNum];

//邻接矩阵,可看作边表

intn,e;

//图中的顶点数n和边数e

}MGraph;

//用邻接矩阵表示的图的类型

//=========建立邻接矩阵=======

voidCreatMGraph(MGraph*G)

{

inti,j,k;

chara;

InputVertexNum(n)andEdgesNum(e):

"

scanf("

%d,%d"

&

G->

n,&

e);

//输入顶点数和边数

%c"

a);

InputVertexstring:

n;

i++)

G->

vexs[i]=a;

//读入顶点信息,建立顶点表

for(j=0;

j++)

G->

edges[i][j]=0;

//初始化邻接矩阵

Inputedges,CreatAdjacencyMatrix\n"

for(k=0;

k<

e;

k++){//读入e条边,建立邻接矩阵

%d%d"

i,&

j);

//输入边(Vi,Vj)的顶点序号

edges[i][j]=1;

edges[j][i]=1;

//若为无向图,矩阵为对称矩阵;

若建立有向图,去掉该条语句

//=========定义标志向量,为全局变量=======

typedefenum{FALSE,TRUE}Boolean;

Booleanvisited[MaxVertexNum];

//========DFS:

深度优先遍历的递归算法======

voidDFSM(MGraph*G,inti)

{//以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵

给出你的编码

//===========BFS:

广度优先遍历=======

voidBFS(MGraph*G,intk)

{//以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索

//==========主程序main=====

voidmain()

inti;

MGraph*G;

G=(MGraph*)malloc(sizeof(MGraph));

//为图G申请内存空间

CreatMGraph(G);

//建立邻接矩阵

PrintGraphDFS:

DFS(G);

//深度优先遍历

PrintGraphBFS:

BFS(G,3);

//以序号为3的顶点开始广度优先遍历

2.邻接链表作为存储结构

#defineMaxVertexNum50//定义最大顶点数

typedefstructnode{//边表结点

intadjvex;

//邻接点域

structnode*next;

//链域

}EdgeNode;

typedefstructvnode{//顶点表结点

charvertex;

//顶点域

EdgeNode*firstedge;

//边表头指针

}VertexNode;

typedefVertexNodeAdjList[MaxVertexNum];

//AdjList是邻接表类型

typedefstruct{

AdjListadjlist;

//邻接表

//图中当前顶点数和边数

}ALGraph;

//图类型

//=========建立图的邻接表=======

voidCreatALGraph(ALGraph*G)

EdgeNode*s;

//定义边表结点

//读入顶点数和边数

i++)//建立边表

adjlist[i].vertex=a;

//读入顶点信息

adjlist[i].firstedge=NULL;

//边表置为空表

Inputedges,CreatAdjacencyList\n"

k++){//建立边表

//读入边(Vi,Vj)的顶点对序号

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

//生成边表结点

adjvex=j;

//邻接点序号为j

next=G->

adjlist[i].firstedge;

adjlist[i].firstedge=s;

//将新结点*S插入顶点Vi的边表头部

adjvex=i;

//邻接点序号为i

adjlist[j].firstedge;

adjlist[j].firstedge=s;

//将新结点*S插入顶点Vj的边表头部

voidDFSM(ALGraph*G,inti)

{//以Vi为出发点对邻接链表表示的图G进行DFS搜索

给出你的编码

//==========BFS:

广度优先遍历=========

voidBFS(ALGraph*G,intk){//以Vk为源点对用邻接链表表示的图G进行广度优先搜索

//==========主函数===========

ALGraph*G;

G=(ALGraph*)malloc(sizeof(ALGraph));

CreatALGraph(G);

1.邻接矩阵作为存储结构

2.邻接链表作为存储结构

实验6

二分查找算法的实现

掌握二分查找法的工作原理及应用过程,利用其工作原理完成实验题目中的内容。

编写程序构造一个有序表L,从键盘接收一个关键字key,用二分查找法在L中查找key,若找到则提示查找成功并输出key所在的位置,否则提示没有找到信息。

1.建立的初始查找表可以是无序的,如测试的数据为{3,7,11,15,17,21,35,42,50}或者{11,21,7,3,15,50,42,35,17}。

2.给出算法的递归和非递归代码;

3.如何利用二分查找算法在一个有序表中插入一个元素x,并保持表的有序性?

程序代码

实验7

排序

掌握各种排序方法的基本思想、排序过程、算法实现,能进行时间和空间性能的分析,根据实际问题的特点和要求选择合适的排序方法。

实现直接排序、冒泡、直接选择、快速、堆、归并排序算法。

比较各种算法的运行速度。

实验

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

当前位置:首页 > 农林牧渔 > 林学

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

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