数据结构第一次.docx

上传人:b****3 文档编号:4335188 上传时间:2023-05-07 格式:DOCX 页数:16 大小:83.62KB
下载 相关 举报
数据结构第一次.docx_第1页
第1页 / 共16页
数据结构第一次.docx_第2页
第2页 / 共16页
数据结构第一次.docx_第3页
第3页 / 共16页
数据结构第一次.docx_第4页
第4页 / 共16页
数据结构第一次.docx_第5页
第5页 / 共16页
数据结构第一次.docx_第6页
第6页 / 共16页
数据结构第一次.docx_第7页
第7页 / 共16页
数据结构第一次.docx_第8页
第8页 / 共16页
数据结构第一次.docx_第9页
第9页 / 共16页
数据结构第一次.docx_第10页
第10页 / 共16页
数据结构第一次.docx_第11页
第11页 / 共16页
数据结构第一次.docx_第12页
第12页 / 共16页
数据结构第一次.docx_第13页
第13页 / 共16页
数据结构第一次.docx_第14页
第14页 / 共16页
数据结构第一次.docx_第15页
第15页 / 共16页
数据结构第一次.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构第一次.docx

《数据结构第一次.docx》由会员分享,可在线阅读,更多相关《数据结构第一次.docx(16页珍藏版)》请在冰点文库上搜索。

数据结构第一次.docx

数据结构第一次

计算机专业类课程

实验报告

课程名称:

数据结构

学  院:

计算机科学与工程学院

专  业:

计算机科学与技术

学生姓名:

包馨宇

学  号:

2012060080028

指导教师:

郝东

日  期:

   2013 年 11 月 24 日

电子科技大学

实验报告

实验一

1、实验名称:

单链表中表头、表尾及表的中间插入删除元素。

2、实验学时:

2学时

3、实验内容和目的:

采用链式存储结构存储’a’,’b’,’c’,’d’,’e’,’f’六个字符,并完成如下操作:

(a)显示第3个数据;

(b)在第2个数据后插入’e’

(c)删除第3个数据并打印整个链表

(d)删除链表

4、实验原理:

链式线性表存储结构

5、实验器材(设备、元器件):

PC机,Windows7操作平台,VisualC++6.0

6、实验步骤:

单链表操作:

1:

构建单链表,存储‘a’,‘b’,‘c’,‘d’,‘e’,‘f’六个字符(采用实例化)

2:

显示第3个数据,‘c’;

3:

在第2个数据后插入‘b’后插入‘e’;

4:

删除第3个数据‘e’;

5:

程序结束

7、实验数据及结果分析:

代码(附):

#include"stdio.h"

#include"iostream"

usingnamespacestd;

structNode{

charc;

structNode*pNext;

};

//遍历打印链表

voidprintList(Node*list){

if(list!

=NULL){

Node*p=list;

cout<<"链表内元素为";

while(p){

cout<c;

p=p->pNext;

}

cout<

}

else{

cout<<"表为空";

}

}

//删除指定位置元素

voidremoveList(Node*list,intpos){

Node*p=list;

Node*q;

inti=1;

while(p){

if(i

i++;

p=p->pNext;

}

if(i==pos-1){

q=p->pNext;

p->pNext=q->pNext;

break;

}

}

}

//删除整个链表

/*voidfreeList(Node*list){

Node*p=list,*q;

while(p){

q=p->pNext;

deletep;

p=q;

}

}*/

//删除整个链表

voidfreeList(Node*list){

Node*p=list;

while(p){

removeList(p,1);

}

}

//在指定位置插入元素

voidinsertList(Node*list,intpos,charc){

Node*p=list;

Node*q=newNode;

q->c=c;q->pNext=NULL;

inti=1;

while(p){

if(i

i++;

p=p->pNext;

}

if(i==pos){

q->pNext=p->pNext;

p->pNext=q;

break;

}

}

}

//查找指定位置的元素

