民大 计算机软件基础上机实验报告.docx
《民大 计算机软件基础上机实验报告.docx》由会员分享,可在线阅读,更多相关《民大 计算机软件基础上机实验报告.docx(23页珍藏版)》请在冰点文库上搜索。
民大计算机软件基础上机实验报告
年级
12级
班号
1204
学号
专业
自动化
姓名
实验名称
实验一、顺序表的基本操作
实验
类型
设计型
综合型
创新型
实
验
目
的
或
要
求
实验目的:
1.理解线性表顺序存储结构的存储方式及其特点。
2.掌握对顺序表存储结构的描述、基本操作的算法实现。
3.掌握通过简单实验对C语言基础知识进行回顾;为后序的实验做准备。
实验要求:
1.程序采用模块化设计。
(独立的功能要用独立的函数来实现。
)
2.建立相应的功能菜单。
(针对本程序的5个功能建立相应的五个功能菜单,选择相应的功能选项后进入相应的功能操作界面)
实
验
原
理
算
法
流
程
#include
#include
#definemaxsize100
typedefstruct
squence
{
chardata[maxsize];
intlen;
}
squ;
//voiddisp(&word);
voidmenu()/*选择菜单*/
{
printf("本代码实现顺序表的如下几个基本功能,请选择对应的功能选项进行相应操作:
\n");
printf("1.创建顺序表\n");
printf("2.查找字符\n");
printf("3.删除字符\n");
printf("4.插入字符\n");
printf("5.修改字符\n");
printf("6.显示所有字符以及字符数量\n");
printf("0.退出程序\n");
}voidinit(squ*s)/*清空*/
{
s->len=0;
}
voidcreate(squ*s)/*创建表*/
{
charch;
printf("请依次输入顺序表的字符序列,结束请输入'#'\n");
getchar();
while
(1)//循环体结果,在循环中实现中断
{
scanf("%c",&ch);
if(ch=='#')
{
printf("输入结束,请选择操作项\n");
break;
}
elseif(s->len==maxsize)
{
printf("顺序表存储空间已满,不能继续输入。
\n");
break;
}
else
{
s->data[s->len]=ch;//实现字符的存储
s->len++;
}
}
}
voidsearch(squ*s,charc)/*查询*/
{inti,flag=0;
for(i=0;ilen;i++)
{if(s->data[i]==c)
{printf("您查找的字符在链表中的位置为:
%d\n",i);
printf("请重新选择操作项\n");
flag=1;}}
if(flag==0)
printf("顺序表中没有该字符,请重新选择操作项\n");}
voiddel(squ*s,inti)/*删除*/
{intj;
for(j=i;jlen;j++)
{s->data[j]=s->data[j+1];//实现将i位置后的所有字符前移,i+1位置的字符替代i上的字符}
s->len--;//链表长度减1
s->data[s->len]=0;//原链表最后的位置上为空}
voidput(squ*s,inti,charc)/*插入*/
{intj;
if(s->len==maxsize)
printf("顺序表已满,无法插入字符\n");
else
{for(j=s->len+1;j>=i;j--)
{s->data[j]=s->data[j-1];//位置i后的字符后移,把第i个位置空出}
s->data[i]=c;//将字符c存储到i位置
s->len++;}}
voidreplace(squ*s,inti,charc)/*替换*/
{s->data[i-1]=c;}
intshowall(squ*s)
{intj;
printf("运行结果如下:
\n");
printf("顺序表中的数据依次为:
");
for(j=0;jlen;j++)
{printf("%c",s->data[j]);//依次输出字符}
printf("\n");
printf("顺序表长度为:
%d\n",s->len);
printf("请重新选择操作项\n");
return0;}
voidmain()
{squs;
intchoice=0;
intf=0;
init(&s);
menu();
while
(1)
{scanf("%d",&choice);
switch(choice)
{case1:
if(s.len!
=0)
{charc;
printf("顺序表已经初始化,再次初始化将清除原有数据。
是否继续(y/n):
");
getchar();
scanf("%c",&c);
while
(1)
{
if(c=='y')
{
s.len=0;
create(&s);
break;
}
elseif(c=='n')
{
break;
printf("请重新选择操作项\n");
}
}
}
else
{
create(&s);
}
break;
case2:
charc1;
printf("请输入想查询的字符\n");
getchar();
scanf("%c",&c1);
search(&s,c1);
break;
case3:
inti1;
printf("请输入你想删除的字符位置\n");
scanf("%d",&i1);
while(i1>s.len)
{
printf("超出已有的表,请重新输入。
\n");
scanf("%d",&i1);
}
del(&s,i1);
showall(&s);
break;
case4:
inti2;
charc2;
printf("请输入想在哪个位置之前插入字符以及插入的字符,中间以逗号隔开\n");
scanf("%d,%c",&i2,&c2);
while(i2>s.len+1)
{
printf("超出已有的表,请重新输入。
\n");
scanf("%d,%c",&i2,&c2);
}
put(&s,i2,c2);
showall(&s);
break;
case5:
inti3;
charc3;
printf("请输入想替换的位置以及替换的字符,中间以逗号隔开\n");
scanf("%d,%c",&i3,&c3);
while(i3>s.len)
{
printf("超出已有的表,请重新输入\n");
scanf("%d,%c",&i3,&c3);
}
replace(&s,i3,c3);
showall(&s);
break;
case6:
showall(&s);
break;
case0:
exit(0);
default:
printf("输入序号错误,请重新输入!
\n");
}
if(f==1)
break;
}}
实验结果分析及心得体会
成
绩
评
定
教师签名:
2013年月日
年级
12级
班号
1204
学号
专业
自动化
姓名
实验名称
实验二、链表的基本操作
实验
类型
设计型
综合型
创新型
实
验
目
的
或
要
求
实验目的:
1.理解线性表链式存储结构的存储方式及其特点。
2.掌握对链表存储结构的描述、基本操作的算法实现。
3.通过实验掌握对C语言指针的基本应用。
实验要求:
1.创建链表:
根据用户输入的字符依次创建链表(以特定字符‘#’作为输入的结束符,用户每输入一个字符,生成链表的一个结点,并将该结点插入到末尾)。
2.插入:
该操作接收用户输入的插入位置以及插入结点的数据,生成新的结点并将其插入到指定的结点之前。
3.删除:
根据用户指定的删除位置(或删除字符)删除相应结点。
4.查找:
查找链表中是否存在给定值的结点。
5.显示:
依次显示链表中的每个字符。
实
验
原
理
算
法
流
程
#include
#include
#include
#include
#defineCREAT_LIST(PNODE)malloc(sizeof(NODE))
typedefstructNod
{chardat;
structNod*pNext;
}NODE,*PNODE;/*链表结点结构体*/
voidstart_list(void);//菜单
PNODECreate_List(void);//创建链表
voidInsert_Data(PNODEpHead,charc,intn);/*链表中插入字符*/
voidDel_List(PNODEpHead,intn);//删除
intSearch_Data(PNODEpHead,chardat);//查找
voidTraversal_List(PNODEpHead);//显示
intList_Len(PNODEpHead);//求长度
intmain(void)
{PNODEpHead;
inti;
charc;
for(;;)
{start_list();
printf("\n请输入功能序号:
");
fflush(stdin);
scanf("%d",&i);
switch(i){case1:
{fflush(stdin);
pHead=Create_List();
break;}
case2:
{fflush(stdin);
Traversal_List(pHead);
break;}
case3:
{fflush(stdin);
printf("输入需要查找的数据:
");
scanf("%c",&c);
if(i=Search_Data(pHead,c))
printf("\n%c的在第%d位\n",c,i);
else
printf("找不到这个数据!
");
break;}
case4:
{fflush(stdin);
printf("输入需要删除数据的位置:
");
scanf("%d",&i);
Del_List(pHead,i);
break;}
case5:
{printf("请输入要插入的数据位置和数据(位置,数据):
");
scanf("%d,%c",&i,&c);
Insert_Data(pHead,c,i);
break;}
case0:
exit(0);
default:
printf("输入序号错误,请重新输入!
\n");
}
fflush(stdin);
printf("按回车键继续");
getchar();
system("cls");}
return0;}
/****************************************
*函数名:
start_list
*参数:
无
*功能:
用于显示菜单列表
****************************************/
voidstart_list(void)
{printf("\n链表的基本操作:
\n");
printf("\n1.创建一条单链表\n");
printf("\n2.显示链表所有内容\n");
printf("\n3.在链表查询指定数据位置\n");
printf("\n4.删除链表中指定的数据\n");
printf("\n5.在链表表指定位置插入数据\n");
printf("\n0.退出程序\n");}
/****************************************
*函数名:
Create_List
*参数:
无
*功能:
根据用户输入的字符依次创建链表
****************************************/
PNODECreate_List(void)
{chardat;
PNODEpHead=NULL,pNew=NULL,pTail=NULL;
/*防止野指针*/
pHead=CREAT_LIST;
if(pHead==NULL)
printf("内存分配失败;("),exit(0);
/*内存分配是否成功*/
pTail=pHead;
printf("请输入链表内容(以#号结束):
");
while((dat=getche())!
='#')
{pNew=CREAT_LIST;
if(pNew==NULL)
printf("error;("),exit(0);
pTail->pNext=pNew;
pNew->dat=dat;
pTail=pNew;}
pTail->pNext=NULL;
printf("\n链表创建成功!
\n");
returnpHead;}
/****************************************
*函数名:
List_Len
*参数:
pHead(根结点指针)
*功能:
求出链表长度
****************************************/
intList_Len(PNODEpHead)
{intlen;
for(len=0;pHead->pNext;pHead=pHead->pNext)
len++;
returnlen;}
/****************************************
*函数名:
Insert_Data
*参数:
pHead(根结点指针),c(插入的字符),n(删除的位置)
*功能:
该操作接收用户输入的插入位置以及插入结点的数据
*生成新的结点并将其插入到指定的结点之前。
。
****************************************/
voidInsert_Data(PNODEpHead,charc,intn)
{PNODEpNew=NULL;
inti=List_Len(pHead);
if((n>i)||(n<=0))
{printf("输入位置错误!
\n");
return;
}//输入位置正确性检查
pNew=CREAT_LIST;
if(pNew==NULL)
printf("error;("),exit(0);/*为新结点分配内存并检查是否分配成功*/
pNew->dat=c;//将要插入的数据赋予新结点
for(i=0;i<(n-1);i++)
pHead=pHead->pNext;
pNew->pNext=pHead->pNext;
pHead->pNext=pNew;
/*连接新结点*/
printf("插入完成!
!
");}
/****************************************
*函数名:
Search_Data
*参数:
pHead(根结点指针),dat(查找的字符)
*功能:
查找链表中是否存在给定值的结点。
****************************************/
intSearch_Data(PNODEpHead,chardat)
{inti=0;
while(pHead->pNext)
{pHead=pHead->pNext;
i++;
if(pHead->dat==dat)
returni;
}return0;}
/****************************************
*函数名:
Traversal_List
*参数:
pHead(根结点指针)
*功能:
依次显示链表中的每个字符
****************************************/
voidTraversal_List(PNODEpHead)
{if(pHead==NULL)
return;
while(pHead->pNext)
{pHead=pHead->pNext;
putchar(pHead->dat);
}printf("\n");}
/****************************************
*函数名:
Del_List
*参数:
pHead(根结点指针),n(删除的位置)
*功能:
根据用户指定的删除位置删除相应结点。
****************************************/
voidDel_List(PNODEpHead,intn)
{PNODEpNew=NULL;
inti=List_Len(pHead);
if((n>i)||(n<=0))
{printf("输入位置有误!
\n");
return;
}//检查位置是否正确
for(i=0;i<(n-1);i++)
pHead=pHead->pNext;
pNew=pHead->pNext;
pHead->pNext=pNew->pNext;
/*断开结点*/
free(pNew);//释放结点
printf("删除成功!
");
}
实
验
结
果
分
析
及
心
得
体
会
成
绩
评
定
教师签名:
2013年月日
年级
12级
班号
1204
学号
专业
自动化
姓名
实验名称
实验三、二叉树的基本操作
实验
类型
设计型
综合型
创新型
实
验
目
的
或
要
求
实验目的:
1.理解二叉树存储结构的存储方式及其特点。
2.掌握对二叉树构的描述、基本操作的算法实现。
3.通过实验掌握对C语言指针的基本应用。
实验要求:
1)从键盘输入二叉树的各结点值,按先序递归方式创建二叉树2)分别实现先序、中序、后序递归遍历二叉树3)输出二叉树的高度4)输出二叉树的按层次遍历序列*
5)以菜单方式运行
实
验
原
理
算
法
流
程
#include
#include
#include
#definemaxsize1024
typedefchardatatype;
typedefstructnode
{
datatypedata;
structnode*lchild,*rchild;
}bitree;
bitree*CREATREE()
{
charch;
bitree*Q[maxsize];
intfront,rear;
bitree*root,*s;
root=NULL;
front=1;
rear=0;
printf("请输入二叉树的各结点,@表示虚结点,#表示结束:
\n");
scanf("%c",&ch);
while(ch!
='#')
{
s=NULL;
if(ch!
='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)root=s;
else
{
if(s&&Q[front])
if(rear%2==0)Q[front]->lchild=s;
elseQ[front]->rchild=s;
if(rear%2==1)front++;
}
scanf("%c",&ch);
}
returnroot;
}
voidpreorder(bitree*p)
{if(p!
=NULL)
{
printf("%c",p->data);
preorder(p->lchild);
preorder(p->rchild);
}
return;
}
voidinorder(bitree*p)
{
if(p!
=NULL)
{inorder(p->lchild);
printf("%c",p->data);
inorder(p->rchild);
}
return;
}
voidpostorder(bitree*p)
{
if(p!
=NULL)
{
postorde