院系:计算机科学学院专业:年级: 2010级课程名称:数据结构学号:姓名:指导教师:2012年 6 月 1日年级 2010班号2班学号专业姓名实验名称2 单链表的相关操作演示实验类型设计型综合型创新型实验目的或要求实验目的:通过上机实践,使学生进一步掌握线性表的逻辑定义、存储结构以及相关应用。
实验要求:自定义存储结构,用C或C++语言编写程序,要求程序模块清晰,菜单界面,有运行结果。
四个题目任选一个写入实验报告。
实验原理(算法流程)1、单链表的相关操作演示:typedef struct LNode{float data;struct LNode *next;}LNode,*LinkList;//链表节点的定义void CreateList_L(LinkList &L,int n){逆序创建一个链表,L为链表的头结点,n为输入的元素的个数}int Length_LinkList(LinkList L){将链表L中的节点个数输出出来(不包括头结点),返回值为输出的节点数;}void InsertList_L(LinkList &L,int i,float e){将e插入链表L中的i号位置;核心算法是:现在链表中找到第i-1号位置,然后将要插入的e插到i-1的后面}void DeleteList_L(LinkList &L,int i,float e){将链表L中的第i号位置的元素e删除;核心算法:从头结点开始往下找,找到第i-1号位置,然后将第i号节点删除,再把后面的节点接上}void DemandList_L(LinkList &L,int i,float e){查询链表L中的第i号位置的元素e;核心算法:找到第i号位置,然后输出出来}void OrderList_L(LinkList &L){将链表L中的数据递增排序;核心算法是:新申请一个头结点,将链表L中的元素进行比较,找到最大的元素所在的节点,将它取出来连接到新的头结点的next指针上,然后再找出次大的,再连接到头结点的next指针上,如此循环,直到链表L的next指向空即完成,然后将新的链表的头设置为L,销毁新的头结点指针}void PrintList_L(LinkList &L) {打印函数,一次将链表L中的内容输出出来}void delLinkList_L(LinkList &L){释放链表L}组内分工无(可选)实验结果分析及心得体会心得体会:首先我觉得要注意的是创建链表的时候要注意将next指针赋值为空;插入、删除、查询函数关键就是位置的查找,找到后执行相应的操作就可以了,当然还要注意些地方,比如删除不能超出链表的长度,插入不能超出插入的范围等等;其他的一些就是细节上的问题,什么时候用引用传旨,什么时候用形参传值都是要注意的。
成绩评教师签名:定2012年月日备注:源代码附后,源代码要求有注释说明#include <iostream.h>#include<stdlib.h>#include<malloc.h>typedef struct LNode{float data;struct LNode *next;}LNode,*LinkList;//链表节点的定义void CreateList_L(LinkList &L,int n){//逆序创建一个链表LinkList p,q;int i;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;q=L;for(i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));cout<<"Please input data:";cin>>p->data;cout<<endl;p->next=q->next;q->next=p;q=p;}}int Length_LinkList(LinkList L){//返回链表的长度的函数int i;LinkList p;p=L;for(i=0;p->next!=NULL;i++)p=p->next;cout<<"Single Length:"<<i<<endl;return i;}void InsertList_L(LinkList &L,int i,float e){//在链表L第i个位置插入元素eLinkList p,s;int j,m;p=L;j=0;m=Length_LinkList(L);if(!L->next){cout<<"Error!Nothing!"<<endl;exit(1);}else//找到位置i-1,在它的后面插入需要插入的元素{if(i>m+1&&i<0)//i要小于链表长度m+1{cout<<"Insert Error!"<<endl;exit(1);}else//找到第i-1个位置,在后面插入一个元素{while(p&&j<i-1)//找到要插入的位置的前一个位置{p=p->next;++j;}if(!p||j>i-1)//判断是否到了链表的末尾{cout<<"Error!"<<endl;exit(1);}s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;}}}void DeleteList_L(LinkList &L,int i,float e){//删除在链表L第i个位置的元素eLinkList p,q;int j,m;p=L;j=0;m=Length_LinkList(L);if(!L->next){cout<<"Error!Nothing!"<<endl;exit(1);}else//找到第i-1个位置,删除后面一个元素{if(i>m&&i<0)//i要小于链表长度m{cout<<"Delete Error!"<<endl;exit(1);}else{while(p&&j<i-1)//找到要删除的位置的前一个位置{p=p->next;++j;}if(!p||j>=i)//当i=0时不可取{cout<<"This elem is not existed!"<<endl;exit(1);}q=p->next;p->next=q->next;cout<<"Elem \""<<q->data<<"\" is removed!"<<endl;delete(q);}}}void DemandList_L(LinkList &L,int i,float e){//查询在链表L第i个位置的元素eLinkList p;int j,m;p=L->next;j=1;m=Length_LinkList(L);if(!L->next){cout<<"Error!Nothing!"<<endl;exit(1);}else{if(i>m&&i<0)//i要小于链表长度m{cout<<"Delete Error!"<<endl;exit(1);}else{while(p&&j<i)//找到需查询的位置i{p=p->next;++j;}if(!p||j>i){cout<<"This elem is not existed!"<<endl;exit(1);}cout<<"第"<<j<<"个数是:"<<p->data<<endl;}}}void OrderList_L(LinkList &L){//递增函数LinkList p,q,I,I1,I2;I=(LinkList)malloc(sizeof(LNode));//重新申请一个头结点II->next=NULL;I1=L;I2=L;p=L->next;q=L->next;if(!L->next){cout<<"Error!Nothing!"<<endl;exit(1);}while(L->next)//找到最大数,将其从链表中取出来放在新的头结点的后面{while(q)//找到最大数{if(p->data>=q->data){I2=q;q=q->next;}else{p=q;I1=I2;I2=q;q=q->next;}}I1->next=p->next;p->next=I->next;I->next=p;I1=L;I2=L;p=L->next;q=L->next;}L->next=I->next;//将新形成的链表给Lfree(I);cout<<"OK!"<<endl;}void PrintList_L(LinkList &L){//将链表中的内容打印出来LinkList p;int i;p=L;if(!L->next){cout<<"Error!Nothing!"<<endl;exit(1);}else{for(i=1;p->next;i++){p=p->next;cout<<"Print "<<i<<" data:"<<p->data<<endl;}}}void delLinkList_L(LinkList &L)//释放内存{LinkList p;p=L;for(;p;p++)free(p);}void menu(LinkList &L){//菜单函数int x,i,n;float e;cout<<"========================"<<endl;cout<<"========================"<<endl;cout<<"||1.Creat Single Link||"<<endl;cout<<"||2.Insert New Elem ||"<<endl;cout<<"||3.Delete Elem ||"<<endl;cout<<"||4.Demand Elem ||"<<endl;cout<<"||5.Order Single Link||"<<endl;cout<<"||6.Print Single Link||"<<endl;cout<<"||7.Print Link Length||"<<endl;cout<<"||8.Exit ||"<<endl;cout<<"========================"<<endl;cout<<"========================"<<endl;cout<<"Please input your choose:";cin>>x;switch(x){case 1:{cout<<"How many nodes that you need:";cin>>n;CreateList_L(L,n);menu(L);break;}case 2:{cout<<"Please input the position and data that you want to insert:"<<endl;cin>>i>>e;InsertList_L(L,i,e);menu(L);break;}case 3:{cout<<"Please input the position and data that you want to delete:"<<endl;cin>>i>>e;DeleteList_L(L,i,e);menu(L);break;}case 4:{cout<<"Please input the position and data that you want to demand:"<<endl;cin>>i>>e;DemandList_L(L,i,e);menu(L);break;}case 5:{OrderList_L(L);menu(L);break;}case 6:{PrintList_L(L);menu(L);break;}case 7:{Length_LinkList(L);menu(L);break;}case 8:{exit(0);}default:{cout<<"Input Error,Please Input Numbers From 1 To 8!"<<endl;exit(1);break;}}}int main(){LinkList L;menu(L);return 1;}年级 2010级班号学号专业软件工程姓名实验名称2表达式求值实验类型设计型综合型创新型实验目的或要求实验目的:通过上机实践,使学生进一步掌握栈这种特殊线性表的逻辑定义、存储结构以及初始化栈、入栈、出栈、栈判空等基本操作的具体实现,使学生能够应用栈的思想解决相关实际问题。