西电《软件技术基础》上机大作业答案解析.docx

上传人:b****0 文档编号:25848289 上传时间:2023-06-16 格式:DOCX 页数:47 大小:30.93KB
下载 相关 举报
西电《软件技术基础》上机大作业答案解析.docx_第1页
第1页 / 共47页
西电《软件技术基础》上机大作业答案解析.docx_第2页
第2页 / 共47页
西电《软件技术基础》上机大作业答案解析.docx_第3页
第3页 / 共47页
西电《软件技术基础》上机大作业答案解析.docx_第4页
第4页 / 共47页
西电《软件技术基础》上机大作业答案解析.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

西电《软件技术基础》上机大作业答案解析.docx

《西电《软件技术基础》上机大作业答案解析.docx》由会员分享,可在线阅读,更多相关《西电《软件技术基础》上机大作业答案解析.docx(47页珍藏版)》请在冰豆网上搜索。

西电《软件技术基础》上机大作业答案解析.docx

西电《软件技术基础》上机大作业答案解析

说明

每个实验题目含有一个main函数和一些函数,与实验题目相关的基本运算的函数定义和main函数定义的代码在附录以及对应的文件夹中给出,供上机实验参考使用。

对于每个题目,只需要根据题目要求设计算法,补充函数定义,然后对程序进行编译、调试。

实验一线性表

一、实验目的

1.熟悉线性表的顺序和链式存储结构

2.掌握线性表的基本运算

3.能够利用线性表的基本运算完成线性表应用的运算

二、实验内容

1.设有一个线性表E={e1,e2,…,en-1,en},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={en,en-1,…,e2,e1},要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。

(文件夹:

顺序表逆置、单链表逆置)

2.已知由不具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空间。

(文件夹:

分解单链表)

实验二栈和队列

一、实验目的

1.熟悉栈和队列的顺序和链式存储结构

2.掌握栈和队列的基本运算

3.能够利用栈和队列的基本运算完成栈和队列应用的运算

二、实验内容

1.设单链表中存放有n个字符,试编写算法,判断该字符串是否有中心对称的关系,例如xyzzyx是中心对称的字符串。

(提示:

将单链表中的一半字符先依次进栈,然后依次出栈与单链表中的另一半字符进行比较。

)(文件夹:

判字符串中心对称)

2.假设以数组sequ[m]存放循环队列的元素,同时设变量rear和quelen分别指示循环队列中队尾元素的位置和内含元素的个数。

编写实现该循环队列的入队和出队操作的算法。

提示:

队空的条件:

sq->quelen==0;队满的条件:

sq->quelen==m。

(文件夹:

循环队列)

实验三串

一、实验目的

1.熟悉串的顺序存储结构

2.掌握串的基本运算及应用

二、实验内容

1.串采用顺序存储结构,编写朴素模式匹配算法,查找在串中是否存在给定的子串。

(文件夹:

模式匹配)

2.若S是一个采用顺序结构存储的串,利用C的库函数strlen和strcpy(或strncpy)编写一算法voidSteDelete(char*S,intI,intm),要求从S中删除从第i个字符开始的连续m个字符。

若i≥strlen(S),则没有字符被删除;若i+m≥strlen(S),则将S中从位置i开始直至末尾的字符均删除。

(文件夹:

删除子串)

实验四数组

一、实验目的

1.熟悉数组的结构

2.掌握矩阵的压缩存储

3.能够对数组和矩阵的压缩存储进行运算

二、实验内容

1.若在矩阵Am×n中存在一个元素A[i][j],其满足A[i][j]是第i行元素中最小值,且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。

用二维数组存储矩阵Am×n,设计算法求出矩阵中所有马鞍点。

(文件夹:

找马鞍点)

2.A和B是两个n×n阶的对称矩阵,以行为主序输入对称矩阵的下三角元素,压缩存储存入一维数组A和B,编写一个算法计算对称矩阵A和B的乘积,结果存入二维数组C。

(文件夹:

对称矩阵相乘)

实验五树

一、实验目的

