数据结构上机操作实验报告.docx
- 文档编号:12910867
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:45
- 大小:42.80KB
数据结构上机操作实验报告.docx
《数据结构上机操作实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构上机操作实验报告.docx(45页珍藏版)》请在冰豆网上搜索。
数据结构上机操作实验报告
实验一单链表的基本操作(必做)
一、实验目的
1.掌握单链表的存储、初始化、插入、删除等操作的程序实现。
2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。
3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。
二、实验内容
1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。
2.编写一个程序实现如下功能:
让计算机产生出50个0~9之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。
三、实验步骤
1.定义一个链表结构体。
。
2.利用插入功能插入一个结点。
3.利用删除功能删除一个结点。
四、程序运行测试
1.利用插入功能插入一个结点。
2.利用删除功能删除一个结点。
五、实验报告要求
1.绘制链表操作实现的流程图。
2.详细给出程序运行测试结果(包括测试数据和测试结果)。
3.选试验步骤2-3中的任意一个,给出程序的详细注释。
4.参考程序中某一部分功能的改进(选做)
5.实验心得与体会
6.附录,实验用源程序
六、参考源代码
#include
#include
typedefstructLNode
{intdata;
structLNode*next;
}Lnode,*LinkList;
//假设下面的单链表均为带头结点。
voidCreatLinkList(LinkList&L,intj)
{//建立一个单链表L,数据为整数,数据由键盘随机输入。
LinkListp,q;
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
q=L;
cout<<"在单链表内输入整数:
"< for(inti=0;i cin>>p->data; p->next=q->next; q->next=p; q=p;} intPrintLinkList(LinkList&L) {//输出单链表L的数据元素 LinkListp; p=L->next; if(L->next==NULL) {cout<<"链表没有元素! "< return0;} cout<<"单链表的数据元素为: ";while(p){ cout< p=p->next;}cout< return1;} voidLinkListLengh(LinkList&L) {//计算单链表L的数据元素个数。 inti=0; LinkListp; p=L->next; while(p) {i++; p=p->next;} cout<<"单链表的数据元素个数为: "< } intInsertLinkList(LinkList&L,inti,intx) {//在单链表L的第I个元素前插入一个数据元素X。 LinkListp,s; intj=0; p=L; while(p&&j {p=p->next; ++j;} if(! p||j>i-1){ cout<<"插入元素的位置不合理! "; return0;} s=(LinkList)malloc(sizeof(LNode)); s->data=x; s->next=p->next; p->next=s; return1;} intDeleteLinkList(LinkList&L,inti) {//删除单链表L的第I个数据元素。 LinkListp,q; intj=0; p=L; while(p->next&&j p=p->next; ++j;} if(! (p->next)||j>i-1) {cout<<"删除元素的位置不合理! "; return0; }q=p->next; p->next=q->next; i=q->data; free(q); return1; } voidClearLinkList(LinkList&L) {//将单链表L置为空表。 L->next=NULL; } voidDestroyLinkList(LinkList&L) {//销毁单链表L。 LinkListp,q; p=L->next; while(L->next! =NULL) {q=p->next; L->next=q; free(p);p=q; }free(L); cout<<"链表已经被销毁! "< voidmain() {//调用上面的各函数,运行并检验程序是否正确。 LinkListL; inti,j,x; cout<<"---------------------------------------"< cout<<"《单链表实验,按提示操作》"< cout<<"---------------------------------------"< cout<<"输入的元素的个数: "; cin>>j; CreatLinkList(L,j); LinkListLengh(L); PrintLinkList(L); cout<<"在第几个元素前插入: "; cin>>i; cout<<"输入插入的元素: "; cin>>x; InsertLinkList(L,i,x); LinkListLengh(L); PrintLinkList(L); cout<<"输入删除元素的位置: "; cin>>i; DeleteLinkList(L,i); LinkListLengh(L); PrintLinkList(L); ClearLinkList(L); cout<<"清空链表后: "< LinkListLengh(L); PrintLinkList(L); DestroyLinkList(L); } 头文件h文件 #include #include typedefintElemType;//规定元素类型为整 structLNode//定义单链表结构 { ElemTypedata; LNode*next; };//初始化单链表 voidInitList(LNode*&HL) { HL=NULL;//将单链表置空 } voidInsertRear(LNode*&HL,constElemType&item) { LNode*newptr; newptr=newLNode;//为保存新元素分配动态结点,newptr指向这个结点。 if(newptr==NULL)//若未分配到结点,则停止插入,退出程序运行。 {cerr<<"Memoryallocationfailare! "< exit (1);} newptr->data=item;//把新元素赋给动态结点*newptr的值域 newptr->next=NULL;//给动态结点的指针域置空 if(HL==NULL) HL=newptr;//向空表插入的结点为表头结点 else{ LNode*p=HL; while(p->next! =NULL)//从表头开始遍历到最后一个结点为止 p=p->next; p->next=newptr;//把新结点链接到表尾 }} voidTraverseList(LNode*&HL) {LNode*p=HL; while(p! =NULL) {cout< p=p->next;} cout< }intListSize(LNode*&HL) {LNode*p=HL; inti=0;//用来统计结点的个数 while(p! =NULL)//遍历单链表,统计结点数 {i++; p=p->next;} returni; }intDelete(LNode*&HL,constElemType&item) {if(HL==NULL){ cerr<<"HLisNULL! "< return0;} LNode*ap,*cp; ap=NULL;cp=HL; while(cp! =NULL) if(cp->data==item) break; else//使前驱指针和当前指针均指向下一个结点 {ap=cp; cp=cp->next;} if(cp==NULL){ cerr<<"Deletedelementisnotexist! "< return0; } if(ap==NULL)//由cp指向的被删除结点是表头结点 HL=HL->next; else//由cp指向被删除结点是非表头结点 ap->next=cp->next; deletecp; return1; } Cpp文件 #include #include typedefintElemType;//规定元素类型为整 #include"link.h"//此文件中保存有线性表操作在单链表(由动态独立节点构成)上的实现 voidmain() {//构成单链表 LNode*head; InitList(head); inti,j; for(i=0;i<50;i++) {j=rand()%10; InsertRear(head,j); }//输出遍历单链表 TraverseList(head); //从单链表中删除与键盘上输入的值相等的所有结点 cout<<"输入一个0~10之间的一个整数: "; cin>>j; while(Delete(head,j)){}//输出遍历单链表 TraverseList(head);//输出单链表长度 cout< 实验二链表的应用—飞机票销售系统(选做) 一、实验目的 1.掌握单链表的存储。 2.掌握单链表的插入、删除、查找等操作的程序实现。 3.加深对单链表基本概念,基本理论及相应算法的掌握与理解。 二、实验内容 编制一个简单的飞机票销售系统,它可以完成售票,退票,飞机票剩余情况查询等功能。 每张飞机票包含机次,座位信息。 在售票,退票,查询剩余票等环节中都会显示出飞机票的信息。 三、实验步骤 1.为每张飞机票建立一个结点。 2.利用插入功能插入一个结点(买票)。 3.利用删除功能删除一个结点(卖票)。 4.查找功能查找链表中的结点信息。 四、程序运行测试 1.利用插入功能插入一个结点(买票)。 2.利用删除功能删除一个结点(卖票)。 3.查找功能查找链表中的结点信息。 五、实验报告要求 1.绘制飞机票销售系统实现的流程图。 2.详细给出程序运行测试结果(包括测试数据和测试结果)。 3.选试验步骤2-4中的任意一个,给出程序的详细注释。 4.参考程序中某一部分功能的改进(选做) 5.实验心得与体会 6.附录,实验用源程序 六、参考源代码 #include #include #include #definenull0 #defineelemtypeint typedefstructnode/*定义个结构*/ { charnum[4];/*机次*/ elemtypeseat;/*座位号*/ structnode*next; }ticket; ticket*sale,*back;/*sale为售票链表指针,back为备份链表指针*/ intcount()/*查询飞机票剩余情况模块*/ { ticket*q; intn=0;/*机票计数器*/ q=sale; while(q)/*统计机票数*/ { n++; q=q->next; } return(n); } voidabort_ticket(elemtypex,chart[])/*办理退票模块*/ { ticket*s,*q; q=back;/*q指向备份链表*/ s=(ticket*)malloc(sizeof(ticket));/*需要办理退回的机票*/ s->seat=x; strcpy(s->num,t); while(strcmp(s->num,q->num)&&(s->seat! =q->seat)&&q)/*检查是否为有效票*/ q=q->next; if(! q) printf("对不起! 你所退的不是本次飞机的车票! \n"); else/*为有效票办理退回业务*/ { s->next=sale; sale=s; } } voidsale_ticket()/*购票模块*/ { ticket*t; if(sale) { t=sale; sale=sale->next;/*从销售链表中删除已售票所在的结点*/ printf("你购买飞机票的车次为: %s,座位号为: %d\n",t->num,t->seat); free(t); } else printf("飞机票已售完! \n"); } voiddisplay()/*输出模块*/ { ticket*p; p=sale; if(p==null) printf("飞机票已售完! "); elsewhile(p! =null)/*输出所有剩余机票的机次,座位情况*/ { printf("%3d,%5s",p->seat,p->num); p=p->next; if(p) printf(","); } printf("\n"); } voidmain() { ticket*q,*p; chartl[4]; intd,i,n,select,flag=1; sale=null;/*销售链表指针初始化*/ back=null;/*备份链表指针初始化*/ printf("请输入飞机座位数: "); scanf("%d",&n); for(i=1;i<=n;i++)/*建立所有机票构成的销售链表和备份链表*/ { q=(ticket*)malloc(sizeof(ticket)); p=(ticket*)malloc(sizeof(ticket)); printf("请输入机次: "); scanf("%s",q->num); printf("请输入机票座位号: "); scanf("%d",&d); q->seat=d; q->next=sale; sale=q; p->seat=d; p->next=back; back=p; printf("\n"); } printf("飞机座位情况为: \n"); display(); printf("\n"); while(flag) { printf("1**********查询剩票数\n"); printf("2**********购票\n"); printf("3**********退票\n"); printf("4**********退出\n"); printf("请选择您要执行的选项: "); scanf("%d",&select); switch(select) { case1: {d=count(); printf("\n剩余的机票数为: %d",d); printf("\n座位剩余情况为: "); display(); printf("\n"); } break; case2: {printf("\n购买机票: \n"); sale_ticket(); printf("\n"); display(); printf("\n"); } break; case3: {printf("\n退票: "); printf("请输入退票的机次: "); scanf("%s",tl); printf("\n请输入退票的座位号: "); scanf("%d",&d); abort_ticket(d,tl); display(); printf("\n"); } break; case4: flag=0; break; } } } 测试实例 实验三栈和队列的基本操作(必做) 一、实验目的: 1.掌握栈与队列的数据类型描述及特点; 2.掌握栈和队列的存储; 3.掌握栈的顺序和链式存储存表示与入栈、出栈操作的程序实现; 4.掌握队列的链式存储表示与入队、出队基本操作算法实现 二、实验内容 1.根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等); 2.根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等)。 三、实验步骤 1.定义一个顺序栈和链栈结构体(队列结构体)。 2.利用入栈功能保存数据。 3.利用出栈删除弹出栈内信息。 4.利用入队功能保存数据。 5.利用出队删除队列信息。 四、程序运行测试 1.入栈功能测试。 2.出栈功能测试。 3.入队功能测试。 4.出队功能测试。 五、实验报告要求 1.绘制程序实现的流程图。 2.详细给出程序运行测试结果(包括测试数据和测试结果)。 3.选试验步骤1、2中的任意一个,3、4中的任意一个给出程序的详细注释。 4.参考程序中某一部分功能的改进(选做) 5.实验心得与体会 6.附录,实验用源程序 六、参考源程序 顺序栈 #include #defineSTACKSIZE50 typedefcharDateType; typedefstruct { DateTypes[STACKSIZE]; inttop; }SeqStack; inti; DateTypex; voidInitSt(SeqStack*st) { st->top=0; cout<<"创建成功! "; } voidpush(SeqStack*st,DateTypex) { if(st->top==STACKSIZE) { cout<<"栈已满! "; } else { st->s[st->top]=x; st->top++; cout<<"入栈成功! "; } } voidpop(SeqStack*st) { i=st->top; x=st->s[i-1]; if(st->top==0) { cout<<"栈为空! "; } else { st->top--; cout<<"出栈成功! "; cout<<"出栈元素为: "< } } voidreadTop(SeqStack*st) { i=st->top; if(st->top==0) { cout<<"栈为空! "; } else { i--; cout<<"栈顶元素为: "< } } voidshowSt(SeqStack*st) { if(st->top==0) { cout<<"栈为空! "; } else { cout<<"栈中元素为: \n"; for(i=0;i { cout< } } } voidmain() { inti,j; DateTypex; SeqStackst; while(j) { cout<<"\n\n\n\n"; cout<<"****************************************************************"< cout<<"***菜单: ***"< cout<<"***①创建顺序栈②入栈③读栈顶元***"< cout<<"***④出栈⑤显示链栈元素⑥退出***"< cout<<"****************************************************************"< cout<<"请选择您所希望的操作: "; cin>>i; if(i==1) { InitSt(&st); } elseif(i==2) { cout<<"请输入入栈元素: "; cin>>x; push(&st,x); } elseif(i==4) { pop(&st); } elseif(i==3) { readTop(&st); } elseif(i==5) { showSt(&st); } elseif(i==6) { j=0; cout<<"程序结束! \n"; } } } 链栈: #include #include #include typedefcharDateType; typedefstructnode { DateTypedata; structnode*next; }LinkStack; LinkStack*top; voidInitStack() { top=(LinkStack*)malloc(sizeof(LinkStack)); top->next=NULL; top->data=0; cout<<"初始化链栈成功! "; } voidpush(DateTypex) { LinkStack*s; s=(LinkStack*)malloc(sizeof(LinkStack)); s->data=x; s->next=top; top=s; cout<<"入栈成功! "; } voidpop() {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 上机 操作 实验 报告