第一篇:广东工业大学数据结构实验报告(12届)
广东工业大学数据结构实验报告(1)
学院:自动化
专业:12级物联网3班
姓名:xxx 学号:xxx 老师:张小波
实验日期:2014年6月21日
实验地点:实二203 成绩评定:
实验题目:求一个正整数的各位数字之和
一、实验目的 求一个正整数的各位数字之和。
二、实验软件环境
1.计算机每人一台。2.软件:Visual Studio 2012
三、实验内容
#include
s+=num%10;
num/=10;} while(num);return(s);} void main(){ int n;printf(“输入一个整数:”);scanf(“%d”,&n);printf(“各位数字之和:%dn”,func(n));printf(“n”);}
四、实验结果和分析
当输入一个整数的时候,得出的是该整数的所有数字的和
五、实验心得体会
本实验过程中,感觉能用简单的方法实现程序就应该用简单的,一开始我用了多个for循环,感觉没必要,就用了do-while循环,因此保持程序的简洁,精悍是最应该的,过于冗杂的程序不仅臃肿,而且难以分析,分享。
广东工业大学数据结构实验报告(2)
学院:自动化
专业:12级物联网3班
姓名:xxx 学号:xxx 老师:张小波
实验日期:2014年6月21日
实验地点:实二203 成绩评定:
实验题目:求两个多项式的相加运算
一、实验目的 熟悉并学会使用多项式的表示方法以及计算方法
二、实验软件环境
1.计算机每人一台。2.软件:Visual Studio 2012
三、实验内容
#include
int exp;
} PolyArray[MAX];typedef struct pnode //定义单链表结点类型 { double coef;
int exp;} PolyNode;void DispPoly(PolyNode *L)//输出多项式 { bool first=true;
PolyNode *p=L->next;while(p!=NULL)//多项式最多项数
//定义存放多项式的数组类型
//系数 //指数
//系数 //指数
struct pnode *next;//first为true表示是第一项
{
} printf(“n”);} void DestroyList(PolyNode *&L)//销毁单链表 { PolyNode *p=L,*q=p->next;while(q!=NULL){
} free(p);} void CreateListR(PolyNode *&L,PolyArray a,int n)//尾插法建表 { PolyNode *s,*r;int i;L=(PolyNode *)malloc(sizeof(PolyNode));//创建头结点
L->next=NULL;r=L;
{
} r->next=NULL;} void Sort(PolyNode *&head){ PolyNode *p=head->next,*q,*r;if(p!=NULL)
if(first)
first=false;printf(“+”);printf(“%g”,p->coef);printf(“%gx”,p->coef);printf(“%gx^%d”,p->coef,p->exp);else if(p->coef>0)if(p->exp==0)else if(p->exp==1)else p=p->next;free(p);p=q;q=p->next;
//r始终指向终端结点,开始时指向头结点
for(i=0;i
//按exp域递减排序
//将*s插入*r之后
//若原单链表中有一个或以上的数据结点
{
} } void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)//求两有序集合的并 { PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;double c;hc=(PolyNode *)malloc(sizeof(PolyNode));tc=hc;while(pa!=NULL && pb!=NULL){
r=p->next;p=r;
//r保存*p结点后继结点的指针
p->next=NULL;while(p!=NULL){
} r=p->next;q=head;//构造只含一个数据结点的有序表
//r保存*p结点后继结点的指针
while(q->next!=NULL && q->next->exp>p->exp)q=q->next;
//在有序表中找插入*p的前驱结点*q p->next=q->next;//将*p插入到*q之后 q->next=p;p=r;
//创建头结点
if(pa->exp>pb->exp){
} else if(pa->exp
exp){
} else {
c=pa->coef+pb->coef;if(c!=0){
s=(PolyNode *)malloc(sizeof(PolyNode));//复制结点 s->exp=pa->exp;s->coef=c;tc->next=s;tc=s;//系数之和不为0时创建新结点 //pa->exp=pb->exp s=(PolyNode *)malloc(sizeof(PolyNode));//复制结点 s->exp=pb->exp;s->coef=pb->coef;tc->next=s;tc=s;pb=pb->next;s=(PolyNode *)malloc(sizeof(PolyNode));//复制结点 s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;
}
} } pa=pa->next;pb=pb->next;if(pb!=NULL)pa=pb;//复制余下的结点
while(pa!=NULL){
} tc->next=NULL;} void main(){ PolyNode *ha,*hb,*hc;PolyArray a={{1.2,0},{2.5,1},{3.2,3},{-2.5,5}};PolyArray b={{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};CreateListR(ha,a,4);CreateListR(hb,b,5);printf(“原多项式A: ”);DispPoly(ha);printf(“原多项式B: ”);DispPoly(hb);Sort(ha);Sort(hb);printf(“有序多项式A: ”);DispPoly(ha);printf(“有序多项式B: ”);DispPoly(hb);Add(ha,hb,hc);printf(“多项式相加: ”);DispPoly(hc);DestroyList(ha);DestroyList(hb);DestroyList(hc);} s=(PolyNode *)malloc(sizeof(PolyNode));//复制结点 s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;
四、实验结果和分析
五、实验心得体会
本实验过程中,我进一步了解了单链表的各种操作以及对应的函数的使用方法,以及学会熟练调用函数来实现,比较深刻地体会到了使用单链表的好处和方便。
广东工业大学数据结构实验报告(3)
学院:自动化
专业:12级物联网3班
姓名:xxx
学号:xxx 老师:张小波
实验日期:2014年6月21日
实验地点:实二203 成绩评定:
实验题目:病人看病模拟程序
一、实验目的掌握顺序栈以及循环队列的使用。
二、实验软件环境
1.计算机每人一台。2.软件:Visual Studio 2012
三、实验内容
#include
{
//链队节点类型
typedef struct
//链队类型
void Destroyqueue(QuType *&qu)//释放链队
//若链队不空
q=p->next;while(q!=NULL)
//释放队中所有的节点
{
free(p);
p=q;
q=q->next;
}
free(p);} free(qu);
//释放链队节点
} void SeeDoctor(){ int sel,flag=1,find,no;QuType *qu;QNode *p;qu=(QuType *)malloc(sizeof(QuType));//创建空队 qu->front=qu->rear=NULL;while(flag==1)
//循环执行
{ printf(“1:排队 2:就诊 3:查看排队 4.不再排队,余下依次就诊 5:下班
scanf(”%d“,&sel);
switch(sel)
{
case 1: printf(” >>输入病历号:“);
do
{
scanf(”%d“,&no);
find=0;
p=qu->front;
while(p!=NULL &&!find)
{
if(p->data==no)
find=1;
else
p=p->next;
}
if(find)
printf(” >>输入的病历号重复,重新输入:“);
} while(find==1);
p=(QNode *)malloc(sizeof(QNode));//创建节点
p->data=no;p->next=NULL;
if(qu->rear==NULL)
//第一个病人排队
qu->front=qu->rear=p;
else
{
qu->rear->next=p;qu->rear=p;//将*p节点入队
}
请选择:”);
break;
//队空 //队不空
{ p=qu->front;printf(“ >>病人%d就诊n”,p->data);if(qu->rear==p)
//只有一个病人排队的情况
qu->front=qu->rear=NULL;printf(“ >>没有排队的病人!n”);
case 2: if(qu->front==NULL)
else
else qu->front=p->next;free(p);break;
//队空 //队不空 printf(“ >>没有排列的病人!n”);
}
case 3:if(qu->front==NULL)
else
{
} break;
p=qu->front;printf(“ >>排队病人:”);while(p!=NULL){
} printf(“n”);printf(“%d ”,p->data);p=p->next;case 4:if(qu->front==NULL)
//队空 //队不空 printf(“ >>没有排列的病人!n”);
else
{
} Destroyqueue(qu);flag=0;break;
//队不空
printf(“ >>请排队的病人明天就医!n”);
//释放链队 //退出 p=qu->front;printf(“ >>病人按以下顺序就诊:”);while(p!=NULL){
} printf(“n”);printf(“%d ”,p->data);p=p->next;
case 5:if(qu->front!=NULL)
} void main(){ SeeDoctor();}
} flag=0;
break;
//退出
//释放链队 Destroyqueue(qu);}
四、实验结果和分析
五、实验心得体会
本实验过程中,要求考虑的情况较多,在循环队列中使用指针的使用过程中对空的这种情况还是欠缺考虑,所以以后在进行循环队列使用中务必要记得考虑对空的情况。
广东工业大学数据结构实验报告(4)
学院:自动化
专业:12级物联网3班
姓名:xxx 学号:xxx
老师:张小波
实验日期:2014年6月21日
实验地点:实二203 成绩评定:
实验题目:文本串加密和解密程序
一、实验目的掌握顺序栈以及循环队列的使用。
二、实验软件环境
1.计算机每人一台。2.软件:Visual Studio 2012
三、实验内容
lgo4-1.cpp #include
} void StrCopy(SqString &s,SqString t){
} bool StrEqual(SqString s,SqString t)
//最多的字符个数
//定义可容纳MaxSize个字符的空间
int length;//标记当前实际串长
int i;s.data[i]=cstr[i];for(i=0;cstr[i]!=' ';i++)s.length=i;
//s为引用型参数
int i;s.data[i]=t.data[i];for(i=0;i { bool same=true; //长度不相等时返回0 int i;if(s.length!=t.length) } int StrLength(SqString s){ return s.length;} SqString Concat(SqString s,SqString t){ SqString str;int i;str.length=s.length+t.length;for(i=0;i } SqString SubStr(SqString s,int i,int j){ SqString str;int k;str.length=0;if(i<=0 || i>s.length || j<0 || i+j-1>s.length) return str; //参数不正确时返回空串 for(k=i-1;k str.length=j;return str;} SqString InsStr(SqString s1,int i,SqString s2){ int j;SqString str;str.length=0;if(i<=0 || i>s1.length+1)//参数不正确时返回空串 return str; //将s1.data[0..i-2]复制到str //将s2.data[0..s2.length-1]复制到str str.data[j]=s1.data[j];for(j=0;j for(j=0;j same=false;for(i=0;i if(s.data[i]!=t.data[i])//有一个对应字符不相同时返回0 { } same=false;break;else return same;str.data[i]=s.data[i];str.data[s.length+i]=t.data[i];for(i=0;i //将s.data[i..i+j]复制到str str.data[k-i+1]=s.data[k]; str.data[i+j-1]=s2.data[j]; //将s1.data[i-1..s1.length-1]复制到str str.data[s2.length+j]=s1.data[j];for(j=i-1;j return str; //将s.data[0..i-2]复制到str str.data[k]=s.data[k];str.data[k-j]=s.data[k];for(k=0;k for(k=i+j-1;k return str; //将s.data[0..i-2]复制到str //将t.data[0..t.length-1]复制到str str.data[k]=s.data[k];str.data[i+k-1]=t.data[k];str.data[t.length+k-j]=s.data[k];for(k=0;k } } int i;for(i=0;i //文件名:exp4-4.cpp #include } q.length=p.length;return q;} SqString UnEncrypt(SqString q){ int i=0,j;SqString p;while(i } p.length=q.length;return p;} void main(){ SqString p,q;int ok=1; //全局串 SqString EnCrypt(SqString p)for(j=0;p.data[i]!=A.data[j];j++);if(j>=p.length) else i++; //在A串中未找到p.data[i]字母 //在A串中找到p.data[i]字母 q.data[i]=p.data[i];q.data[i]=B.data[j]; for(j=0;q.data[i]!=B.data[j];j++);if(j>=q.length) else i++; //在B串中未找到q.data[i]字母 p.data[i]=q.data[i];//在B串中找到q.data[i]字母 p.data[i]=A.data[j]; StrAssign(A,“abcdefghijklmnopqrstuvwxyz”);//建立A串 StrAssign(B,“ngzqtcobmuhelkpdawxfyivrsj”);//建立B串 char str[MaxSize];printf(“n”);printf(“输入原文串:”);gets(str); //获取用户输入的原文串 StrAssign(p,str); //建立p串 printf(“加密解密如下:n”);printf(“ 原文串:”);DispStr(p);q=EnCrypt(p); //p串加密产生q串 //q串解密产生p串 printf(“ 加密串:”);DispStr(q);p=UnEncrypt(q); printf(“n”);} printf(“ 解密串:”);DispStr(p); 四、实验结果和分析 五、实验心得体会 串加密实际上就是对每个字符进行一定的算法,而这个算法只有你自己知道,其他人不知道。通过该算法,我们可以进行加密与解密工作。新技能get。 广东工业大学数据结构实验报告(5) 学院:自动化 专业:12级物联网3班 姓名:xxx 学号:xxx 老师:张小波 实验日期:2014年6月21日 实验地点:实二203 成绩评定: 实验题目:求解n皇后问题 一、实验目的掌握递归应用 二、实验软件环境 1.计算机每人一台。2.软件:Visual Studio 2012 三、实验内容 #include int q[N];//存放各皇后所在的列号 int count=0;//存放解个数 void print(int n)//输出一个解 { count++;int i;printf(“ 第%d个解:”,count);for(i=1;i<=n;i++) } int place(int k,int j){ int i=1;while(i //i=1~k-1是已放置了皇后的行 } return 0;i++;return 1;} void queen(int k,int n){ int j;if(k>n) } void main(){ int n; scanf(“%d”,&n);if(n>20) { } printf(“ %d皇后问题求解如下:n”,n);queen(1,n);printf(“n”);printf(“n值太大,不能求解n”);else //n存放实际皇后个数 printf(“ 皇后问题(n<20)n=”);print(n);for(j=1;j<=n;j++)if(place(k,j)) { q[k]=j;queen(k+1,n);} //所有皇后放置结束 //在第k行上穷举每一个位置 //在第k行上找到一个合适位置(k,j)else //放置1-k的皇后 } 四、实验结果和分析 五、实验心得体会 递归应用能够帮我们解决很多需要重复操作的繁琐的算法问题,运用递归我们可以省下不少的时间,能让我们更有效率的进行其他的工作,因此递归算法是十分重要的。 广东工业大学数据结构实验报告(6) 学院:自动化 专业:12级物联网3班 姓名:xxx 学号:xxx 老师:张小波 实验日期:2014年6月21日 实验地点:实二203 成绩评定: 实验题目:求5X5阶螺旋方阵 一、实验目的掌握矩阵的各种算法 二、实验软件环境 1.计算机每人一台。2.软件:Visual Studio 2012 三、实验内容 #include { m=n/2;m=n/2+1;else for(i=0;i } for(j=i+1;j } } } for(j=n-i-2;j>=i;j--){ } for(j=n-i-2;j>=i+1;j--){ } k++;a[j][i]=k;k++;a[n-i-1][j]=k;void main(){ int n,i,j;int a[MaxLen][MaxLen];printf(“输入n(n<10):”);scanf(“%d”,&n);fun(a,n);printf(“%d阶数字方阵如下:n”,n);for(i=0;i } } for(j=0;j 四、实验结果和分析 五、实验心得体会 矩阵的算法在大一的时候已经学过,我们只需要熟练的运用好循环进行输入就好了。 广东工业大学数据结构实验报告(7) 学院:自动化 专业:12级物联网3班 姓名:xxx 学号:xxx 老师:张小波 实验日期:2014年6月21日 实验地点:实二203 成绩评定: 实验题目:构造哈夫曼树 一、实验目的掌握二叉树的遍历,构造。以及哈夫曼树的相关知识。 二、实验软件环境 1.计算机每人一台。2.软件:Visual Studio 2012 三、实验内容 #include int weight; int parent; int lchild; int rchild;} HTNode;typedef struct { char cd[N]; int start;} HCode;void CreateHT(HTNode ht[],int n){ int i,k,lnode,rnode;//叶子节点数 //树中节点总数 //权重 //双亲节点 //左孩子节点 //右孩子节点 //存放哈夫曼码 int min1,min2;for(i=0;i<2*n-1;i++) { } } void CreateHCode(HTNode ht[],HCode hcd[],int n){ int i,f,c;HCode hc;for(i=0;i { } } void DispHCode(HTNode ht[],HCode hcd[],int n) //所有节点的相关域置初值-1 //构造哈夫曼树 //lnode和rnode为最小权重的两个节点位置 ht[i].parent=ht[i].lchild=ht[i].rchild=-1;for(i=n;i<2*n-1;i++)min1=min2=32767;lnode=rnode=-1;for(k=0;k<=i-1;k++) if(ht[k].parent==-1)//只在尚未构造二叉树的节点中查找 { } if(ht[k].weight } else if(ht[k].weight } hc.start++;hcd[i]=hc;//start指向哈夫曼编码最开始字符 if(ht[f].lchild==c)//处理左孩子节点 hc.cd[hc.start--]='0'; //处理右孩子节点 hc.cd[hc.start--]='1';else c=f;f=ht[f].parent; { int i,k;int sum=0,m=0,j;printf(“输出哈夫曼编码:n”);//输出哈夫曼编码 for(i=0;i } printf(“平均长度=%gn”,1.0*sum/m);} void main(){ int n=15,i;char *str[]={“The”,“of”,“a”,“to”,“and”,“in”,“that”,“he”,“is”,“at”,“on”,“for”,“His”,“are”,“be”};int fnum[]={1192,677,541,518,462,450,242,195,190,181,174,157,138,124,123};HTNode ht[M];HCode hcd[N];for(i=0;i } CreateHT(ht,n);CreateHCode(ht,hcd,n);DispHCode(ht,hcd,n);} strcpy(ht[i].data,str[i]);ht[i].weight=fnum[i];j=0;printf(“ %s:t”,ht[i].data);for(k=hcd[i].start;k<=n;k++){ } m+=ht[i].weight;sum+=ht[i].weight*j;printf(“n”);printf(“%c”,hcd[i].cd[k]);j++; 四、实验结果和分析 五、实验心得体会 哈夫曼树也称最优二叉树,二叉树很多时候确实是一件很有用的东西,也是我们必须掌握的一个算法。 广东工业大学数据结构实验报告(8) 学院:自动化 专业:12级物联网3班 姓名:xxx 学号:xxx 老师:张小波 实验日期:2014年6月21日 实验地点:实二203 成绩评定: 实验题目:实现二分找查的算法 一、实验目的掌握找查的方法。 二、实验软件环境 1.计算机每人一台。2.软件:Visual Studio 2012 三、实验内容 #include //其他数据 //顺序表类型 KeyType key;//KeyType为关键字的数据类型 InfoType data;} NodeType;typedef NodeType SeqList[MAXL];{ int low=0,high=n-1,mid,count=0;while(low<=high){ //定义表中最多记录个数 int BinSearch(SeqList R,int n,KeyType k)//二分查找算法 mid=(low+high)/2;printf(“ 第%d次比较:在[%d,%d]中比较元素R[%d]:%dn”,++count,low,high,mid,R[mid].key);if(R[mid].key==k)//查找成功返回 return mid;if(R[mid].key>k)//继续在R[low..mid-1]中查找 } high=mid-1;low=mid+1;//继续在R[mid+1..high]中查找 else return-1;} void main(){ SeqList R;KeyType k=9;int a[]={1,2,3,4,5,6,7,8,9,10},i,n=10;for(i=0;i R[i].key=a[i]; //建立顺序表 printf(“关键字序列:”);for(i=0;i } printf(“元素%d的位置是%dn”,k,i);printf(“元素%d不在表中n”,k);else 四、实验结果和分析 五、实验心得体会 找查的算法最主要还是弄清楚各指针以及关键字的代码,一个不小心 就很容易弄错了。 AutoCAD实验报告 课 程 工程制图 实验名称 AutoCAD 专业班级 微电子科学与工程(1)班 姓 名 学 号 311300722 指导老师习小英 2013年 12 月 17日 一、实验目的 二、实验内容和要求 三、实验步骤 四、实验心得体会 实验报告 课程: 数字电子技术实验 班级: 12电气信息类创新实验班 学号: 姓名: 实验教师: 刘冰茹 实验时间: 2013.11.20 自动化 学院 实验2号楼214 实验室 注意:实验结束后提交一份实验报告电子文档 电子文档命名为“学号+姓名”,如:E01214058宋思怡 《数据结构》实验报告 (一)学号:姓名:专业年级: 实验名称:线性表 实验日期:2014年4月14日 实验目的: 1、熟悉线性表的定义及其顺序和链式存储结构; 2、熟练掌握线性表在顺序存储结构上实现基本操作的方法; 3、熟练掌握在各种链表结构中实现线性表基本操作的方法; 4、掌握用 C/C++语言调试程序的基本方法。 实验内容: 一、编写程序实现顺序表的各种基本运算,并在此基础上设计一个主程序完成如下功能: (1)初始化顺序表L; (2)依次在L尾部插入元素-1,21,13,24,8; (3)输出顺序表L; (4)输出顺序表L长度; (5)判断顺序表L是否为空; (6)输出顺序表L的第3个元素; (7)输出元素24的位置; (8)在L的第4个元素前插入元素0; (9)输出顺序表L; (10)删除L的第5个元素; (11)输出顺序表L。 源代码 调试分析(给出运行结果界面) 二、编写程序实现单链表的各种基本运算,并在此基础上设计一个主程序完成如下功能: „„„„ „„„„ 小结或讨论: (1)实验中遇到的问题和解决方法 (2)实验中没有解决的问题 (3)体会和提高 南京信息工程大学实验(实习)报告 实验(实习)名称数据结构实验(实习)日期 2011-11-2得分指导教师周素萍 系公共管理系专业信息管理与信息系统年级10级班次1姓名常玲学号2010230700 3实验一顺序表的基本操作及C语言实现 【实验目的】 1、顺序表的基本操作及 C 语言实现 【实验要求】 1、用 C 语言建立自己的线性表结构的程序库,实现顺序表的基本操作。 2、对线性表表示的集合,集合数据由用户从键盘输入(数据类型为整型),建立相应的顺序表,且使得数据按从小到大的顺序存放,将两个集合的并的结果存储在一个新的线性表集合中,并输出。 【实验内容】 1、根据教材定义的顺序表机构,用 C 语言实现顺序表结构的创建、插入、删除、查找等操作; 2、利用上述顺序表操作实现如下程序:建立两个顺序表表示的集合(集合中无重 复的元素),并求这样的两个集合的并。 【实验结果】 [实验数据、结果、遇到的问题及解决] 一. Status InsertOrderList(SqList &va,ElemType x) { } 二. Status DeleteK(SqList &a,int i,int k) {//在非递减的顺序表va中插入元素x并使其仍成为顺序表的算法 int i;if(va.length==va.listsize)return(OVERFLOW);for(i=va.length;i>0,x } //注意i的编号从0开始 int j;if(i<0||i>a.length-1||k<0||k>a.length-i)return INFEASIBLE;for(j=0;j<=k;j++)a.elem[j+i]=a.elem[j+i+k];a.length=a.length-k;return OK; 三.// 将合并逆置后的结果放在C表中,并删除B表 Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C) { LinkList pa,pb,qa,qb;pa=A;pb=B;qa=pa;qb=pb;// 保存pa的前驱指针 // 保存pb的前驱指针 pa=pa->next;pb=pb->next;A->next=NULL;C=A;while(pa&&pb){} while(pa){} qa=pa;pa=pa->next;qa->next=A->next;A->next=qa;if(pa->data data){} else{} qb=pb;pb=pb->next;qb->next=A->next;//将当前最小结点插入A表表头 A->next=qb;qa=pa;pa=pa->next;qa->next=A->next;//将当前最小结点插入A表表头 A->next=qa; } } pb=B;free(pb);return OK;qb=pb;pb=pb->next;qb->next=A->next;A->next=qb; 顺序表就是把线性表的元素存储在数组中,元素之间的关系直接通过相邻元素的位置来表达。 优点:简单,数据元素的提取速度快; 缺点:(1)静态存储,无法预知问题规模的大小,可能空间不足,或浪费存储空间;(2)插入元素和删除元素时间复杂度高——O(n) 求两个集合的并集 该算法是求两个集合s1和s2的并集,并将结果存入s引用参数所表示的集合中带回。首先把s1集合复制到s中,然后把s2中的每个元素依次插入到集合s中,当然重复的元素不应该被插入,最后在s中就得到了s1和s2的并集,也就是在s所对应的实际参数集合中得到并集。第二篇:广东工业大学实验报告
第三篇:广东工业大学实验报告封面
第四篇:数据结构实验报告
第五篇:数据结构实验报告