1.熟悉二叉树的链式存储结构

2.掌握二叉树的建立、深度优先递归遍历等算法

3.能够利用遍历算法实现一些应用

二、实验内容

1.已知二叉树采用二叉链表存储结构,如果左、右子树非空,且左子树根结点大于右子树根结点,则交换根结点的左、右子树。

即按要求交换二叉树及子树的左、右子树。

(文件夹:

交换左右子树)

2.采用二叉链表结构存储一棵二叉树,编写一个算法统计该二叉树中结点总数及叶子结点总数。

(文件夹:

统计二叉树结点)

实验六图

一、实验目的

1.熟悉图的邻接矩阵和邻接表的存储结构

2.熟悉图的邻接矩阵和邻接表的建立算法

3.掌握图的遍历算法

二、实验内容

1.无向图采用邻接矩阵存储,编写深度优先搜索遍历算法,从不同的顶点出发对无向图进行遍历。

(文件夹:

无向图邻接矩阵)

实验七排序

一、实验目的

1.熟悉各种内部排序算法

2.能够编写程序显示排序过程中各趟排序的结果

3.能够编写一些排序的算法

二、实验内容

1.采用希尔排序方法对顺序表中的证型数据进行排序,设计希尔排序算法并显示每趟排序的结果。

(文件夹:

希尔排序)

2.编写一个双向起泡的排序算法,即在排序过程中交替改变扫描方向,同时显示各趟排序的结果。

(文件夹:

双向起泡排序)

实验八查找

一、实验目的

1.熟悉线性表、二叉排序树和散列表的查找

2.能够编写一些查找的算法

二、实验内容

1.18个记录的关键字为22、12、13、8、9、20、33、42、44、38、24、48、60、58、74、49、86、53,编写分块查找的算法进行查找。

(文件夹:

分块查找)

2.编写一个判别给定的二叉树是否为二叉排序树的算法,设二叉树以二叉链表存储表示,结点的数据域只存放正整数。

(文件夹:

判断二叉排序树)

附录:

原代码

实验一:

第1题

(1)

//顺序表逆置的程序代码

#include

#include

//顺序表结构类型定义

typedefchardatatype;

constintmaxsize=1024;

typedefstruct

{datatypedata[maxsize];

intlast;

}sequenlist;

voidcreate(sequenlist*&);

voidprint(sequenlist*);

voidinvert(sequenlist*);

voidmain()

{

sequenlist*L;

create(L);//建立顺序表

print(L);//输出顺序表

invert(L);//调用顺序表逆值的函数

print(L);//输出顺序表

}

//建立顺序表

voidcreate(sequenlist*&L)

{

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

L->last=0;

charch;

while((ch=getchar())!

='*')

{

L->last++;

L->data[L->last]=ch;

}

}

//输出顺序表

voidprint(sequenlist*L)

{

for(inti=1;i<=L->last;i++)

printf("%2c",L->data[i]);

printf("\n");

}

//顺序表逆置

voidinvert(sequenlist*L)

{

intn=L->last/2;

for(inti=1;i<=n;i++)

{

chartemp=L->data[i];

L->data[i]=L->data[L->last-i+1];

L->data[L->last-i+1]=temp;

}

}

实验一:

第1题

(2)

//单链表逆置的程序代码

#include

#include

//单链表结构类型定义

typedefchardatatype;

typedefstructnode

{

datatypedata;

structnode*next;

}linklist;

voidcreate(linklist*&);

voidprint(linklist*);

voidinvert(linklist*);

voidmain()

{

linklist*head;

create(head);

print(head);

invert(head);//调用单链表逆置的函数

print(head);

}

//采用尾插法建立具有头结点的单链表

voidcreate(linklist*&head)

{

charch;

linklist*s,*r;

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

r=head;

while((ch=getchar())!

='*')

{

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

s->data=ch;

r->next=s;

r=s;

}

r->next=NULL;

}

//输出单链表

voidprint(linklist*head)

