1、数据结构上机操作实验报告实验一 单链表的基本操作(必做)一、实验目的1.掌握单链表的存储、初始化、插入、删除等操作的程序实现。2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。二、实验内容1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。2.编写一个程序实现如下功能:让计算机产生出50个09之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。三、实验步骤1.定义一个链表结构体。2.利用插入功能插入一个结点。3.利用
2、删除功能删除一个结点。四、程序运行测试1.利用插入功能插入一个结点。2.利用删除功能删除一个结点。五、实验报告要求1.绘制链表操作实现的流程图。2.详细给出程序运行测试结果(包括测试数据和测试结果)。3.选试验步骤2-3中的任意一个,给出程序的详细注释。4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include #include typedef struct LNodeint data;struct LNode *next;Lnode, *LinkList;/假设下面的单链表均为带头结点。void CreatLinkList(LinkList
3、 &L,int j)/建立一个单链表L,数据为整数,数据由键盘随机输入。LinkList p,q; L=(LinkList )malloc(sizeof(Lnode); L-next=NULL; q=L; cout在单链表内输入整数:endl; for(int i=0;ip-data; p-next=q-next; q-next=p; q=p; int PrintLinkList(LinkList &L)/输出单链表L的数据元素 LinkList p; p=L-next; if(L-next=NULL) cout链表没有元素!endl;return 0;cout单链表的数据元素为:;while
4、(p) coutdatanext;coutnext; while(p) i+; p=p-next; cout单链表的数据元素个数为:iendl;int InsertLinkList(LinkList &L, int i, int x)/在单链表L的第I个元素前插入一个数据元素X。 LinkList p,s; int j=0; p=L; while(p&jnext; +j; if(!p|ji-1) coutdata=x; s-next=p-next; p-next=s; return 1;int DeleteLinkList(LinkList &L,int i)/删除单链表L的第I个数据元素。
5、LinkList p,q; int j=0; p=L; while(p-next&jnext; +j; if(!(p-next)|ji-1)coutnext; p-next=q-next; i=q-data; free(q); return 1;void ClearLinkList(LinkList &L)/将单链表L置为空表。L-next=NULL;void DestroyLinkList(LinkList &L)/销毁单链表L。 LinkList p,q; p=L-next; while(L-next!=NULL) q=p-next; L-next=q; free(p);p=q; free
6、(L); cout链表已经被销毁!endl;void main()/调用上面的各函数,运行并检验程序是否正确。 LinkList L; int i,j,x; cout-endl; cout 单链表实验,按提示操作endl; cout-endl; coutj; CreatLinkList(L,j); LinkListLengh(L); PrintLinkList(L); couti; coutx; InsertLinkList(L,i,x); LinkListLengh(L); PrintLinkList(L); couti; DeleteLinkList(L,i); LinkListLengh
7、(L); PrintLinkList(L); ClearLinkList(L); cout清空链表后:endl; LinkListLengh(L); PrintLinkList(L); DestroyLinkList(L);头文件h文件#include#includetypedef int ElemType; /规定元素类型为整struct LNode /定义单链表结构 ElemType data; LNode *next; /初始化单链表void InitList(LNode *& HL) HL=NULL; /将单链表置空void InsertRear(LNode *&HL,const El
8、emType & item) LNode *newptr;newptr=new LNode; /为保存新元素分配动态结点, newptr指向这个结点。if(newptr=NULL) /若未分配到结点,则停止插入,退出程序运行。 cerrMemory allocation failare!data=item; /把新元素赋给动态结点*newptr的值域 newptr-next=NULL; /给动态结点的指针域置空if(HL=NULL) HL=newptr; /向空表插入的结点为表头结点else LNode *p=HL;while(p-next!=NULL) /从表头开始遍历到最后一个结点为止 p
9、=p-next; p-next=newptr; /把新结点链接到表尾void TraverseList(LNode *&HL) LNode *p=HL; while(p!=NULL) coutdatanext; coutnext; return i;int Delete(LNode *&HL,const ElemType & item)if(HL=NULL) cerrHL is NULL!data=item) break;else /使前驱指针和当前指针均指向下一个结点ap=cp; cp=cp-next; if(cp=NULL) cerrDeleted element is not exist
10、!next;else /由cp指向被删除结点是非表头结点ap-next=cp-next; delete cp; return 1;Cpp文件#include#includetypedef int ElemType; /规定元素类型为整#include link.h /此文件中保存有线性表操作在单链表(由动态独立节点构成)上的实现void main() /构成单链表 LNode *head; InitList(head); int i,j; for(i=0;i50;i+) j=rand()%10; InsertRear(head,j); /输出遍历单链表 TraverseList(head);
11、/从单链表中删除与键盘上输入的值相等的所有结点 coutj; while(Delete(head,j) /输出遍历单链表 TraverseList(head); /输出单链表长度 coutListSize(head)endl;实验二 链表的应用飞机票销售系统(选做)一、实验目的1.掌握单链表的存储。2.掌握单链表的插入、删除、查找等操作的程序实现。3.加深对单链表基本概念,基本理论及相应算法的掌握与理解。二、实验内容编制一个简单的飞机票销售系统,它可以完成售票,退票,飞机票剩余情况查询等功能。每张飞机票包含机次,座位信息。在售票,退票,查询剩余票等环节中都会显示出飞机票的信息。三、实验步骤1.
12、为每张飞机票建立一个结点。2.利用插入功能插入一个结点(买票)。3.利用删除功能删除一个结点(卖票)。4.查找功能查找链表中的结点信息。四、程序运行测试1.利用插入功能插入一个结点(买票)。2.利用删除功能删除一个结点(卖票)。3.查找功能查找链表中的结点信息。五、实验报告要求1.绘制飞机票销售系统实现的流程图。2.详细给出程序运行测试结果(包括测试数据和测试结果)。3.选试验步骤2-4中的任意一个,给出程序的详细注释。4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include #include #include #define null 0
13、#define elemtype inttypedef struct node /*定义个结构*/ char num4; /*机次*/ elemtype seat; /*座位号*/ struct node *next;ticket;ticket *sale,*back; /*sale为售票链表指针,back为备份链表指针*/int count() /*查询飞机票剩余情况模块*/ ticket *q; int n=0; /*机票计数器*/ q=sale; while(q) /*统计机票数*/ n+; q=q-next; return(n);void abort_ticket(elemtype x
14、,char t) /*办理退票模块*/ 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; void sale_ticket() /*购票模
15、块*/ ticket *t; if(sale) t=sale; sale=sale-next; /*从销售链表中删除已售票所在的结点*/ printf(你购买飞机票的车次为:%s,座位号为:%dn,t-num,t-seat); free(t); else printf(飞机票已售完!n);void display() /*输出模块*/ ticket *p; p=sale; if(p=null) printf(飞机票已售完!);else while(p!=null) /*输出所有剩余机票的机次,座位情况*/ printf(%3d,%5s,p-seat,p-num); p=p-next; if(p
16、) printf(,); printf(n); void main() ticket *q,*p; char tl4; int d,i,n,select,flag=1; sale=null; /*销售链表指针初始化*/ back=null; /*备份链表指针初始化*/ printf(请输入飞机座位数:); scanf(%d,&n); for(i=1;inum); printf(请输入机票座位号:); scanf(%d,&d); q-seat=d; q-next=sale; sale=q; p-seat=d; p-next=back; back=p; printf(n); printf(飞机座位
17、情况为:n); display(); printf(n); while(flag) printf(1*查询剩票数n); printf(2*购票n); printf(3*退票n); printf(4*退出 n); printf(请选择您要执行的选项:); scanf(%d,&select); switch(select) case 1:d=count(); printf(n剩余的机票数为:%d,d); printf(n座位剩余情况为:); display(); printf(n); break; case 2: printf(n购买机票:n); sale_ticket(); printf(n);
18、 display(); printf(n); break; case 3: printf(n退票:); printf(请输入退票的机次:); scanf(%s,tl); printf(n请输入退票的座位号:); scanf(%d,&d); abort_ticket(d,tl); display(); printf(n); break; case 4:flag=0; break; 测试实例实验三 栈和队列的基本操作(必做)一、实验目的:1.掌握栈与队列的数据类型描述及特点;2.掌握栈和队列的存储;3.掌握栈的顺序和链式存储存表示与入栈、出栈操作的程序实现;4. 掌握队列的链式存储表示与入队、出队
19、基本操作算法实现二、实验内容1.根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等);2.根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等)。三、实验步骤1.定义一个顺序栈和链栈结构体(队列结构体)。2.利用入栈功能保存数据。3.利用出栈删除弹出栈内信息。4.利用入队功能保存数据。5.利用出队删除队列信息。四、程序运行测试1.入栈功能测试。2.出栈功能测试。3.入队功能测试。4.出队功能测试。五、实验报告要求1.绘制程序实现的流程图。2.详细给出程序运行测试结果(包括测试数据和测试结果)。3.选试验步骤1、2中的任意一个,3、4中的任意一个给
20、出程序的详细注释。4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源程序顺序栈#include#define STACKSIZE 50typedef char DateType;typedef struct DateType sSTACKSIZE; int top;SeqStack;int i;DateType x;void InitSt(SeqStack* st) st-top=0; couttop=STACKSIZE) coutsst-top=x; st-top+;couttop; x=st-si-1; if(st-top=0) couttop-;
21、cout出栈成功!; cout出栈元素为:xtop; if(st-top=0) cout栈为空!; else i-; cout栈顶元素为:si; void showSt(SeqStack *st) if(st-top=0) cout栈为空!; else cout栈中元素为:n; for(i=0;itop;i+) coutsi; void main() int i,j; DateType x; SeqStack st; while(j) coutnnnn; cout*endl; cout* 菜单: *endl; cout*创建顺序栈 入栈 读栈顶元 *endl; cout*出栈 显示链栈元素 退
22、出 *endl; cout*endl; couti; if(i=1) InitSt(&st); else if(i=2) coutx; push(&st,x); else if(i=4) pop(&st); else if(i=3) readTop(&st); else if(i=5) showSt(&st); else if(i=6) j=0; cout程序结束!n; 链栈:#include #include #include typedef char DateType;typedef struct nodeDateType data;struct node* next;LinkStack;LinkStack *top;void InitStack() top=(LinkStack*)malloc(sizeof(LinkStack); top-next=NULL; top-data=0; coutdata=x; s-next=top; top=s; cout入栈成功!;void pop()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1