数据结构实验答案1.docx

上传人:b****7 文档编号:10701041 上传时间:2023-02-22 格式:DOCX 页数:50 大小:145.40KB
下载 相关 举报
数据结构实验答案1.docx_第1页
第1页 / 共50页
数据结构实验答案1.docx_第2页
第2页 / 共50页
数据结构实验答案1.docx_第3页
第3页 / 共50页
数据结构实验答案1.docx_第4页
第4页 / 共50页
数据结构实验答案1.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

数据结构实验答案1.docx

《数据结构实验答案1.docx》由会员分享,可在线阅读,更多相关《数据结构实验答案1.docx(50页珍藏版)》请在冰豆网上搜索。

数据结构实验答案1.docx

数据结构实验答案1

重庆文理学院软件工程学院

实验报告册

专业:

_____软件工程___

班级:

_____软件工程2班___

学号:

_____201258014054___

姓名:

_____周贵宇___________

课程名称:

___数据结构_

指导教师:

_____胡章平__________

2013年06月25日

实验序号

1

实验名称

实验一线性表基本操作

实验地点

S-C1303

实验日期

2013年04月22日

1.编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。

2.编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。

3.编程序实现将单链表的数据逆置,即将原表的数据(a1,a2….an)变成(an,…..a2,a1)。

(单链表的数据域数据类型为一结构体,包括学生的部分信息:

学号,姓名,年龄)

1.

#include

#include

#include

#defineOK1

#defineERROR0

#defineTRUE1

#defineFALSE0

#defineElemTypeint

#defineMAXSIZE100/*此处的宏定义常量表示线性表可能达到的最大长度*/

typedefstruct

{ElemTypeelem[MAXSIZE];/*线性表占用的数组空间*/

intlast;/*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1*/

}SeqList;

#include"common.h"

#include"seqlist.h"

voidpx(SeqList*A,intj);

voidmain()

