数据结构课程设计报告书Word下载.docx

上传人:b****3 文档编号:7151905 上传时间:2023-05-08 格式:DOCX 页数:32 大小:437.03KB
下载 相关 举报
数据结构课程设计报告书Word下载.docx_第1页
第1页 / 共32页
数据结构课程设计报告书Word下载.docx_第2页
第2页 / 共32页
数据结构课程设计报告书Word下载.docx_第3页
第3页 / 共32页
数据结构课程设计报告书Word下载.docx_第4页
第4页 / 共32页
数据结构课程设计报告书Word下载.docx_第5页
第5页 / 共32页
数据结构课程设计报告书Word下载.docx_第6页
第6页 / 共32页
数据结构课程设计报告书Word下载.docx_第7页
第7页 / 共32页
数据结构课程设计报告书Word下载.docx_第8页
第8页 / 共32页
数据结构课程设计报告书Word下载.docx_第9页
第9页 / 共32页
数据结构课程设计报告书Word下载.docx_第10页
第10页 / 共32页
数据结构课程设计报告书Word下载.docx_第11页
第11页 / 共32页
数据结构课程设计报告书Word下载.docx_第12页
第12页 / 共32页
数据结构课程设计报告书Word下载.docx_第13页
第13页 / 共32页
数据结构课程设计报告书Word下载.docx_第14页
第14页 / 共32页
数据结构课程设计报告书Word下载.docx_第15页
第15页 / 共32页
数据结构课程设计报告书Word下载.docx_第16页
第16页 / 共32页
数据结构课程设计报告书Word下载.docx_第17页
第17页 / 共32页
数据结构课程设计报告书Word下载.docx_第18页
第18页 / 共32页
数据结构课程设计报告书Word下载.docx_第19页
第19页 / 共32页
数据结构课程设计报告书Word下载.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构课程设计报告书Word下载.docx

《数据结构课程设计报告书Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告书Word下载.docx(32页珍藏版)》请在冰点文库上搜索。

数据结构课程设计报告书Word下载.docx

i<

la.length;

i++)

{if(i%2==0)insert(lb,i/2,la.list[i]);

//奇数位次元诩插入lb

elseinsert(lc,i/2,la.list[i]);

//偶数位次元素插入lc

}

printf("

\n您输入的线性表元素为:

\n\n"

print(la);

线性表的奇数位次的元素为:

print(lb);

线性表的偶数位次的元素为:

print(lc);

v)

{printf("

****本程序可以实现线性表奇偶位序的元素分别输出****\n\n\n"

inti,a;

请输入一个偶数作为线性表的长度:

scanf("

%d"

&

a);

while(a%2!

=0)

\n你刚才输入的是奇数,请重新输入一偶数:

v.length=a;

\n请输入线性表的元素(个数为你输入的偶数,超过个数的元素程序不计入):

getchar();

v.length;

i++)

%c"

v.list[i]);

//对la进行赋值

v)//构造一个空的线性表

{v.elem=(char*)malloc(max*sizeof(char));

v.length=0;

v,intj,charc)

{v.list[j]=c;

//插入c

v.length++;

voidprint(sqlistv)

{inti;

v.list[i]);

}//输出线性表元素

【调试和运行】

经过调试运行,程序均得到正确结果,例如输入9个元素adjfhres得到结果如下图:

【收获与体会】:

【2】已知线性表LA的数据元素(n个),现要求将LA的数据元素复制到另一个线性表LB中。

【程序设计思想】:

建立两个线性表la,lb。

对la进行输入赋值操作,然后对la线性表的每个元素依次对lb进行插入操作,从而得到线性表lb。

#definemax600//定义线性表最大长度

typedefstruct{

//输出线性表

*****************本程序可以实现线性表的复制******************\n"

sqlistla,lb;

//声明线性表

i++)//复制操作

{lb.list[i]=la.list[i];

lb.length++;

v)//输入元素,构造线性表

printf("

\n请输入你想输入的线性表的长度:

\n"

v.length);

\n请输入线性表的元素(超过长度的元素程序不计入):

v)//建立空线性表

voidprint(sqlistv)//输出线性表元素

\n复制得到的线性表为:

【调试和运行】:

对程序进行调试和运行,输入9个元素tanwenzhi,得到结果如下图:

【3】:

设有一个线性表采用顺序存储结构,表中的数据元素值为正整数(n个)。

设在O(n)时间内,将线性表分成两为两部分,其中左半部分每个元素都小于原表的第一个元素,而右半部分则相反。

首先要建立一个线性表,对其进行赋值操作,然后进入主程序阶段,即voidpaixu(sqlistv)

