1、实验二报告线性表的链式存储 数据结构实验报告 (实验二) 专业:_ _ 班级:_ _ 姓名:_ _ 学号:_ _ 指导老师:_ _ 评分:_ 实验二 线性表的链式存储一、 实验目的1. 掌握线性表的链式存储结构。2. 能熟练地利用链式存储结构实现线性表的基本操作。3. 能熟练地掌握链式存储结构中算法的实现。二、 实验内容1. 分别用头插法和尾插法建立带头结点的单链表。2. 实现单链表上的插入、删除、修改、查找、计数、输出等基本操作。3. 解决约瑟夫问题:假设有n个人按1、2、3、n的顺序围成一圈,现在,从第s个人开始按1、2、3、m的顺序报数,数到m的人出圈,接着从出圈的下一个人开始重复此过程
2、,直到所有人出圈为止。试用循环链表解决这个问题。三、算法描述12:程序中先是以一个LNode结构体类型定义结点的式的存储结构定义数据类型,再建立单链表,声明一个变量LNode和一个指针变量*LinkList。再定义实现单链表基本操作的子函数,包括初始化、求长度、遍历、查找、修改、插入、删除等功能实现的函数,在主函数中调用这些子函数。3. 将n个人按顺序编号排成一列,形成一个单循环链表。程序以模板形 式实现,先定义类CircList,在类外定义相应功能的实现。getData函数实现对应出列编号的返回,再由Josephus函数调用输出,输出后删除该结点,再重新定义一个新结点作为下一个结点,从新定义
3、的结点开始利用循环找到出圈人位置的结点,输出该结点的信息,再在链表中删除该结点,接着从删除的结点的后面重复此步骤,直到链表中剩下一个结点时停止循环,再把链表中的最后一个结点删除。按循环时输出的的顺序输出所有出列的编号。4、程序清单12:#include using namespace std;const int Max=100;typedef struct LNode /定义存储结构 char data; struct LNode *next;LNode,*LinkList;/建立单链表int initlist(LinkList &a) LinkList s; s=new LNode; /if
4、(!s) / return 0; a=s; s-next=NULL; return 0;/输入数据int Indata(LinkList &a) int n; cin n; if(nMax) cout 你输入的长度不正确,请重新输入: ; Indata(a); else cout 请输入链表元素: ; char b; LinkList s,p; p=a; for(int i=1;ib; s=new LNode; s-data=b; s-next=NULL; p-next=s; p=s; return 0;/求链表的长度int length(LinkList a) LinkList p; int
5、 i; p=a; for(i=0;p-next!=NULL;i+) p=p-next; return i;/遍历链表int PrintList(LinkList a) if(length(a)=0) exit(1); LinkList p; for(p=a-next;p-next!=NULL;p=p-next) cout data ; cout data; return 0;/按位查找元素char Get(LinkList a,int i) LinkList p=a; int j; for(j=1;jnext; return p-data;/修改链表元素int Exchange(LinkLis
6、t a,int i,char k) LinkList p=a; int j; for(j=1;jnext; p-data=k; return 0;/在指定位置插入元素int Insert(LinkList &a,int i,char k) LinkList p=a; LinkList s; int j; for(j=1;jnext; s=new LNode; s-data=k; s-next=p-next; p-next=s; return 0;/删除指定位置的元素int Delete(LinkList &a,int i) LinkList s,p=a; int j; for(j=1;jnex
7、t; s=p-next; p-next=p-next-next; delete s; return 0;void main() LinkList s; void menu(); menu(); initlist(s); char b; int i; int h=1; while(h) int k; cin k; switch(k) /多分支选择结构 case 1: /输入数据 cout 输入链表长度: ; Indata(s); cout endl; cout 链表为: ; PrintList(s); menu(); break; case 2: /按位查找元素 cout i; if(ileng
8、th(s) cout i; cout 该位置的元素是: Get(s,i) endl; menu(); break; case 3: /修改链表元素 cout i b; if(ilength(s) cout i; Exchange(s,i,b); cout 修改后的链表: ; PrintList(s); cout endl; menu(); break; case 4: /在指定位置插入元素 cout i b; if(ilength(s) cout i; Insert(s,i,b); cout 插入后的链表: ; PrintList(s); cout endl; cout 新链表总长度: ; c
9、out length(s); menu(); break; case 5: /删除指定位置的元素 cout i; if(ilength(s) cout i; Delete(s,i); cout 删除后的链表: ; PrintList(s); cout endl; cout 新链表总长度: ; cout length(s); menu(); break; default: /结束程序 cout 程序结束,请按任意键退出! endl; exit(1); /菜单函数void menu() cout endl; cout endl; cout -菜单- endl; cout 1.初始化链表 endl;
10、 cout 2.按位查找元素 endl; cout 3.修改指定位置元素 endl; cout 4.在指定位置插入元素 endl; cout 5.删除指定位置的元素 endl; cout 6.退出程序 endl; cout - endl; cout 请选择: ;输出结果:1.初始化链表 2.查找元素 3.修改指定位置元素 4.插入元素 5.删除指定位置的元素 6.结束程序 3:#includeusing namespace std;template class CircList public: CircList ( T value,int k ); /构造函数 CircList (T d=0,
11、CircList *next=NULL):data (d), link (next) /结点构造函数 T getData ( ) const return current-data; /返回当前结点值 void Firster ( ) current = first; /设置当前指针为头指针 void Next ( ) current=current-link; /将当前指针指向当前结点的后继 void Insert ( const T & value ); /插入新结点 void Delete ( ); /删除当前结点 void Josephus(int n,int m); /约瑟夫问题的解
12、决,按顺序输出出列编号private: CircList *first, *current, *last; T data; CircList *link;/循环链表的构造template CircList:CircList ( T value,int k ) first=last=new CircList(value); first-link=first; current=NULL;/插入新结点template void CircList:Insert( const T &value ) if(current=NULL) current=first-link=new CircList(valu
13、e,first); else CircList *newnode=new CircList(value,current-link); if(current-link=first) last=newnode; current-link=newnode; current=current-link; /删除当前结点,进入下一个结点template void CircList:Delete ( ) CircList *p=first ,*q=last; while(p-data!= getData () q=p;p=p-link; current=q-link=p-link; if(p=first)
14、first=current; if(p=last) last=q;/约瑟夫问题的解决,按顺序输出出列编号template void CircList:Josephus(int n,int m) Firster(); cout endl; cout出列的顺序:; cout endl; for(int i=0;in;i+) for(int j=0;jm-1;j+) Next(); if(i!=n) coutgetData() ; Delete(); void main() CircList clist(1,10000); int n,m; coutn; cout endl; coutm; for(int i=2;i=n;i+) clist.Insert(i); clist.Josephus(n,m); cout endl; cout endl;输出结果:4、心得体会 这两个实验,均是对链表实现的应用,主要是对单链表和单循环链表基本操作的运用,实现时特别要注意的是链表存储结构的结点的使用,通过这两个实验的实践操作,我发现结点的运用是相对较难的部分,使用时需要特别小心。通过这两个实验,我对链表的运用有了更深一层的认识,但还是感觉底气足,还需更加努力去学习。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1