{SeqList*l;

intp,q,r;

inti;

l=(SeqList*)malloc(sizeof(SeqList));

printf("请输入线性表的长度:

");

scanf("%d",&r);

l->last=r-1;

printf("请输入线性表的各元素值:

\n");

for(i=0;i<=l->last;i++)

{

scanf("%d",&l->elem[i]);

}

px(l,i);

printf("请输入要插入的值:

\n");

scanf("%d",&l->elem[i]);

i++;

px(l,i);

l->last++;

for(i=0;i<=l->last;i++)

{printf("%d",l->elem[i]);

}

printf("\n");

}

voidpx(SeqList*A,intj)

{inti,temp,k;

for(i=0;i

{for(k=0;k

{if(A->elem[i]elem[k])

{temp=A->elem[i];

A->elem[i]=A->elem[k];

A->elem[k]=temp;

}}

}

}

2.

#include

#include

#include

#defineOK1

#defineERROR0

#defineTRUE1

#defineFALSE0

#defineElemTypeint

#defineMAXSIZE100/*此处的宏定义常量表示线性表可能达到的最大长度*/

typedefstruct

{ElemTypeelem[MAXSIZE];/*线性表占用的数组空间*/

intlast;/*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1*/

}SeqList;

#include"common.h"

#include"seqlist.h"

voidpx(SeqList*A,intj);

intDelList(SeqList*L,inti,SeqList*e,intj)

/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。

i的合法取值为1≤i≤L.last+1*/

{intk,a,b,c;

if((i<1)||(i>L->last+2))

{printf("删除位置不合法!

");

return(ERROR);

}

if(j>L->last-i)

{printf("删除位置不合法!

");

return(ERROR);

}

for(b=0,a=i-1;a

{e->elem[b]=L->elem[a];}

e->last=b;/*将删除的元素存放到e所指向的变量中*/

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

{L->elem[k-1]=L->elem[k+j-1];}/*将后面的元素依次前移*/

L->last=L->last-j;

printf("删除的元素值为:

");

for(c=0;c

{printf("%d",e->elem[c]);}

printf("\n");

return(OK);

}

voidmain()

{SeqList*l,*q;

intp,r;

inti,j,m;

l=(SeqList*)malloc(sizeof(SeqList));

q=(SeqList*)malloc(sizeof(SeqList));

printf("请输入线性表的长度:

");

scanf("%d",&r);

l->last=r-1;

printf("请输入线性表的各元素值:

\n");

for(i=0;i<=l->last;i++)

{scanf("%d",&l->elem[i]);

}

px(l,i);

for(i=0;i<=r-1;i++)

{printf("%d",l->elem[i]);}

printf("\n");

printf("请输入要删除的元素位置(位置+个数):

\n");

scanf("%d%d",&p,&j);

m=DelList(l,p,q,j);

if(m==0)

{printf("无法删除");

exit(0);}

elseif(m==1)

{printf("线性表内余下元素为:

\n");

for(i=0;i<=r-j-1;i++)

{printf("%d",l->elem[i]);}

printf("\n");}

}

voidpx(SeqList*A,intj)

{inti,temp,k;

for(i=0;i

{for(k=0;k

{if(A->elem[i]elem[k])

{temp=A->elem[i];

A->elem[i]=A->elem[k];

A->elem[k]=temp;

}}

}

printf("排序完成!

");

}

3.#include

#include

#include

/*#defineElemTypechar*/

typedefstructNode/*结点类型定义*/

{intnum;

charname[10];

intage;

structNode*next;

}Node,*LinkList;/*LinkList为结构指针类型*/

LinkListCreateFromTail()

/*通过键盘输入表中元素值,利用尾插法建单链表,并返回该单链表头指针L*/

{LinkListL;

Node*r,*s;

inta;

charb[10];

intc;

intflag=1;/*设置一个标志,初值为1,当输入"-1"时,flag为0,建表结束*/

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

L->next=NULL;/*为头结点分配存储空间,建立空的单链表L*/

r=L;/*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/

/*循环输入表中元素值,将建立新结点s插入表尾*/

printf("输入学生的信息:

\n");

printf("学号姓名年龄\n");

while(flag)

{scanf("%d",&a);

if(a==-1)

flag=0;

else

{scanf("%s%d",b,&c);

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

s->num=a;

strcpy(s->name,b);

s->age=c;

r->next=s;

r=s;

}

}r->next=NULL;

returnL;

}

voidReverseList(LinkListL)

{Node*p,*q;

p=L->next;

L->next=NULL;

while(p!

=NULL)

{q=p->next;/*q指针保留p->next得值*/

p->next=L->next;

L->next=p;/*将p结点头插入到单链表L中*/

p=q;/*p指向下一个要插入的结点*/

}

}

voidmain()

{LinkListl;

Node*p;

printf("请输入链表数据,以-1结束!

\n");

l=CreateFromTail();

printf("输入的单链表为:

\n");

p=l->next;

while(p!

=NULL)

{printf("%d%s%d\n",p->num,p->name,p->age);

p=p->next;

}

ReverseList(l);

printf("逆置后的单链表为:

\n");

p=l->next;

while(p!

=NULL)

{printf("%d%s%d\n",p->num,p->name,p->age);

p=p->next;

}

}

1.实验结果:

实验分析:

我做了三次实验,分别插入数列前,中,后的数字,实验证明代码没有错误,能正常运行、排序、输出。

存在的问题:

我不明白为什么我写的是降序排序,计算机运行后就是升序排序了。

希望老师能帮我修改一下。

2.实验结果

实验分析:

我通过三次实验(正常删除、删除个数超出、删除位置不正确)证明代码的正确性。

改代码可实现派讯,删除,读取删除的内容和输出的功能。

4.实验结果

实验分析:

我做了两次测试,测试证明代码没有错误。

教师签名:

年月日

实验序号

2

实验名称

实验二栈和队列基本操作

实验地点

S-C1303

实验日期

2013年05月13日

1.利用栈的运算实现数制转换—--分别将十进制转换为八进制和十六进制。

2.编程判断一个字符序列是否是回文序列。

输入形式为“*****#*****”,*为输入的字符,#为两序列的分隔符。

3.实现链队列管理---输入一个整数,如果是奇数就入队,如果是偶数就让队头出队,直到输入0就结束,最后输出队列的所有元素。

(代码)

1.

#include

#include

#include

#defineNULL0

typedefstructNumber

{intnum;

structNumber*next;

}Num;

voidConversion(intiNum,inti);//转换数字,进栈,iNum为待转换的数,i代表进制

voidPop(structNumber*top,inti);//显示结果,出栈,top为栈顶指针,i代表进制

voidmain()

{intm=8,n=2,j=16;

intiNum;

charchoose,c;

printf("数制转换\n\n");

printf("请输入一个十进制数:

");

scanf("%d",&iNum);

printf("转换后结果为:

\n");

printf("\n八进制:

");

Conversion(iNum,m);

printf("十六进制:

");

Conversion(iNum,j);

printf("\n转换完毕!

\n");

}

voidConversion(intiNum,inti)//进栈

{structNumber*top=NULL,*NewP;

while(iNum!

=0)

{

NewP=(structNumber*)malloc(sizeof(structNumber));

if(top==NULL)

{NewP->next=NULL;

top=NewP;

top->num=iNum%i;}

else

{NewP->next=top;

top=NewP;

top->num=iNum%i;

}

iNum=iNum/i;

}//while

Pop(top,i);

printf("\n");

}

voidPop(structNumber*top,inti)//出栈

{if(top==NULL)

printf("栈空!

\n");

else

{charcell[]="0123456789ABCDEF";

structNumber*temp,*q;

switch(i)

{case8:

//输出八进制

case16:

//输出十六进制

{temp=top;

while(temp!

=NULL)

{printf("%c",cell[temp->num]);

q=temp;temp=temp->next;free(q);}

break;}

}//switch

}//else

}

2.

#include

#include

#include

inthuiWen(constchar*p);

intmain()

{chartest[225];

printf("请输入序列:

\n");

gets(test);

if(huiWen(test))

{printf("是回文!

\n");}

else{printf("不是回文!

\n");}

getch();return0;}

inthuiWen(constchar*p)

{inti=0,n=strlen(p);

while(p[i]==p[n-i-1]&&i

{i++;}

return((i

0:

1);}//若i

3.

#defineTRUE1

#defineFALSE0

#defineMAXSIZE50/*队列的最大长度*/

typedefstruct

{intelement[MAXSIZE];/*队列的元素空间*/

intfront;/*头指针指示器*/

intrear;/*尾指针指示器*/

}SeqQueue;

/*初始化操作*/

voidInitQueue(SeqQueue*Q)

{/*将*Q初始化为一个空的循环队列*/

Q->front=Q->rear=0;

}

/*入队操作*/

intEnterQueue(SeqQueue*Q,intx)

{

/*将元素x入队*/

if((Q->rear+1)%MAXSIZE==Q->front)/*队列已经满了*/

return(FALSE);

Q->element[Q->rear]=x;

Q->rear=(Q->rear+1)%MAXSIZE;/*重新设置队尾指针*/

return(TRUE);/*操作成功*/

}

/*出队操作*/

intDeleteQueue(SeqQueue*Q)

{/*删除队列的队头元素,用x返回其值*/

if(Q->front==Q->rear)/*队列为空*/

return(FALSE);

Q->front=(Q->front+1)%MAXSIZE;/*重新设置队头指针*/

return(TRUE);/*操作成功*/

}

intoutput(SeqQueue*Q)

{intx,i=Q->front;

/*提取队列的队头元素,用x返回其值*/

if(Q->front==Q->rear)/*队列为空*/

return(FALSE);

while(i!

=Q->rear)

{x=Q->element[i];

printf("%d",x);

i++;}

return(TRUE);/*操作成功*/

}

#include"seqqueue1.h"

#include

voidmain()

{intc;

SeqQueueQ;

InitQueue(&Q);

printf("请输入整数:

");

scanf("%d",&c);

while(c!

=0)

{if(c%2==1)

EnterQueue(&Q,c);

else

DeleteQueue(&Q);

printf("请输入整数:

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

}

output(&Q);

}

(每道题的运行结果及分析总结)

1.实验结果:

实验分析:

我测视了两组数据,均正确,证明我的代码没有错误。

该代码可实现将一个十进制数转换为八进制和十六进制的数。

2.实验结果

实验分析:

我做了四次实验有不同长度的回文序列、长度相同的非回文序列和长度不同的非回文序列。

实验正经代码正确。

3.

实验分析:

测试了3组不同的数据,均能满足实验要求,证明代码是正确的。

教师签名:

年月日

实验序号

3

实验名称

实验三二叉树基本操作

实验地点

S-C1303

实验日期

2013年05月27日

1.统计一棵二叉树中每种类型结点数(度为0、1、2的结点数)。

2.分别输入一棵有6个结点和8个结点的二叉树,编程序输出先序、中序和后序的遍历结果。

3.哈夫曼树及哈夫曼编码。

(代码)

1.#include

#include

#include

typedefcharDataType;

intLeafCount,onecount,twocount;

typedefstructNode

{DataTypedata;

structNode*LChild;

structNode*RChild;

}BiTNode,*BiTree;

voidCreateBiTree(BiTree*bt)

{charch;

ch=getchar();

if(ch=='.')*bt=NULL;

else

{*bt=(BiTree)malloc(sizeof(BiTNode));//生成一个新结点

(*bt)->data=ch;

CreateBiTree(&((*bt)->LChild));//生成左子树

CreateBiTree(&((*bt)->RChild));//生成右子树

}

}

voidleaf_a(BiTreeroot)

{if(root!

=NULL)

{leaf_a(root->LChild);

leaf_a(root->RChild);

if(root->LChild==NULL&&root->RChild==NULL)

LeafCount++;

elseif(((root->LChild!

=NULL)&&(root->RChild==NULL))||((root->LChild==NULL)&&(root->RChild!

=NULL)))

onecount++;

elseif((root->LChild!

=NULL)&&(root->RChild!

=NULL))

twocount++;

}

}

#include"head.h"

voidmain()

{BiTreeT;

inttreeleaf;

LeafCount=0;

printf("按扩展先序遍历序列建立二叉树,请输入序列:

\n");

CreateBiTree(&T);

leaf_a(T);

printf("求得的叶子结点数目为:

%d\n",LeafCount);

printf("求得的度为1的结点数目为:

%d\n",onecount);

printf("求得的度为2的结点数目为:

%d\n",twocount);

getch();

}

2.#include

#include

#include

typedefcharDataType;

intLeafCount,onecount,twocount;

typedefstructNode

{DataTypedata;

structNode*LChild;

structNode*RChild;

}BiTNode,*BiTree;

voidCreateBiTree(BiTree*bt)

{charch;

ch=getchar();

if(ch=='.')*bt=NULL;

else

{*bt=(BiTree)malloc(sizeof(BiTNode));//生成一个新结点

(*bt)->data=ch;

CreateBiTre

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

当前位置:首页 > 工程科技 > 能源化工

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

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