{inti=0,j=v.length-1,x=v.list[0];

while(i<

j)

{

while(i<

j&

&

v.list[j]>

x)j=j-1;

if(i<

j){v.list[i]=v.list[j];

i=i+1;

v.list[i]<

x)i=i+1;

j){v.list[j]=v.list[i];

j=j-1;

v.list[i]=x;

把第一个元素作为比较基准,进行上式的循环,从而把小于第一个元素的排在左边,大于第一个元素的排在右边。

达到程序要求。

#definemax600

int*elem;

intlist[max];

voidpaixu(sqlist);

**********本程序实现以第一个元素为标准左小右大分布***********\n"

sqlistl;

initial(l);

inti=0,j=l.length-1,x=l.list[0];

l.list[j]>

j){l.list[i]=l.list[j];

l.list[i]<

j){l.list[j]=l.list[i];

l.list[i]=x;

print(l);

v.elem=(int*)malloc(max*sizeof(int));

\n请输入线性表的长度:

\n请输入%d个正整数:

v.length);

voidprint(sqlistv)

\n重新分布以后的数列为:

inti;

i++)printf("

%d"

对写好的程序进行编译通过无误,运行程序,输入八个整数:

35123414567367,运行得到的结果如下,达到了程序要求。

【4】:

设线性表LA=(a1,a2,…,am),LB=(b1,b2,…,bn)。

试编写一个算法,将LA、LB合并为线性表LC,使

要求LA、LB和LC均以单链表为存储结构,且LC表利用LA和LB中结点空间,这里m和n的值没有保存在头结点中,并分析算法时间复杂度。

首先建立三个线性表,对其中两个个进行赋值操作,得到原始的线性表,然后通过建立循环结构,再循环结构中判断出前两个线性表的元素的多少,根据判断的结果,分别对第三个空线性表进行插入操作,以达到程序的要求。

【程序核心语句】:

voidmerge1(LinkList&

A,LinkList&

B,LinkList&

C)//把链表A和B合并为C,A和B的元素间隔排列

p=A->

next;

q=B->

C=A;

while(p&

q) 

{s=p->

p->

next=q;

//将B的元素插入

if(s)

{t=q->

q->

next=s;

//如A非空,将A的元素插入

p=s;

q=t;

【5】:

约瑟夫问题:

设编号为1,2,…,n的n(n>

0)个人按顺时针方向围坐一圈,每人持有一正整数密码。

开始时任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。

如此下去,直到所有人全部出列为止。

令n最大值取30。

要求设计一个程序模拟此过程,求出出列编号序列(采用循环单链表结构)。

约瑟夫问题是一道经典的链表程序,有各种各样的算法细想,各种各样实现算法,这些都体现了程序的多样性。

对于这一经典问题,我采用循环链表结构,运用循环结构模拟游戏的过程,对于人数进行赋值,对于每个人的密码进行输入赋值,然后指定第一个密码,运用循环结构,通过主程序的作用,对出列号码进行存储,集中输出。

【程序设计代码】:

typedefstructnode////循环链表结构

intnum,code;

structnode*next;

}LinkList;

//建立单链表

*********本程序为约瑟夫问题的解决***********\n"

intm=0,n=0,i=0,j=0;

LinkList*head,*s,*r,*p;

//声明

\n请输入第一个m值:

scanf("

m);

\n请输入总人数:

n);

\n输入%d个人依次的密码(!

数字只限于1到%d!

并以空格隔开):

n,n);

head=(LinkList*)malloc(sizeof(LinkList));

//分配存储空间

head->

code);

head->

num=1;

r=head;

for(i=1;

n;

i++)//依次出列

{

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

//分配空间

s->

s->

num=i+1;

next=NULL;

r->

r=r->

}

r=head;

next=head;

\n出列顺序为:

//输出一次出列的序号

for(j=n;

j>

0;

j--)

if(m==1)

r->

num);

p->

next=r->

m=r->

code;

else

for(i=1;

m-1;

p=r;

s=r->

s->

next=s->

r=s->

m=s->

free(s);

//释放s

对程序进行编译无误,运行输入第一个密码为4,人数为23,每个人的密码依次为:

1、9、5、3、6、2、8、10、4、7、19、15、12、11、13、17、20、16、18、14、23、21、、22.运行得到结果如下图:

【实验二】栈和队列的基本操作

1.掌握栈和队列两种抽象数据类型的特点。

2.掌握顺序栈和链栈入栈、出栈的实现算法。

3.掌握栈满和栈空的描述方法。

4.掌握循环队列(顺序表示)和链队列入队、出队的实现算法。

5.掌握队满和队空的描述方法。

【实验内容】:

【1】:

试编写算法,在顺序存储结构下实现堆栈的下列运算:

(1)initstk(s)。

初始化操作,建立一个空栈s;

(2)emptystk(s)。

判定栈是否为空;

(3)pushstk(s)。

如果栈s不满,在栈顶插入x;

(4)popstk(s)。

如果栈s不空,删除栈顶元素,并返回该元素的值;

(5)getstk(s)。

如果栈s不空,返回栈顶元素。

这些都是栈的基本操作的训练,按照栈的定义和基本的操作来实现就可以了,考查的是基本操作的运用。

【程序核心算法】:

#definestack_init_size100;

#definestackincreament10;

selemtype*base;

selemtype*top;

intstacksize;

}sqstack;

