扬州大学电子实习实验报告Word格式.docx
《扬州大学电子实习实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《扬州大学电子实习实验报告Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
![扬州大学电子实习实验报告Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/16/9660ad43-b941-4536-9b5b-243b7d24dec3/9660ad43-b941-4536-9b5b-243b7d24dec31.gif)
);
scanf("
%d%d%d"
&
a,&
b,&
c);
if(a>
b)
{t=a,a=b,b=t;
}//交换a,b的值
c)
{t=a,a=c,c=t;
}//交换a,c的值
if(b>
{t=b,b=c,c=t;
}//交换b,c的值
%d,%d,%d\n"
a,b,c);
getch();
}
(2).
{int*p1,*p2,*p3,*p,a,b,c;
p1=&
a;
//把3个整数分别赋给3个指针变量
p2=&
b;
p3=&
c;
if(*p1>
*p2)
{p=p1;
p1=p2;
p2=p;
}//a>
b,交换a和b的值
*p3)
p1=p3;
p3=p;
c,交换a和c的值
if(*p2>
{p=p2;
p2=p3;
}//b>
c,交换b和c的值
a=%d,b=%d,c=%d\n"
//交换前
%d,%d,%d"
*p1,*p2,*p3);
//交换后
调试结果:
(1)输入:
194
输出:
149
(2)输入:
结果分析:
赋地址时,不要求左值原来必须指向某个内存单元。
而赋数据则要求指针必须指向某个内存单元,给其赋值只是填充了该内存单元的内容。
二、
掌握冒泡、选择、插入这三种排序。
输入十个整数,排序后按从小到大在屏幕上打印输出。
(冒泡、选择、插入;
比较这三种算法的优劣)。
1、冒泡法:
#include<
stdio.h>
{ints[10],t,i,j,x;
input10numbers:
\n"
for(t=0;
t<
10;
t++)
%d"
s[t]);
for(i=0;
i<
9;
i++)//外循环控制排序趟数,n个数排n-1趟
for(j=0;
j<
9-i;
j++)//内循环每趟比较的次数
if(s[j]>
s[j+1])
{t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}//相邻两关键字记录若逆序,则交换
theresultis:
\n"
j++)
%-4d"
s[j]);
2、选择
voidsort(inta[],intn)
{inti,j,t,m;
n;
i++)//外循环控制趟数
{t=i;
//假设当前趟的第一个数为最值,记在t中
for(j=i+1;
j++)//从下一个数到最后一个数之间找最值
{if(a[t]>
a[j])//若其后有比最值更大的
{t=j;
}//则将其下标记在t中
}
if(t!
=i)//若t不为最初的i值,说明在其后找到比其更大的数
{m=a[i];
a[i]=a[t];
a[t]=m;
}//则交换最值和当前序列的第一个数
voidmain()
{inta[10],i;
i++)
%3d"
a[i]);
sort(a,10);
i++)
a[i]);
3、插入法:
#include<
{inta[10],i,j,t;
Pleaseinput10numbers:
"
for(i=1;
i++)//外循环控制趟数,n个数从第2个数开始到最后共进行n-1次插入
{t=a[i];
//将待插入数暂存于变量t中
for(j=i-1;
j>
=0&
&
a[j];
j--)//在有序序列中寻找插入位置
a[j+1]=a[j];
//若未找到插入位置,则当前元素后移一个位置
a[j+1]=t;
}/找到插入位置,完成插入/
printf("
arrayis:
for(i=0;
getch();
输入:
1876543290
0123456789
冒泡排序基本思想:
对无序表进行扫描,当发现相邻两个关键字逆序时就进行交换,第一次扫描后就将最大关键字记录沉到底部,而关键字较小的记录则像气泡一样逐渐上浮,然后对剩下的记录再进行扫描,直到某次扫描时不再发生交换,则排序完成。
选择排序基本思想:
每趟是选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。
可进行降序排序或升序排序。
算法分析:
定义外部n-1次循环,假设第一个为最值,放在参数中,在从下一个数以后找最值若后面有比前面假设的最值更大的就放在k中,然后在对k进行分析。
若k部位最初的i值。
也就是假设的i不是最值,那么就交换最值和当前序列的第一个数。
插入排序基本思想:
每趟从无序序列中取出第一个数插入到有序序列的合适位置,元素的最终位置在最后一趟插入后才能确定位置。
也可是先用循环查找插入位置(可从前往后或从后往前),再将插入位置之后的元素(有序列中)逐个后移一个位置,最后完成插入。
该算法的特点是在寻找插入位置的同时完成元素的移动。
因为元素的移动必须从后往前,则可将两个操作结合在一起完成,提高算法效率。
仍可进行升序或降序排序。
冒泡排序:
优点:
稳定,比较次数已知;
缺点:
慢,每次只能移动相邻两个数据,移动数据的次数多。
选择排序:
稳定,比较次数与冒泡排序一样,数据移动次数比冒泡排序少;
缺点:
相对之下还是慢。
插入排序:
稳定,快;
比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
3、
掌握链表的创建和排序。
创建一个包含十个数值的链表(带头节点或不带头节点),按从小到大的顺序排好(可先创建后排序,或边创建边排序),在屏幕上打印输出。
stdlib.h>
typedefstructnode*link;
structnode
{
intid;
linknext;
};
linknew_node(intid,linknext)
linkt=malloc(sizeoft);
t->
id=id;
next=next;
returnt;
linkmyinsert(intid,linkhead)//插入节点函数
linkx,y,t;
t=new_node(id,NULL);
for(x=y=head;
y;
x=y,y=y->
next)
if(y->
id>
=t->
id)
break;
if(y==head)//在首节点位置
{
next=head;
head=t;
else//在中间位置
x->
next=t;
next=y;
returnhead;
voidmyprintf(linkhead)
linkx;
for(x=head;
x;
x=x->
%d\n"
x->
id);
intmain(void)
inta[10]={99,123,33,5,78,132,38,65,400,23};
inti;
linkhead=NULL;
for(i=0;
i<
10;
++i)
head=myinsert(a[i],head);
myprintf(head);
return0;
5233338657899123132400
链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。
链表数据结构至少应包含两个域:
数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系。
相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。
链表的开销主要是访问的顺序性和组织链的空间损失。
四、
掌握链表的算法思想
创建一个包含十个数值的链表(带头节点或不带头节点),按从小到大的次序,与第一流题中的链表归并后,从屏幕输出结果。
单链表的储存结构为:
#include<
#include<
typedefstructList_Node
{intinfo;
structList_Node*next;
//结点的指针域
}node;
//结点结构体
创建链表
node*Creat_Node()
{
node*head,*pre,*p;
intx;
head=(node*)malloc(sizeof(node));
head->
next=NULL;
pre=head;
输入各结点的值,以0结束:
"
while(EOF!
=(scanf("
x))&
x!
=0)
p=(node*)malloc(sizeof(node));
p->
info=x;
next=pre->
next;
pre->
next=p;
pre=pre->
}
returnhead;
}
head=Creat_Node();
//创建链表
Print_Node(head);
//显示链表
Insert_Sort(head);
//直接插入法排序
显示链表的代码:
(2)显示链表的代码:
voidPrint_Node(node*head)