voidfindElem(Node*list,intpos){

Node*p=list;

inti=1;

while(p){

if(i

i++;

p=p->pNext;

}

if(i==pos){

cout<<"第"<

"<c<

break;

}

}

}

voidmain(){

Noden1,n2,n3,n4,n5,n6;

n1.c='a';n1.pNext=&n2;

n2.c='b';n2.pNext=&n3;

n3.c='c';n3.pNext=&n4;

n4.c='d';n4.pNext=&n5;

n5.c='e';n5.pNext=&n6;

n6.c='f';n6.pNext=NULL;

printList(&n1);

findElem(&n1,3);

insertList(&n1,2,'e');

cout<<"第二位插入元素后"<

printList(&n1);

removeList(&n1,3);

cout<<"删除第三个元素后"<

printList(&n1);

//freeList(&n1);

//printList(&n1);

cout<<"程序结束"<

}

8、实验结论、心得体会和改进建议:

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。

链表中的数据是以节点来表示,每个节点由元素和指针构成。

单链表是不断申请存储单元和改变链接关系而得到的一种特殊数据结构,将链表的一边称为链头,另一边称为链尾,将链表一端看成固定的,链表不断向另一侧延伸而得到的整体链表。

链表可进行动态生成,也可在实例化的同时进行生成,本实验采取的是实例化生成,其改进可生成一个链表类,进行返回指针的函数的构建,继而实现更好的代码可移植性及代码的重用性

本实验中注意的地方:

1:

若指针变量p的值为空(NULL),则它不指向任何结点。

此时,若通过指针访问结点就意味着访问一个不存在的变量,从而引起程序的错误。

应增加相应的安全系统。

2:

有关指针类型需明确注意,以防出现内存的溢出。

3:

在链表中插入结点只需要修改指针。

但同时,若要在第i个结点之前插入元素,修改的是第i-1个结点的指针。

因此,在单链表中第i个结点之前进行插入的基本操作为:

找到线性表中第i-1个结点,然后修改其指向后继的指针。

4:

本实验用的为静态输出,无用户进行的交互工作。

可构建函数进行改进,将其改为动态生成,并进行用户端的输入输出,实现系统的交互性。

电子科技大学

实验报告

实验二

1、实验名称:

循环链表中表头、表尾及表的中间插入删除元素(传递游戏)

2、实验学时:

2学时

3、实验内容和目的:

N个人围圆圈而坐,分别标以数字1到N。

从坐在1号的位置的人开始依次传递土豆。

M次传递之后,拿到土豆的人被排除,圆圈收缩,然后从离开圆桌的人后面的那个人开始继续游戏。

游戏一直进行,直到留下最后一个人,为赢家。

因此,如果M=0且N=5,所有的人依次被排除,5号最后胜利。

如果M=1且N=5,排除的顺序为2,4,1,5.

(a)请编程实现M和N为任意可能值的这个游戏,尽量做到程序高效。

(b)分析在N很大(N>10,000)时,程序运行速度怎样被影响?

得出算法的时间复杂度。

4、实验原理:

双向循环链表的插入删除和循环

5、实验器材(设备、元器件)

PC机,Windows7操作平台,VisualC++6.0

6、实验步骤:

1:

建立双向循环链表,设置头尾指针

2:

进行指针的设置,配合函数,实现指针的移动从而达到删除数据并构建链接作用

3:

通过用户的输入进行循环设置

4:

输出最终结果

7、实验数据及结果分析:

#include

#include

usingnamespacestd;

classNode{

public:

intnum;//储存编号

Node*front;

Node*next;

Node:

:

Node(){

num=0;

front=NULL;

next=NULL;

}

};