(1)初始化操作,建立一个空栈s

voidinitstk(sqstack&

s)

{s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));

if(!

s.base)exit(overflow);

s.top=s.base;

s.stacksize=stack_init_size;

returnok;

(2)判定栈是否为空

voidemptystk(sqstacks)

if(s.top==s.base)returnyes;

elsereturnno;

(3)如果栈不满,在栈顶插入x

voidpushstk(sqstack&

s,selemtypex)

{if(s.top-s.base<

s.stacksize)

*s.top++=e;

(4)如果栈不空,删除栈顶元素,并返回该元素值

voidpopstk(sqstack&

s,selemtype&

e)

if(s.top==s.base)returnerror;

e=*--s.top;

(5)如果栈不空,返回栈顶元素

voidgetstk(sqstacks,selemtype&

{if(s.top==s.base)returnerror;

e=*(s.top-1);

训练的是栈的基本操作,进一步掌握了栈的基本操作,基础知识要牢固,便于灵活的运用。

【2】试编写算法,实现链队列的下列操作算法:

(1)initlq(q)。

初始化操作,建立一个空队列q;

(2)emptylq(q)。

判定队列q是否为空;

(3)enterlq(q)。

进队列;

(4)deletelq(q)。

出队列。

这里练习的是队列的基本操作,按照队列的定义与基本的操作去编写就好。

要注意判断队列的空满。

typedefstructqnode{

qelemtypedata;

structqnode*next;

}qnode,*queueptr;

queueptrfront;

queueptrrear;

}linkqueue;

初始化操作,建立一个空队列q

voidinitlq(linkqueue&

q)

{q.front=q.rear=(queueptr)malloc(sizeof(qnode));

if(!

q.front)exit(overflow);

q.front->

next=null;

判定队列q是否为空

voidemptylq(linkqueueq)

if(q.front==q.rear)returnyes;

elseretunno;

进队列

voidenterlq(linkqueue&

q,qelemtypee)

p=(queueptr)malloc(sizeof(qnode));

p)exit(overflow);

data=e;

q.rear->

next=p;

q.rear=p;

出队列

voiddeletelq(linkqueue&

if(q.front==q.rear)returnerror;

p=q.front->

next=p->

if(q.rear==p)q.rear=q.front;

free(p);

【实验三】串的基本操作

1、掌握串的基本操作。

2、掌握串函数的基本使用方法。

3、加深对串的理解,逐步培养解决实际问题的编程能力。

假设以顺序存储结构存放字符串,试编写算法,实现下列基本操作(用C语言编写):

(1)CreatString(&

S)。

输入并建立顺序存储的字符串S;

(2)SubString(&

T,S,pos,len)。

求S串从pos开始长度为len的子串放入T串;

(3)StrInsert(&

S,i,T)。

在串S的第i个字符前插入T;

(4)StrDelele(&

T,S,i,len)。

从串S中删除第i个字符起长度为len的子串送到T中。

char*ch;

intlength;

}hstring;

输入并建立顺序存储的字符串s

voidcreatstring(hstring&

{if(s.ch)free(s.ch);

输入你要构造的串的元素个数:

i);

(s.ch=(char*)malloc(i*sizeof(char))))exit(overflow);

请依次输入元素:

intj;

for(j=0;

j<

i;

j++)

s.ch[j]);

求s串从pos开始长度为len的子串放入t串

voidsubstring(hstring&

t,hstrings,intpos,intlen)

if(pos<

1)||pos>

s.length||len<

0||len>

s.length-pos+1)

returnerror;

if(t.ch)free(t.ch);

len){t.ch=null;

t.length=0);

else{

t.ch=(char*)malloc(len*sizeof(char));

for(i=0;

len-1;

{t.ch[i]=s.ch[pos+i-1];

t.length=len;

在串s的第i个字符前插入串t

voidstrinsert(hstring&

s,inti,hstringt)

if(i<

1||i>

s.length+1)returnerror;

if(t.length){

(s.ch=(char*)realloc(s.ch,(s.length+t.length)*sizeof(char))))exit(overflow);

for(j=s.length-1;

i-1;

--j)

{s.ch[j+t.length]=s.ch[j];

t.length-1;

{s.ch[i-1+j]=t.ch[j];

s.length+=t.length;

从串s中删除第i个字符起长度为len的子串送到t中

VoidStrDelete(hstring&

t,hstrings,inti,intlen)

{/*初始条件:

串S存在,1≤i≤strLength(s)-len+1*/

intj;

if(i<

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

当前位置:首页 > PPT模板 > 中国风

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

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