{

linklist*p=head->next;

while(p!

=NULL)

{

printf("%2c",p->data);

p=p->next;

}

printf("\n");

}

//单链表逆置

voidinvert(linklist*head)

{

linklist*p,*q,*r;

p=head->next;

q=p->next;

while(q!

=NULL)

{

r=q->next;

q->next=p;

p=q;

q=r;

}

head->next->next=NULL;

head->next=p;

}

实验一:

第2题

//分解单链表的程序代码

#include

#include

//链表结构类型定义

typedefchardatatype;

typedefstructnode

{datatypedata;

structnode*next;

}linklist;

voidcreate(linklist*&);

voidresolve(linklist*,linklist*,linklist*,linklist*);

voidinsert(linklist*,linklist*);

voidprint1(linklist*);

voidprint2(linklist*);

voidmain()

{linklist*head,*letter,*digit,*other;

create(head);

print1(head);

letter=(linklist*)malloc(sizeof(linklist));//建立3个空循环链表

letter->next=letter;

digit=(linklist*)malloc(sizeof(linklist));

digit->next=digit;

other=(linklist*)malloc(sizeof(linklist));

other->next=other;

resolve(head,letter,digit,other);//调用分解单链表的函数

print2(letter);//输出循环链表

print2(digit);

print2(other);

}

//建立单链表

voidcreate(linklist*&head)

{datatypex;

linklist*s,*r;

head=newlinklist;

r=head;

while((x=getchar())!

='$')

{

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

s->data=x;

r->next=s;

r=s;

}

r->next=NULL;

}

//在循环链表中插入

voidinsert(linklist*h,linklist*p)

{linklist*q=h;

while(q->next!

=h)q=q->next;

q->next=p;

p->next=h;

}

//输出单链表

voidprint1(linklist*head)

{linklist*p=head->next;

while(p!

=NULL)

{printf("%c",p->data);

p=p->next;

}

printf("\n");

}

//输出循环链表

voidprint2(linklist*head)