classgame{

public:

intpersonN;//游戏当前人数

Node*hrp;//头指针

Node*brp;//为指针

Node*cNew;//创建用途指针

//构造函数

game:

:

game(){

hrp=NULL;

brp=NULL;

cNew=NULL;

personN=0;

}

//新增人

voidCreateOnePerson(game*aGame){

aGame->cNew=newNode();

aGame->personN++;

aGame->cNew->num=aGame->personN;

aGame->cNew->front=aGame->brp;

}

//创建游戏第一人

voidCreateGameBegin(game*aGame){

if(aGame==NULL){

cout<<"未创建游戏"<

}else{

CreateOnePerson(aGame);

aGame->brp=aGame->cNew;

aGame->hrp=aGame->cNew;

aGame->hrp->next=aGame->cNew->next;

aGame->brp->next=aGame->hrp;

}

}

//创建第二人

voidCreateGameSecond(game*aGame){

CreateOnePerson(aGame);

aGame->brp->next=aGame->cNew;

aGame->brp=aGame->cNew;

aGame->brp->next=aGame->hrp;

aGame->hrp->next=aGame->cNew;

}

//创建新人节点

voidCreatGameNode(game*aGame){

CreateOnePerson(aGame);

aGame->brp->next=aGame->cNew;

aGame->cNew->next=aGame->hrp;

aGame->brp=aGame->cNew;

aGame->brp->next=aGame->hrp;

}

//创建N人游戏

voidCreateGame(intN,game*aGame){

if(N==0){

cout<<"无玩家"<

return;

}else{

CreateGameBegin(aGame);

if(N==1){cout<<"游戏成功开始"<

CreateGameSecond(aGame);

if(N==2){cout<<"游戏成功开始"<

for(inti=3;i<=N;i++){

CreatGameNode(aGame);

}

aGame->hrp->front=aGame->brp;

aGame->brp->next=aGame->hrp;

}

cout<<"游戏成功开始"<

}

//删除玩家

voidDeleteGameMember(Node*del,game*aGame){

Node*temp;

temp=del;

del->front->next=del->next;

del->next->front=del->front;

cout<<"编号为"<num<<"的玩家出局"<

delete(temp);

}

//删除第一个玩家

voidDeleteGameHeader(game*aGame){

Node*temp;

temp=aGame->hrp;

aGame->hrp->next->front=aGame->brp;

aGame->brp->next=aGame->hrp->next;

aGame->hrp=aGame->hrp->next;

cout<<"编号为"<num<<"的玩家出局"<

delete(temp);

}

//删除第最后一个玩家

voidDeleteGamebacker(game*aGame){

Node*temp;

temp=aGame->brp;

aGame->brp->front->next=aGame->hrp;

aGame->hrp->next=aGame->brp->front;

aGame->brp=aGame->brp->front;

cout<<"编号为"<num<<"的玩家出局"<

delete(temp);

}

//淘汰传递到M的玩家

voidDelGamePMember(intM,game*aGame){

//当首尾指针重合,队列中只剩下一个人,游戏方可结束

Node*current=aGame->hrp;//当前删除的位置指针

while(aGame->hrp!

=aGame->brp){

//确定删除位置,进行判断

for(inti=0;i

current=current->next;

}

//首位置

if(current==aGame->hrp){

current=current->next;

DeleteGameHeader(aGame);

}

//尾位置

elseif(current==aGame->brp){

current=current->next;

game:

:

DeleteGamebacker(aGame);

}

//普通位置

else{

current=current->next;

game:

:

DeleteGameMember(current->front,aGame);

}

}

cout<<"剩余玩家为:

编号为"<hrp->num<<"的玩家"<

cout<<"游戏结束,谢谢参与"<

}

};

intmain(){

gameaGame;

intN,M;

cout<<"请输入参与游戏人数"<

cin>>N;

cout<<"游戏玩家将进行传递。

请输入传递的位数"<

cin>>M;

aGame.CreateGame(N,&aGame);

aGame.DelGamePMember(M,&aGame);

return0;

}

8、实验结论、心得体会和改进建议:

1:

使用malloc的时候,在分配内存的时候一定要实现建立好与变量的链接

2:

对于scanf函数,当其输入的值与所设置的值不是同一类型的,系统将自动调用exit函数,退出程序

3:

进行循环的时候,由于玩家是逐一删除,则程序每次就需要全部循环,最坏的情况是n次的循环,算法的复杂度为O(n*m)

 

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

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2