{linklist*p=head->next;

while(p!

=head)

{

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

//按字母、数字、其它字符分解单链表

voidresolve(linklist*head,linklist*letter,linklist*digit,linklist*other)

{linklist*p;

while(head->next!

=NULL)

{p=head->next;

head->next=head->next->next;

if((p->data>='A'&&p->data<='Z')||(p->data>='a'&&p->data<='z'))

insert(letter,p);

elseif(p->data>='0'&&p->data<='9')insert(digit,p);

elseinsert(other,p);

}

}

voidresolve(linklist*head,linklist*letter,linklist*digit,linklist*other)

{linklist*p;

p=head->next;

while(p!

=NULL)

{

if((p->data>='a'&&p->data<='z')||(p->data>='A'&&p->data<='Z'))

insert(letter,p);

elseif(p->data>='0'&&p->data<='9')insert(digit,p);

elseinsert(other,p);

p=p->next;

}

}

实验二:

第1题

//判字符串中心对称的程序代码

#include

#include

#include

//定义单链表结构类型

typedefchardatatype;

typedefstructnode

{datatypedata;

structnode*next;

}linklist;

//定义顺序栈结构类型

constintmaxsize=40;

typedefstruct

{datatypeelements[maxsize];

inttop;

}stack;

voidsetnull(stack*&);

intlength(linklist*);

voidprintlink(linklist*);

voidcreate(linklist*&,datatype*);

voidpush(stack*,datatype);

datatypepop(stack*);

intsymmetry(linklist*,stack*);//判字符串是否中心对称的函数声明

voidmain()

{

linklist*head;stack*s;

datatypestr[80];

gets(str);

create(head,str);

printlink(head);

setnull(s);

if(symmetry(head,s))printf("字符串\"%s\"中心对称\n",str);

elseprintf("字符串\"%s\"不是中心对称\n",str);

}

//栈初始化

voidsetnull(stack*&s)

{

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

s->top=-1;

}

//求单链表长度

intlength(linklist*head)

{linklist*p=head->next;

intn=0;

while(p!

=NULL){n++;p=p->next;}

returnn;

}

//输出单链表

voidprintlink(linklist*head)

{linklist*p=head->next;

while(p!

=NULL)

{printf("%c",p->data);

p=p->next;

}

printf("\n");

}

//建立具有头结点的单链表

voidcreate(linklist*&head,datatype*str)

{datatype*p=str;

linklist*s,*r;

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

r=head;

while(*p!

='\0')

{

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

s->data=*p;

r->next=s;

r=s;

p++;

}

r->next=NULL;

}

//顺序栈入栈

voidpush(stack*s,datatypee)

{

s->top++;

s->elements[s->top]=e;

}

//顺序栈出栈

datatypepop(stack*s)

{

datatypetemp;

s->top--;

temp=s->elements[s->top+1];

returntemp;

}

//判字符串是否中心对称

intsymmetry(linklist*head,stack*s)

{

intn=length(head)/2;

linklist*p=head->next;

datatypex;

for(inti=0;i

push(s,p->data);

p=p->next;

}

if(length(head)%2==1)p=p->next;

while(p!

=NULL){

x=pop(s);

if(x==p->data)p=p->next;

elsereturn0;

}

return1;

}

实验二:

第2题

//循环队列入队出队的程序代码

#include

#include

#include

//循环队列的结构类型定义

constintm=5;

typedefintdatatype;

typedefstruct

{datatypesequ[m];

intrear,quelen;

}qu;

voidsetnull(qu*);

voidenqueue(qu*,datatype);

datatype*dequeue(qu*);

voidmain()

{qu*sq;

datatypex,*p;

intkey;

sq=(qu*)malloc(sizeof(qu));

setnull(sq);

do

{printf("1.EnterQueue2.DeleteQueue-1.Quit:

");

scanf("%d",&key);

switch(key)

{case1:

printf("EntertheData:

");scanf("%d",&x);

enqueue(sq,x);break;

case2:

p=dequeue(sq);

if(p!

=NULL)printf("%d\n",*p);

break;

case-1:

exit(0);

}

}while

(1);

}

//置空队

voidsetnull(qu*sq)

{sq->rear=m-1;

sq->quelen=0;

}

//入队

voidenqueue(qu*sq,datatypex)

{if(sq->quelen==m)printf("queueisfull\n");

else{sq->quelen++;

sq->rear=(sq->rear+1)%m;

sq->sequ[sq->rear]=x;

}

}

//出队

datatype*dequeue(qu*sq)

{datatype*temp;

if(sq->quelen==0)

{printf("queueisempty\n");returnNULL;}

else{temp=(datatype*)malloc(sizeof(datatype));

sq->quelen--;

*temp=sq->sequ[(sq->rear-sq->quelen+m)%m];

return(temp);

}

}

实验三:

第1题

//模式匹配的程序代码

#include

#include

#include

//顺序串的结构类型定义

#definemaxsize100

typedefstruct

{

charstr[maxsize];

intlen;

}seqstring;

intIndex(seqstring*,seqstring*);

voidmain()

{

seqstring*S,*subS;

S=(seqstring*)malloc(sizeof(seqstring));

subS=(seqstring*)malloc(sizeof(seqstring));

printf("输入串:

");gets(S->str);

S->len=strlen(S->str);

printf("输入子串:

");gets(subS->str);

subS->len=strlen(subS->str);

if(Index(S,subS)>0)printf("匹配成功!

\n");

elseprintf("匹配失败!

\n");

}

//顺序串的朴素模式匹配

intIndex(seqstring*S,seqstring*T)

{inti=1,j=1;//位序从1开始

while(i<=S->len&&j<=T->len)

if(S->str[i-1]==T->str[j-1])

{i++;j++;}//继续比较后面的字符

else

{i=i-j+2;j=1;}//本趟不匹配,设置下一趟匹配的起始位序

if(j>T->len)return(i-T->len);//匹配成功

elsereturn(-1);//匹配不成功

}

实验三:

第2题

//删除子串的程序代码

#

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

当前位置:首页 > 经管营销 > 金融投资

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

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