完整版信管实验报告(线性表基本操作)
1数据结构-实验报告一(线性表的基本操作)
![1数据结构-实验报告一(线性表的基本操作)](https://img.taocdn.com/s3/m/f39986f35022aaea998f0f5d.png)
实验一 线性表的基本操作及其应用一、实验目的1、帮助读者复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现。
4、掌握顺序表的存储结构形式及其描述和基本运算的实现。
5、熟练掌握动态链表结构及有关算法的设计二、实验内容求两个多项式的相加运算[问题描述]用单链表存储一元多项式,并实现两个多项式的相加运算。
[基本要求](1)本程序需要基于线性表的基本操作来实现一元多项式的加法,也可以用数组实现。
;(2)两个多项式都有键盘输入相应的系数和指数[测试数据] 由学生任意指定。
三、源代码#include <stdio.h>#include <malloc.h>#define MAX 20 //多项式最多项数typedef struct //定义存放多项式的数组类型{double coef; //系数int exp; //指数} PolyArray[MAX];typedef struct pnode //定义单链表结点类型{double coef; //系数int exp; //指数struct pnode *next;} PolyNode;void DispPoly(PolyNode *L) //输出多项式{bool first=true; //first为true表示是第一项PolyNode *p=L->next;while (p!=NULL){if (first)first=false;else if (p->coef>0)printf("+");if (p->exp==0)printf("%g",p->coef);else if (p->exp==1)printf("%gx",p->coef);elseprintf("%gx^%d",p->coef,p->exp);p=p->next;}printf("\n");}void DestroyList(PolyNode *&L) //销毁单链表{PolyNode *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p);}void CreateListR(PolyNode *&L,PolyArray a,int n) //尾插法建表{PolyNode *s,*r;int i;L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点L->next=NULL;r=L; //r始终指向终端结点,开始时指向头结点for (i=0;i<n;i++){s=(PolyNode *)malloc(sizeof(PolyNode));//创建新结点s->coef=a[i].coef;s->exp=a[i].exp;r->next=s; //将*s插入*r之后r=s;}r->next=NULL; //终端结点next域置为NULL}void Sort(PolyNode *&head) //按exp域递减排序{PolyNode *p=head->next,*q,*r;if (p!=NULL) //若原单链表中有一个或以上的数据结点{r=p->next; //r保存*p结点后继结点的指针 p->next=NULL; //构造只含一个数据结点的有序表 p=r;while (p!=NULL){r=p->next; //r保存*p结点后继结点的指针 q=head;while (q->next!=NULL && q->next->exp>p->exp)q=q->next; //在有序表中找插入*p的前驱结点*qp->next=q->next; //将*p插入到*q之后q->next=p;p=r;}}}void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc) //求两有序集合的并{PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;double c;hc=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点tc=hc;while (pa!=NULL && pb!=NULL){if (pa->exp>pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}else if (pa->exp<pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pb->exp;s->coef=pb->coef;tc->next=s;tc=s;pb=pb->next;}else //pa->exp=pb->exp{c=pa->coef+pb->coef;if (c!=0) //系数之和不为0时创建新结点{s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=c;tc->next=s;tc=s;}pa=pa->next;pb=pb->next;}}if (pb!=NULL) pa=pb; //复制余下的结点while (pa!=NULL){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点 s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}tc->next=NULL;}void main(){PolyNode *ha,*hb,*hc;PolyArray a={{2.3,0},{-2.8,2},{5.6,3},{-10.9,7},{7.6,10}};PolyArray b={{-1.2,0},{8.6,1},{-13.9,3},{15.5,5},{5.6,9}};CreateListR(ha,a,5);CreateListR(hb,b,5);printf("原多项式A: ");DispPoly(ha);printf("原多项式B: ");DispPoly(hb);Sort(ha);Sort(hb);printf("有序多项式A: ");DispPoly(ha);printf("有序多项式B: ");DispPoly(hb);Add(ha,hb,hc);printf("多项式相加: ");DispPoly(hc);DestroyList(ha);DestroyList(hb);DestroyList(hc);}四、测试结果五、心得体会两个简单的的多项式用相加,编程却需要线性表各种用法显得很复杂。
实验01 线性表的基本操作
![实验01 线性表的基本操作](https://img.taocdn.com/s3/m/e799801e0c22590103029d73.png)
实验01 线性表的基本操作一、实验目的1. 了解线性表的结构特点及有关概念;2. 理解线性表的存储结构;3. 掌握顺序表及单链表的基本操作算法。
二、实验内容1、编写程序实现顺序表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。
在此基础上设计一个主程序完成如下功能:(1)初始化顺序表L;(2)依次在表尾插入a,b,c,d,e五个元素;(3)输出顺序表L;(4)输出顺序表L的长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插入元素f,之后输出顺序表L;(9)删除L的第2个元素,之后输出顺序表L;(10)销毁顺序表L。
2、编写程序实现单链表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。
在此基础上设计一个主程序完成如下功能:(1)初始化单链表L;(2)依次在表尾插入a,b,c,d,e五个元素;(3)输出单链表L;(4)输出单链表L的长度;(5)判断单链表L是否为空;(6)输出单链表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插入元素f,之后输出单链表L;(9)删除L的第2个元素,之后输出单链表L;(10)销毁单链表L。
三、实验要点及说明一.顺序表1.顺序表初始化:(1)为顺序表L动态分配一个预定大小的数组空间,使elem 指向这段空间的基地址。
(2)将表的当前长度设为0.2.顺序表的取值:(1)判断指定的位置序号i值是否合理(1<=i<=L.length),若不合理则返回ERROR.(2)若i值合理,则将i个数据元素L.elem[i]赋给参数e,通过e返回第i个数据元素的传值。
3.顺序表的查找:(1)从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1.(2)若查遍整个顺序表都没要找到,则查找失败,返回0.4.顺序表的插入:(1)判断插入位置i是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回值ERROR.(2)判断顺序表的存储空间是否已满,若满则返回值ERROR(3)将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。
数据结构实验线性表基本操作
![数据结构实验线性表基本操作](https://img.taocdn.com/s3/m/452cbccd81c758f5f71f6724.png)
学《数据结构》课程实验报告实验名称:线性表基本操作的实现实验室(中心):学生信息:专业班级:指导教师:实验完成时间: 2016实验一线性表基本操作的实现一、实验目的1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。
2.掌握线性表的顺序存储结构的定义及C语言实现。
3.掌握线性表的链式存储结构——单链表的定义及C语言实现。
4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。
5.掌握线性表在链式存储结构——单链表中的各种基本操作。
二、实验内容及要求1.顺序线性表的建立、插入、删除及合并。
2.链式线性表的建立、插入、删除及连接。
三、实验设备及软件计算机、Microsoft Visual C++ 6.0软件四、设计方案(算法设计)㈠采用的数据结构本程序顺序表的数据逻辑结构为线性结构,存储结构为顺序存储;链表的数据逻辑结构依然为线性结构,存储结构为链式结构。
㈡设计的主要思路1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度,顺序表的长度和元素由用户输入;2.利用前面建立的顺序表,对顺序表进行插入、删除及合并操作;3.建立一个带头结点的单链表,结点的值域为整型数据,链表的元素由用户输入;4.对前面建立的链表进行插入、删除及连个链表的连接操作;㈢算法描述1、顺序表void Init(sqlist &);//初始化顺序表BOOL Inse(sqlist &,int,char); //在线性表中插入元素BOOL del(sqlist&,int,char &); //在线性表中删除元素int Loc(sqlist,char); //在线性表中定位元素void print(sqlist); //输出顺序表void combine( sqlist & , sqlist & , sqlist &);//两个线性表的合并2、链表void CreaL(LinkList &,int); //生成一个单链表BOOL LInsert(LinkList &,int,char); //在单链表中插入一个元素BOOL LDele(LinkList &,int,char &); //在单链表中删除一个元素BOOL LFind_key(LinkList,char,int &); //按关键字查找一个元素BOOL LFind_order(LinkList,char &,int); //按序号查找一个元素void LPrint(LinkList); //显示单链表所有元素void LUnion(LinkList &,LinkList &,LinkList &,int); //两个链表的连接五、程序代码1、顺序表#include <stdio.h>#include <conio.h>#define Max 116enum BOOL{False,True};typedef struct{char elem[Max]; //线性表int last; //last指示当前线性表的长度}sqlist;void Init(sqlist &);BOOL Inse(sqlist &,int,char); //在线性表中插入元素BOOL del(sqlist&,int,char &); //在线性表中删除元素int Loc(sqlist,char); //在线性表中定位元素void print(sqlist);void combine( sqlist & , sqlist & , sqlist &);void main(){sqlist L1;sqlist L2;sqlist L3;int loc,S=1;char j,ch;BOOL temp;printf("本程序用来实现顺序结构的线性表。
线性表的基本操作
![线性表的基本操作](https://img.taocdn.com/s3/m/400fef23bcd126fff7050b84.png)
实验一:线性表的基本操作一、实验目的:(1)掌握线性表的基本运算,熟悉对线性表的一些基本操作和具体的函数定义。
(2)掌握顺序存储的概念,学会定义线性表的顺序存储类型。
(3)熟悉C语言程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互联系及各自的作用。
(4)熟悉C语言环境的使用以及多文件程序的输入、编辑、调试和运行的全过程。
(5)加深对顺序存储结构的理解,逐步培养解决实际问题的能力。
二、实验要求:(1)熟练掌握线性表的存储结构及其操作。
(2)理解实训案例的算法,掌握线性表在实际中的运用。
(3)将上机程序全部调试通过。
(4)独立完成一个至两个实训项目,保存程序运行结果,并结合程序进行分析。
三、实验内容:(1)线性表的基本操作。
第一步:定义线性表的存储结构。
第二步:编写线性表的具体函数定义。
第三步:使用定义的线性表并调用线性表的一些操作,实现具体运算。
1)初始化线性表,2)创建一个线性表。
3)在线性表中查找指定的元素。
4)在线性表中插入指定的元素。
5)在线性表中删除指定的元素。
6)输出线性表。
四、源代码:// sqList.h#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define ML 10typedef int ElemT ype;typedef struct sqList{ElemT ype list[ML];int size;int MAXSIZE;//sqList.c#include <stdio.h>#include <stdlib.h>//#include <alloc.h>//#include "sqList.h"sqList *Init_List(sqList *L,int ms){L=(sqList *)malloc(ms*sizeof(sqList));if(!L){printf("Memory allocation failure!\n");exit(OVERFLOW);}elseL->size=0;L->MAXSIZE=ms;return L;}void Disp_List(sqList *L){int i;for(i=0;i<L->size;i++)printf("%d\t",L->list[i]);printf("\n");}int LocateElem_List(sqList *L,ElemT ype x){int i=0;for(i=0;i<=L->size;i++)if(L->list[i]==x)return i;if(i>L->size) return -1;}int Insert_List(sqList *L,ElemT ype x,int mark){int i=1;if(L->size>=L->MAXSIZE)return -1;if(mark>0){for(i=L->size+1;i>=mark;i--)L->list[i+1]=L->list[i];L->list[i]=x;else if(mark<0)L->list[L->size]=x;L->size++;return FALSE;}int Delete_List1(sqList *L,int item){int i,j;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(j=i+1;j<L->size-1;j++)L->list[j]=L->list[j+1];L->size--;return i;}return FALSE;}int Delete_List2(sqList *L,int mark){int i,item;if(mark>0){item=L->list[mark];for(i=mark+1;i<L->size-1;i++)L->list[i]=L->list[i+1];L->size--;return i;}return FALSE;}//sqListmain.c//#include"sqList.c"void main(){int p,n;ElemT ype x=0;sqList a,*b;b=Init_List(&a,ML);printf("listaddr=%p\tsize=%d\tMaxSize=%d\n",b->list,b->size,b->MAXSIZE); while(1)printf("\n请输入元素值,0为结束输入: ");scanf("%d",&x);if(!x)break;printf("请输入插入位置: ");scanf("%d",&p);Insert_List(b,x,p);printf("线性表为: \n");Disp_List(b);}while(1){printf("请输入查找元素值,输入0结束查找操作:");scanf("%d",&x);if(!x) break;n=LocateElem_List(b,x);if(n<0) printf("没找到\n");elseprintf("有符合条件的元素,位置为:%d\n",n+1); }while(1){printf("请输入删除元素值,输入0结束查找操作:");scanf("%d",&x);if(!x)break;n=Delete_List1(b,x);if(n<0)printf("没找到\n");else{printf("删除元素成功,线性表为: ");Disp_List(b);}}while(1){printf("请输入删除元素位置,输入0结束查找操作:"); scanf("%d",&p);if(!p) break;n=Delete_List2(b,p);if(p<0) printf("位置越界\n");else{printf("线性表为: ");Disp_List(b);}}五、测试结果:六、心得体会:通过这次写实验报告,我深切的理解了这门课的本质。
数据结构--实验报告 线性表的基本操作
![数据结构--实验报告 线性表的基本操作](https://img.taocdn.com/s3/m/d8841ab66429647d27284b73f242336c1eb9309d.png)
数据结构..实验报告线性表的基本操作数据结构实验报告线性表的基本操作1.引言本实验报告旨在介绍线性表的基本操作。
线性表是一种常见的数据结构,它是一组有限元素的有序集合,其中每个元素之间存在一个特定的顺序关系。
线性表的操作包括插入、删除、查找等,这些操作对于有效地管理和利用数据非常重要。
2.实验目的本实验的目的是通过实践理解线性表的基本操作,包括初始化、插入、删除、查找等。
通过编写相应的代码,加深对线性表的理解,并掌握相应的编程技巧。
3.实验内容3.1 初始化线性表初始化线性表是指创建一个空的线性表,为后续的操作做准备。
初始化线性表的方法有多种,如顺序表和链表等。
下面以顺序表为例进行说明。
顺序表的初始化包括定义表头指针和设置表的长度等操作。
3.2 插入元素插入元素是指将一个新的元素插入到线性表的指定位置。
插入元素有两种情况:插入到表的开头和插入到表的中间。
插入元素的操作包括移动其他元素的位置以腾出空间,并将新的元素插入到指定位置。
3.3 删除元素删除元素是指将线性表中的某个元素删除。
删除元素有两种情况:删除表的开头元素和删除表的中间元素。
删除元素的操作包括将被删除元素的前一个元素与后一个元素进行连接,断开被删除元素与表的联系。
3.4 查找元素查找元素是指在线性表中寻找指定的元素。
查找元素的方法有多种,如遍历线性表、二分查找等。
查找元素的操作包括比较目标元素与线性表中的元素进行匹配,直到找到目标元素或遍历完整个线性表。
4.实验步骤4.1 初始化线性表根据线性表的类型选择相应的初始化方法,如创建一个空的顺序表并设置表的长度。
4.2 插入元素输入要插入的元素值和插入的位置,判断插入的位置是否合法。
如果合法,移动其他元素的位置以腾出空间,将新的元素插入到指定位置。
如果不合法,输出插入位置非法的提示信息。
4.3 删除元素输入要删除的元素值,判断元素是否在线性表中。
如果在,则找到目标元素的前一个元素和后一个元素,进行连接删除操作。
实验总结报告-线性表
![实验总结报告-线性表](https://img.taocdn.com/s3/m/9669f6000166f5335a8102d276a20029bd6463b1.png)
实验总结报告-线性表第一篇:实验总结报告-线性表实验总结报告—栈和队列学号:姓名:时间:一、目的 1.做实验的目的加深对线性表的理解,学会定义线性表的存储结构,掌握线性表的基本操作。
2.撰写实验报告的目的对本次实验情况进行总结,加强对实验内容的理解,对实验过程有一个系统的认识,从中获得本次试验的经验,并对实验结果进行适当的分析,加深对栈和队列的理解和认识。
二、内容1.说明实验次数及实验内容本次实验用一次实验课时完成实验内容:节点定义:typedef struct node{int idx;int age;struct node *next;}Node,*List;本次实验的对象的存储内容包括ID和AGE,所以定义了如上的结构体,idx用于存储ID 号,age用于存储年龄,next用于形成链式结构,Node定义了该类型的一个节点,List定义了该类型的一个链表。
(1)、编写函数CreateList()和PrintList(),从给定数组创建链表,打印链表。
int idx[8] = {1,2,3,4,5,6,7,8};int age[8] = {15,18,13,22,50,18,30,20};List CreatList(int idx[], int age[],int len){} int PrintList(List L){}(2)、编写函数DeleteNode(List L, int delete_age),完成以下操作。
int DeleteNodeAge(List L, int delete_age){} 该函数传入List L,可以直接修改链表的节点,建议返回值为int 或void类型,无需为List类型,3,4题同上。
2.1删除年龄为18的成员,打印链表。
2.2删除年龄为20的成员,打印链表。
2.3删除年龄为15的成员,打印链表。
2.4(可选)删除年龄为21的成员(因无此成员,报错),打印链表。
数据结构--实验报告 线性表的基本操作
![数据结构--实验报告 线性表的基本操作](https://img.taocdn.com/s3/m/a189a2173069a45177232f60ddccda38366be142.png)
数据结构--实验报告线性表的基本操作数据结构--实验报告线性表的基本操作一、引言本实验报告旨在通过实际操作,掌握线性表的基本操作,包括初始化、插入、删除、查找等。
线性表是最基本的数据结构之一,对于理解和应用其他数据结构具有重要的作用。
二、实验目的1·了解线性表的定义和基本特性。
2·掌握线性表的初始化操作。
3·掌握线性表的插入和删除操作。
4·掌握线性表的查找操作。
5·通过实验巩固和加深对线性表的理解。
三、线性表的基本操作1·初始化线性表线性表的初始化是将一个线性表变量设置为空表的过程。
具体步骤如下:(1)创建一个线性表的数据结构,包括表头指针和数据元素的存储空间。
(2)将表头指针指向一个空的数据元素。
2·插入元素插入元素是向线性表中指定位置插入一个元素的操作。
具体步骤如下:(1)判断线性表是否已满,如果已满则无法插入元素。
(2)判断插入位置是否合法,如果不合法则无法插入元素。
(3)将插入位置及其后面的元素都向后移动一个位置。
(4)将待插入的元素放入插入位置。
3·删除元素删除元素是从线性表中删除指定位置的元素的操作。
具体步骤如下:(1)判断线性表是否为空,如果为空则无法删除元素。
(2)判断删除位置是否合法,如果不合法则无法删除元素。
(3)将删除位置后面的元素都向前移动一个位置。
(4)删除最后一个元素。
4·查找元素查找元素是在线性表中查找指定元素值的操作。
具体步骤如下:(1)从线性表的第一个元素开始,逐个比较每个元素的值,直到找到目标元素或遍历完整个线性表。
(2)如果找到目标元素,则返回该元素的位置。
(3)如果未找到目标元素,则返回找不到的信息。
四、实验步骤1·初始化线性表(1)定义线性表的数据结构,包括表头指针和数据元素的存储空间。
(2)将表头指针指向一个空的数据元素。
2·插入元素(1)判断线性表是否已满。
数据结构--实验报告 线性表的基本操作
![数据结构--实验报告 线性表的基本操作](https://img.taocdn.com/s3/m/19ed412c6fdb6f1aff00bed5b9f3f90f77c64d4c.png)
数据结构--实验报告线性表的基本操作数据结构实验报告[引言]在本次实验中,我们将学习线性表的基本操作,包括插入、删除、查找等。
通过实践操作,加深对线性表的理解和掌握。
[实验目的]1.学习线性表的基本概念和操作。
2.熟悉线性表的插入、删除和查找等基本操作。
3.掌握线性表的实现方式及其相应的算法。
[实验内容]1.线性表的定义与表示1.1 线性表的定义1.2 线性表的顺序存储结构1.3 线性表的链式存储结构2.线性表的基本操作2.1初始化线性表2.2判断线性表是否为空2.3 插入操作2.3.1 在指定位置插入元素2.3.2 在表尾插入元素2.4 删除操作2.4.1 删除指定位置的元素2.4.2 删除指定值的元素2.5 查找操作2.5.1 按位置查找元素2.5.2 按值查找元素2.6 修改操作2.6.1修改指定位置的元素 2.6.2 修改指定值的元素2.7 清空线性表2.8 销毁线性表[实验步骤]1.初始化线性表1.1 创建一个空的线性表对象1.2 初始化线性表的容量和长度2.插入操作2.1在指定位置插入元素2.1.1 检查插入位置的合法性2.1.2 将插入位置后的元素依次后移2.1.3在指定位置插入新元素2.2 在表尾插入元素2.2.1 将表尾指针后移2.2.2 在表尾插入新元素3.删除操作3.1 删除指定位置的元素3.1.1 检查删除位置的合法性3.1.2 将删除位置后的元素依次前移3.1.3 修改线性表的长度3.2 删除指定值的元素3.2.1 查找指定值的元素位置3.2.2调用删除指定位置的元素操作4.查找操作4.1 按位置查找元素4.1.1 检查查找位置的合法性4.1.2 返回指定位置的元素4.2 按值查找元素4.2.1 从头到尾依次查找元素4.2.2 返回第一个匹配到的元素5.修改操作5.1修改指定位置的元素5.1.1 检查修改位置的合法性5.1.2修改指定位置的元素值5.2修改指定值的元素5.2.1 查找指定值的元素位置5.2.2调用修改指定位置的元素操作6.清空线性表6.1 设置线性表长度为07.销毁线性表7.1 释放线性表的内存空间[实验结果]使用线性表进行各种基本操作的测试,并记录操作的结果和运行时间。
数据结构--实验报告 线性表的基本操作
![数据结构--实验报告 线性表的基本操作](https://img.taocdn.com/s3/m/69842e3f17fc700abb68a98271fe910ef12daead.png)
数据结构--实验报告线性表的基本操作线性表的基本操作实验报告1.引言线性表是最基本的数据结构之一,它可以用来存储一系列具有相同数据类型的元素。
本实验旨在通过实践掌握线性表的基本操作,包括插入、删除、查找和修改元素等。
本文档将详细介绍实验所需的步骤和操作方法。
2.实验目的1.掌握线性表的插入和删除操作。
2.理解线性表的查找和修改元素的方法。
3.熟悉线性表的基本操作在算法中的应用。
3.实验环境本实验使用编程语言/软件名称作为开发环境,具体要求如下:________●操作系统:________操作系统名称和版本●编程语言:________编程语言名称和版本4.实验步骤4.1 初始化线性表在程序中创建一个空的线性表,用于存储元素。
实现方法:________具体的初始化方法和代码示例 4.2 插入元素在线性表中指定位置插入一个新元素。
实现方法:________具体的插入元素方法和代码示例 4.3 删除元素删除线性表中指定位置的元素。
实现方法:________具体的删除元素方法和代码示例 4.4 查找元素在线性表中查找指定元素的位置。
实现方法:________具体的查找元素方法和代码示例 4.5 修改元素修改线性表中指定位置的元素值。
实现方法:________具体的修改元素方法和代码示例5.实验结果在完成上述步骤后,我们得到了一个可以进行插入、删除、查找和修改元素的线性表。
具体操作结果如下:________●插入元素操作结果:________插入元素的具体操作结果●删除元素操作结果:________删除元素的具体操作结果●查找元素操作结果:________查找元素的具体操作结果●修改元素操作结果:________修改元素的具体操作结果6.实验总结通过本次实验,我们深入理解了线性表的基本操作,并且掌握了这些操作的实现方法。
线性表在实际应用中十分常见,熟练掌握线性表的操作对于开发高效的算法和数据结构具有重要意义。
线性表实验报告
![线性表实验报告](https://img.taocdn.com/s3/m/2d87976c66ec102de2bd960590c69ec3d4bbdb64.png)
线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。
在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。
线性表有两种存储结构:顺序存储结构和链式存储结构。
顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。
其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。
链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。
其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。
四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。
1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。
实现顺序表的初始化函数,将表的长度初始化为 0。
实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。
实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。
实现顺序表的遍历函数,输出表中的所有元素。
2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。
实现链表的创建函数,创建一个空链表。
实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。
实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
线性表的实验报告
![线性表的实验报告](https://img.taocdn.com/s3/m/cb5331143d1ec5da50e2524de518964bcf84d2ca.png)
线性表的实验报告线性表的实验报告概述:线性表是一种常见的数据结构,它是由一组具有相同数据类型的元素组成的序列。
本次实验旨在通过实际操作线性表,掌握线性表的基本操作以及了解其应用场景。
实验目的:1. 理解线性表的概念和基本操作;2. 掌握线性表的顺序存储结构和链式存储结构;3. 熟悉线性表的常见应用场景。
实验材料:1. 计算机;2. 编程软件(如C、C++、Java等);3. 实验教材或参考资料。
实验步骤:一、线性表的顺序存储结构实验1. 创建一个空的线性表;2. 向线性表中插入若干元素;3. 删除线性表中的某个元素;4. 根据索引查找线性表中的元素;5. 遍历线性表,输出所有元素。
二、线性表的链式存储结构实验1. 创建一个空的链表;2. 向链表中插入若干节点;3. 删除链表中的某个节点;4. 根据节点值查找链表中的节点;5. 遍历链表,输出所有节点。
实验结果:1. 顺序存储结构实验结果:- 成功创建空的线性表;- 成功插入若干元素;- 成功删除某个元素;- 成功根据索引查找元素;- 成功遍历线性表,输出所有元素。
2. 链式存储结构实验结果:- 成功创建空的链表;- 成功插入若干节点;- 成功删除某个节点;- 成功根据节点值查找节点;- 成功遍历链表,输出所有节点。
实验分析:1. 顺序存储结构适用于元素个数固定或变化不大的情况,插入和删除操作需要移动大量元素,效率较低;2. 链式存储结构适用于元素个数不固定的情况,插入和删除操作只需修改指针,效率较高;3. 线性表的应用场景包括但不限于:图书馆图书管理系统中的图书列表、学生信息管理系统中的学生列表等。
实验总结:通过本次实验,我深入了解了线性表的概念、基本操作以及两种常见存储结构。
顺序存储结构适用于元素个数固定的情况,而链式存储结构适用于元素个数不固定的情况。
线性表在实际应用中有着广泛的应用场景,如图书馆管理系统、学生信息管理系统等。
在以后的学习和工作中,我将灵活运用线性表,为解决实际问题提供便利。
实验一线性表操作实验报告
![实验一线性表操作实验报告](https://img.taocdn.com/s3/m/2cf90cbc05a1b0717fd5360cba1aa81144318f09.png)
实验一_线性表操作_实验报告实验一:线性表操作一、实验目的1.理解线性表的基本概念和特点。
2.掌握线性表的基本操作,包括插入、删除、查找等。
3.通过实验,提高动手能力和解决问题的能力。
二、实验原理线性表是一种较为常见的数据结构,它包含零个或多个数据元素,相邻元素之间有前后关系。
线性表具有以下特点:1.元素之间一对一的顺序关系。
2.除第一个元素外,每个元素都有一个直接前驱。
3.除最后一个元素外,每个元素都有一个直接后继。
常见的线性表有数组、链表等。
本实验主要针对链表进行操作。
三、实验步骤1.创建链表:首先创建一个链表,并给链表添加若干个节点。
节点包括数据域和指针域,数据域存储数据,指针域指向下一个节点。
2.插入节点:在链表中插入一个新的节点,可以选择在链表的头部、尾部或中间插入。
3.删除节点:删除链表中的一个指定节点。
4.查找节点:在链表中查找一个指定数据的节点,并返回该节点的位置。
5.遍历链表:从头节点开始,依次访问每个节点的数据。
四、实验结果与分析1.创建链表结果:我们成功地创建了一个链表,每个节点都有数据域和指针域,数据域存储数据,指针域指向下一个节点。
2.插入节点结果:我们成功地在链表的头部、尾部和中间插入了新的节点。
插入操作的时间复杂度为O(1),因为我们只需要修改指针域即可。
3.删除节点结果:我们成功地删除了链表中的一个指定节点。
删除操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要删除的节点。
4.查找节点结果:我们成功地在链表中查找了一个指定数据的节点,并返回了该节点的位置。
查找操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要查找的节点。
5.遍历链表结果:我们成功地遍历了整个链表,并访问了每个节点的数据。
遍历操作的时间复杂度为O(n),因为我们可能需要遍历整个链表。
通过本次实验,我们更加深入地理解了线性表的基本概念和特点,掌握了线性表的基本操作,包括插入、删除、查找等。
数据结构线性表实验报告五篇
![数据结构线性表实验报告五篇](https://img.taocdn.com/s3/m/07a89be85122aaea998fcc22bcd126fff7055d1c.png)
数据结构线性表实验报告五篇第一篇:数据结构线性表实验报告实验报告课程名:数据结构实验名:线性表及其操作姓名:班级:学号:撰写时间:2014.09.24一实验目的与要求1.掌握线性表的实现2.掌握线性表的基本操作的实现二实验内容• 分别完成线性表的顺序表示及链式表示• 在两种表示上, 分别实现一些线性表的操作, 至少应该包括–在第i个位置插入一个元素–删除第i个元素–返回线性表长–返回第i个元素的值三实验结果与分析#include #include //---------线性表链式表示-----------struct V//声明一个结构体类型struct V { int value;struct V * next;//定义结构体变量};void PrintLink(struct V*p)//定义一个结构体指针{ while(p!=NULL)//只要指针指向的变量不为NULL;就会一直循环链表指向下一个结构体{printf(“%d, ”,(*p).value);p=(*p).next;//指针指向下一个结构体} printf(“n”);} void Link(){struct V*head;head=(struct V*)malloc(sizeof(struct V));//开辟一个长度为size的内存(*head).value=-100;//表头为-100(*head).next=NULL;printf(“------------线性表链式表示------------n”);int i,n=10;struct V*p=head;printf(“10个数据:n”);for(i=0;i(*p).next=(struct V*)malloc(sizeof(struct V));p=(*p).next;(*p).value=2*i;(*p).next=NULL;} PrintLink(head);//调用PrintLink函数printf(“删除第四个数据:n”);int k=4;p=head;for(i=1;ip=(*p).next;} struct V*temp=(*p).next;//k表示插入和删除的位置(*p).next=(*temp).next;free(temp);PrintLink(head);printf(“插入第十个数据:n”);k=10;p=head;for(i=1;ip=(*p).next;} temp=(*p).next;(*p).next=(struct V*)malloc(sizeof(struct V));(*(*p).next).value=-99;(*(*p).next).next=temp;PrintLink(head);}//---------线性表顺序表示-----------void seq1(){ int i,n=10,k=4;int a[10];//---------输出数组元素------------printf(“-------------线性表顺序表示---------n”);for(i=0;ia[i]=i;} printf(“数组元素为:n”);for(i=0;iprintf(“%3d”,a[i]);} printf(“n”);//--------插入一个数组元素---------int m=n+1,j=12;//插入元素12 int b[20];for(i=0;i if(i{b[i]=a[i];}else if(i==k){b[i]=j;}else{b[i]=a[i-1];} } printf(“输出插入一个元素的数组:n”);for(i=0;i{if(i{c[i]=a[i];}else{c[i]=a[i+1];} } printf(“输出删除一个元素的数组:n”);for(i=0;i printf(“数组元素为:n”);for(i=1;i<=a[0];i++){a[i]=i;} for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-----在k 位置插入一个元素------------for(i=a[0];i>=k;i--){a[i+1]=a[i];} a[k]=-100;++a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-------在k---------------for(i=0;i>k;i++){a[i]=a[i+1];} a[k]=-1;a[0]=n;--a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);} int main(int argc,char *argv[]){ seq1();seq2();Link();return 0;} 图1:实验结果截图实验分析:已在程序中按规定格式标注。
实验1 线性表的基本操作
![实验1 线性表的基本操作](https://img.taocdn.com/s3/m/5f91090d16fc700abb68fcbe.png)
实验一线性表的基本操作一、实验目的(1)掌握线性表顺序存储和链式存储的方法及基本运算的实现。
(2)掌握将算法在VC++6.0语言环境下实现的过程。
二、实验准备(1)复习线性表的定义,掌握顺序存储、链式存储的方法及操作。
(2)复习C语言中指针与结构体的概念、定义方式。
(3)掌握链表的C语言的实现。
(4)实验的计算机中安装了Microsoft VC++ 6.0。
三、实验内容顺序表1)首先创建一个顺序表:从键盘读入一组整数(长度小于等于20),按输入顺序放入顺序表,输入以-1结束(注意-1不放到顺序表内);将创建好的顺序表元素依次输出到屏幕上。
2)在已创建好的顺序表中插入一个元素:从键盘读入需插入的元素值和插入位置,调用插入函数完成插入操作;然后将顺序表元素依次输出到屏幕上。
3)在已创建好的顺序表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作;然后将顺序表元素依次输出到屏幕上。
算法提示:➢需求分析:1.功能(1)建立一顺序表(2)显示顺序表中每个元素(3)在上述的顺序表中的指定位置插入指定的元素,并输出顺序表中所有数据。
(4)在上述的顺序表中的指定位置删除指定的元素,并输出顺序表中所有数据。
2.输入要求从键盘输入顺序表中所有数据,输入以-1结束(注意-1不放到顺序表内);需插入的数据元素的位置、值;要删除的数据元素的位置(序号)。
3. 测试数据顺序表中所有数据:15,26,58,27,9插入的数据元素的位置、值:1,28;6,28;0,28要删除的数据元素的位置:3➢概要设计:1.数据结构:提示:相关常量和顺序表数据类型定义#define MAXNUM 20#define true 1#define false 0typedef struct{int data[MAXNUM];int length;}list_type;2.模块划分:a)建立顺序表的createlist函数;b)显示输出顺序中每个结点的数据的showlist函数;c)insertlist函数:插入函数。
线性表的基本操作实验报告
![线性表的基本操作实验报告](https://img.taocdn.com/s3/m/d6d3df2eeef9aef8941ea76e58fafab068dc445d.png)
线性表的基本操作实验报告线性表的基本操作1、需求分析:构建一个顺序表并实现顺序表的一些基本操作,例如创建列表,插入、删除元素,求元素的前驱等功能。
(1) 顺序表中数据元素为整形数字,范围属于int型。
(2) 输出部分操作提示以及功能操作所得到的数据(int型)。
(3) 顺序表建立、删除、插入、查询、判空、判满、查询前后驱等功能。
(4) 测试数据:a)b)2、概要设计:用一个结构定义了一个数组,和数组内容的长度。
主程序使用switch语句对将要进行的操作进行选择,调用各个功能函数。
3、实验源代码如下:#include<iostream>using namespace std;typedef struct{int date[100];int length;}SeqList;SeqList L;SeqList SeqListInit()//初始化顺序表 {cout<<"你定义的顺序表的长度(长度小于)"<<endl;cin>>L.length;cout<<"顺序表里面储存数据为"<<endl;for(int i=0;i<L.length;i++){int a;cin>>a;L.date[i]=a;}return L;}void ListClear()/* 清空顺序表*/{L.length=0;}int ListLength()/* 求顺序表长度*/{cout<<L.length<<endl;return 0;}int ListEmpty()/* 检查顺序表是否为空*/ { if(L.length==0)cout<<"为空"<<endl;elsecout<<"不为空"<<endl;return 0;}int ListFull()/*检查顺序表是否为满*/ { if(L.length==100)cout<<"为满"<<endl;elsecout<<"未满"<<endl;return 0;}void ListTraverse()/* 遍历顺序表*/{for(int i=0;i<L.length;i++)cout<<L.date[i]<<" ";cout<<endl;}int ListGet(int i)/* 从顺序表中查找元素*/ { if(i>=0&&i<L.length)cout<<L.date[i-1]<<endl;return 0;}int ListLocate(int x){for(int i=0;i<L.length;i++)if(L.date[i]==x)cout<<L.date[i];return 0;}void ListInsert(int i, int x){if(i>=0&&i<L.length){for(int m=0;i<=L.length-i;m++)L.date[L.length]=L.date[L.length-1];L.date[i-1]=x;L.length++;}}void ListDelete(int i){if(i>=0&&i<L.length){for(i;i<L.length;i++)L.date[i-1]=L.date[i];L.length--;}}int ListPrior(int e){if(e-2>=0&&e-2<L.length)cout<<L.date[e-2]<<endl;return 0;}int ListNext(int e){if(e>=0&&e<L.length)cout<<L.date[e]<<endl; return 0; }int main(){while(1){int i;cout<<"1初始化顺序表"<<endl;cout<<"2清空顺序"<<endl;cout<<"3求顺序表长度"<<endl;cout<<"4检查顺序表是否为空"<<endl;cout<<"5检查顺序表是否为满"<<endl;cout<<"6遍历顺序表"<<endl;cout<<"7从顺序表中查找元素"<<endl;cout<<"8从顺序表中查找与给定元素值相同的元素的位置"<<endl; cout<<"9向顺序表插入元素"<<endl;cout<<"10从顺序表中删除元素"<<endl;cout<<"11求元素前驱"<<endl;cout<<"12求元素后继"<<endl;cin>>i;switch (i){case 1:SeqListInit();break;case 2:ListClear();break;case 3:ListLength();break;case 4:ListEmpty();break;case 5:ListFull();break;case 6:ListTraverse();break;case 7:{int m;cout<<"请输入查找元素的位置"<<endl; cin>>m;ListGet(m);break;}case 8:{int m;cout<<"请输入查找元素"<<endl; cin>>m;ListLocate(m);break;}case 9:{int x;cout<<"请输入插入的元素"<<endl; cin>>x;ListInsert(i,x);break;}case 10:{int m;cout<<"请输入删除的元素"<<endl; cin>>m;ListDelete(m);break;}case 11:{int m;cout<<"请输入元素的位置"<<endl; cin>>m;ListPrior(m);break;}case 12:{int m;cout<<"请输入元素的位置"<<endl; cin>>m;ListNext(m);break;}default:break;}}}4、a) 遇见形参与实参搞混问题,改形参里面的内容并不影响其原本数据。
实验报告二:线性表及其基本操作实验(2学时)
![实验报告二:线性表及其基本操作实验(2学时)](https://img.taocdn.com/s3/m/902da101f12d2af90242e6e6.png)
实验报告实验二线性表及其基本操作实验(2学时)实验目的:(1) 熟练掌握线性表ADT和相关算法描述、基本程序实现结构;(2) 以线性表的基本操作为基础实现相应的程序;(3) 掌握线性表的顺序存储结构和动态存储结构之区分。
实验内容:(类C算法的程序实现,任选其一。
具体要求参见教学实验大纲)(1)一元多项式运算的C语言程序实现(加法必做,其它选做);(2) 有序表的合并;(3)集合的并、交、补运算;(4)约瑟夫问题的求解。
注:存储结构可以选用静态数组、动态数组、静态链表或动态链表之一。
对链表也可以采用循环链表(含单向或双向)。
实验准备:1) 计算机设备;2) 程序调试环境的准备,如TC环境;3)实验内容的算法分析与代码设计与分析准备。
实验步骤:1.录入程序代码并进行调试和算法分析;2.编写实验报告。
实验过程:(一元多项式的加法)【算法描述】定义两个指针qa和qb,分别指向多项式A和多项式B当前进行比较的某个结点,然后比较2个结点中的指数项,则有以下三种结果:1、指针qa所指结点的指数值小于指针qb所指结点的指数值,则应摘取指针qa 所指的结点插入到“和多项式”链表当中去;2、指针qa所指结点的指数值大于指针qb所指结点的指数值,则应摘取指针qb 所指的结点插入到“和多项式”链表当中去;3、指针qa所指结点的指数值等于指针qb所指结点的指数值,则将两个结点的系数相加,若和数不等于零,则修改qa所指结点的系数值,同时释放qb所指结点。
反之,从多项式A的链表删除相应结点,并释放指针qa和qb所指结点。
【源程序】#include <stdlib.h>#include <stdio.h>typedef struct{float coef;int expn;}term;typedef struct LNode{term data;struct LNode *next;}LNode,*LinkList;typedef LinkList polynomial;int cmp(term a,term b){int flag;if (a.expn<b.expn) flag=-1;else if (a.expn==b.expn) flag=0;else flag=1;return flag;}void CreatPoly(polynomial *p,int m){int i;polynomial r,s;term para;(*p)=(LNode *)malloc(sizeof(LNode));r=(*p);for( i=0;i<m;i++){s=(LNode *)malloc(sizeof(LNode));printf("please input coef and expn:\n");scanf("%f %d",¶.coef,¶.expn);s->data.coef=para.coef;s->data.expn=para.expn;r->next=s;r=s;}r->next=NULL;}polynomial AddPoly(polynomial *pa,polynomial *pb) {polynomial newp,p,q,s,r;float sum;p=(*pa)->next;q=(*pb)->next;newp=(LNode *)malloc(sizeof(LNode));r=newp;while(p&&q){switch(cmp(p->data,q->data)){case -1:s=(LNode *)malloc(sizeof(LNode));s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s;r=s;p=p->next;break;case 0:sum=p->data.coef+q->data.coef;if(sum!=0.0){s=(LNode *)malloc(sizeof(LNode));s->data.coef=sum;s->data.expn=q->data.expn;r->next=s;r=s;}p=p->next;q=q->next;break;case 1:s=(LNode *)malloc(sizeof(LNode));s->data.coef=q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;break;}}while(p){s=(LNode *)malloc(sizeof(LNode));s->data.coef=p->data.coef;s->data.expn=p->data.expn;r->next=s;r=s;p=p->next;}while(q){s=(LNode *)malloc(sizeof(LNode));s->data.coef=q->data.coef;s->data.expn=q->data.expn;r->next=s;r=s;q=q->next;}r->next=NULL;return newp;}void Poly(polynomial p){polynomial s;s=p->next;while(s){printf("%.2fx^%d ",s->data.coef,s->data.expn);s=s->next;}printf("\n");}void main(){int m,n;polynomial p,q,newp;clrscr();printf("please input pa's item:\n");scanf("%d",&m);CreatPoly(&p,m);printf("please input pb's item:\n");scanf("%d",&n);CreatPoly(&q,n);Poly(p);Poly(q);printf("the finally answer:");Poly(AddPoly(&p,&q));}【程序结果与分析】分析:在编写过程中,出现了一些问题,如果输入的数过大,最终显示的结果就是一串地址值,后经过该进,就得到上述结果。
线性表的基本操作
![线性表的基本操作](https://img.taocdn.com/s3/m/a33e42a3294ac850ad02de80d4d8d15abe2300aa.png)
实验二线性表的基本操作一、实验目的1.掌握用C++/C语言调试程序的基本方法。
2.掌握线性表的顺序存储和链式存储的基本运算,如插入、删除等.二、实验要求1.C++/C完成算法设计和程序设计并上机调试通过.2.撰写实验报告,提供实验结果和数据。
3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。
三、实验内容:1。
分析并运行以下各子程序的主要功能。
程序1:顺序存储的线性表和运算#include<stdio。
h>#define MAXSIZE 100int list[MAXSIZE];int n;/*insert in a seqlist*/int sq_insert(int list[], int *p_n, int i, int x){int j;if (i〈0 || i>*p_n) return(1);if (*p_n==MAXSIZE) return(2);for (j=*p_n+1; j〉i; j——)list[j]=list[j-1];list[i]=x;(*p_n)++;return(0);}/*delete in a seq list*/int sq_delete(int list[], int *p_n, int i){int j;if (i〈0 || i>=*p_n) return(1);for (j = i+1; j〈=*p_n; j++)list[j-1] = list[j];(*p_n)—-;return(0);}void main(){int i,x,temp;printf(”please input the number for n\n”);printf("n=”);scanf("%d",&n);for (i=0; i<=n; i++){printf(”list[%d]=",i);scanf(”%d",&list[i]);}printf(”The list before insertion is\n”);for (i=0; i<=n; i++) printf(”%d ",list[i]);printf(”\n”);printf(”please input the position where you want to insert a value\nposition=”);scanf(”%d",&i);printf(”please input the value you want to insert。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
管理学院信管专业12(1)班学号3112004734姓名钟臻华协作者:无教师评定_________________实验题目线性表的基本操作实验评分表实验报告一、实验目的与要求1.本实验通过对线性表各种操作的算法设计,理解和掌握线性表的概念、存储结构及操作要求,体会顺序和链式两种存储结构的特点;2.根据操作的不同要求,选择合适的存储结构,设计并实现算法,对算法进行时间复杂度分析,从而达到掌握数据结构的研究方法、算法设计和分析方法的目的。
二、实验内容1.分别用顺序表、单链表、单循环链表实现约瑟夫问题的求解,并分析基于不同存储结构算法的时间复杂度。
如果采用顺序表实现时,每个元素出环并不执行删除操作,而将相应位置元素值设置为空,但计数时必须跳过值为空的元素,实现这种算法,并分析执行效率。
1.顺序表的不删除出环元素算法实现public class Josephus3{public Josephus3(int number,int start,int distance){//创建约瑟夫环并求解,参数指定环长度,起始位置,计数//采用线性顺序表存储约瑟夫环的元素,元素类型是字符串,构造方法参数指定顺序表的容量S eqList<String> list=new SeqList<String>(number);S tring a=new String("null");f or(int i=0;i<number;i++)l ist.append((char)('A'+i)+"");S ystem.out.print("约瑟夫环("+number+","+start+","+distance+"),");S ystem.out.println(list.toString());int i=start+distance-1;for(int j=1;j<list.length();j++){int num=distance;list.set(i,a);while(num!=0){i=(i+1)%list.length();if(!list.get(i).equals("null")){num--;}System.out.println(list.toString());}if(!list.get(j).equals("null"))System.out.println("被赦免者是"+list.get(j).toString());}}public static void main(String[] args) {new Josephus3(5,0,2);}}}运行结果:2.使用单链表实现的算法class Josephus1 {public Josephus1(int number,int start,int distance){//创建约瑟夫环,参数指定环长度,起始位置,计数//采用单链表存储约瑟夫环的元素,元素类型是字符串,构造方法参数指定单链表的容量SinglyLinkedList<String> list=new SinglyLinkedList<String>(number);for(int i=0;i<number;i++){l ist.append((char)('A'+i)+"");//添加字符串对象}System.out.print("约瑟夫环("+number+","+start+","+distance+"),");//输出约瑟夫环的环长度,起始位置,计数System.out.println(list.toString());//输出单链表的描述字符串A,B,C,D,E int i=start;while(list.length()>1){//多于一个对象时的循环i=(i+distance-1)%list.length();//计数按循环规律变化,单链表可以看作是环形结构(循环单链表)System.out.print("删除"+list.remove(i)+",");System.out.println(list.toString());}System.out.println("被赦免者是"+list.get(0).toString());}public static void main(String args[]){n ew Josephus1(5,1,2);}}3.书本例题的约瑟夫环的算法public class Josephus {public Josephus (int number,int start,int distance){SeqList<String> list=new SeqList<String>(number);for(int i=0;i<number;i++)list.append((char)('A'+i)+" ");System.out.print("约瑟夫环("+number+","+start+","+distance+"),");System.out.println(list.toString());int i=start;while(list.length()>1){i=(i+distance-1)%list.length();//循环顺序表System.out.print("删除"+list.remove(i).toString()+",");System.out.println(list.toString());}System.out.println("被赦免者是"+list.get(0).toString());}public static void main(String args[]){new Josephus(5,0,2);}}2.实现教材P74 实验内容(3)的各成员方法。
public class SinglyLinkedList<T> implements LList<T> {//带头结点的单链表类,实现线性表接口public Node<T> head;//头指针,指向单链表的头结点public SinglyLinkedList(int number){//默认构造方法,构造空单链表。
创建头结点,data和next值均为nullthis.head=new Node<T>();}public SinglyLinkedList(T element[], int number){//由指定数组中的多个对象构造单链表,采用尾插入构造单链表this( number);//创建空单链表,只有头结点Node<T> rear=this.head;//rear指向单链表最后一个结点for(int i=0;i<element.length;i++)//若element==null,抛出空对象异常{//element.length==0时,构造空链表rear.next=new Node<T>(element[i],null);//尾插入,创建结点链入rear结点之后rear=rear.next;//rear指向新的链尾结点}}//判断单链表是否为空,O(1)public boolean isEmpty(){return this.head.next==null;}//以下length()、toString()、get()、set() 方法基于单链表遍历算法public int length(){int i=0;Node<T> p=this.head.next;//p从单链表第一结点开始while(p!=null){i++;p=p.next;}return i;}//返回单链表的所有元素的描述字符串,形式为"(,)",覆盖Object类额toString()方法,O(n)public String toString(){String str="(";Node<T> p=this.head.next;//p从单链表的第一结点开始while(p!=null){str+=p.data.toString();if(p.next!=null)str+=",";p=p.next;}return str+")";}public T get(int i)//返回第i(i>=0)个元素,若i指定序号无效,则返回null 返回单链表的第i个元素的算法{if(i>=0){Node<T> p=this.head.next;//p从单链表的第一个结点开始头结点是单链表的第一个结点之前的一个特殊的结点,并非单链表的第一个结点for(int j=0;p!=null&&j<i;j++)p=p.next;if(p!=null)return p.data;//p指向第i个结点}return null;}//设置第i(i>=0)个元素值为x,若i指定序号无效则抛出序号越界异常public void set(int i,T x){if(x==null)return;//不能设置空对象if(i>=0){Node<T> p=this.head.next;//p从单链表的第一个结点开始for(int j=0;p!=null&&j<i;j++)p=p.next;if(p!=null)p.data=x;//p指向第i个结点}else throw new IndexOutOfBoundsException(i+"");//抛出序号越界异常}//以下insert()、append()算法实现单链表插入操作public void insert(int i,T x){//将x对象插入在序号为i结点前,也即插入在序号为i-1结点后,O(n)if(x==null)//不能插入空对象return; //p指向头结点Node<T> p=this.head;//寻找插入位置头结点(i=0)for(int j=0;p.next!=null&&j<i;j++)p=p.next;//循环停止时,p指向第i-1结点或最后一个结点//插入x作为p结点的后继结点,包括头插入(i<=0)、中间/尾插入(i>0)p.next=new Node<T>(x,p.next);}//在单链表的最后添加对象,O(n)public void append(T x){insert(Integer.MAX_V ALUE,x);}//以下remove()、removeAll算法实现单链表的删除操作//删除序号为i的结点,也即删除序号为i-1的后继结点,若操作成功,则返回被被删除的对象,否则返回null,O(n)public T remove(int i){if(i>=0){Node<T> p=this.head;for(int j=0;p.next!=null&&j<i;j++)//定位到待删除结点(i)的前驱结点(i-1) 头结点(i=0)p=p.next;//遍历算法if(p.next!=null){T old=p.next.data;//获得原对象p.next=p.next.next;//删除p的后继结点return old;}}return null;}//删除单链表的所有元素,java将自动收回各结点的所占用的内存空间public void removeAll(){this.head=null;}//查找,返回首次出现的关键字为key的元素,方法实现见8.2.1节public T search(T key){return key;}//查找算法//以下声明对单链表元素进行查找,包含,替换,删除等方法,以查找算法为基础public T search_1(T x){if(x==null)//关键字x不能为空,空则返回nullreturn null;//顺序查找关键字为x的元素,返回首次出现的元素,若查找不成功返回nullNode<T> P=this.head.next;//头结点的下一个结点while(p!=null){if(p.data.equals(x))return p.data;//返回首次出现的元素p=p.next;}return null;}public boolean contain(T x){//判断线性表是否包含关键字为x的元素return this.search(x)!=null;//以查找的结果获得判断结果}//删除单链表中指定元素关键字x的remove()函数声明如下,使用顺序查找算法但未调用查找算法public void remove(T x){//删除首次出现的值为x的结点,若没有找到指定结点则不删除if(this.head.next==null||x==null)//关键字x不能为空,且带有头结点的单链表不能为空return;Node<T> front=this.head,p=front.next;//p指向头结点的下一个结点,front指向头结点while(p!=null&&!p.data.equals(x)){front=p;p=p.next;}if(p!=null)front.next=p.next;//头删除,中间/尾删除中间删除}public void removeAll(T x){}public void replace(T x,T y){if(this.head.next==null||x==null||y==null) return;}public void replaceAll(T x,T y){x=y;}//以下声明按迭代方式遍历单链表的成员方法public Node<T> getFirst(){if(this.head.next==null)return head;//单链表不能为空return this.head.next;}//返回单链表的第一个结点,非头结点public Node<T> getNext(Node<T> p){Node<T> p1=this.head;//p指向头结点while(p1!=null){p1=p1.next;return p1.next;}}public Node<T> getPrevious(Node<T> p){Node<T> p1=this.head;while(p1!=null){p1=p1.next;return p1;}}public Node<T> getLast(){Node<T> p=this.head;while(p!=null){for(intj=0;p.next!=null&&j<Integer.MAX_V ALUE;j++)//定位于最后一个结点之前的前一个结点p=p.next;}return p.next;}//以下声明对单链表的子表进行操作的求子表、包含、插入、删除、替换等方法public SinglyLinkedList<T> sub(int i,int n){if(i>=0){Node<T> p=this.head;for(int j=0;p.next!=null&&j<i;j++)//定位于i-1的结点p=p.next;if(p.next!=null){T old=p.next.data;return old;}return null;}for(int i=0;i<n;i++)p=p.next;return p;}public void remove(int i,int n){if(i>=0){Node<T> p=this.head;for(int j=0;p.next!=null&&j<i;j++)//定位于i-1的结点p=p.next;if(p.next!=null){T old=p.next.data;p.next=p.next.next;return old;}return null;}for(int i=0;i<n;i++)p=p.next;}public void insert(int i,SinglyLinkedList<T> list){public SinglyLinkedList(SinglylinkedList<T> list){//复制单链表所有结点的深拷贝构造方法this();//创建空单链表,只有头结点Node<T> p=this.head.next;Node<T> rear=this.head;while(p!=null){rear.next=new Node<T>(p.data,null);rear=rear.next;p=p.next;}}if(SinkedlinkedList==null)return;Node<T> p=this.head;//p指向头结点for(int j=0;p.next!=null&&j<i;i++)//定位于第i-1个结点p=p.next;p.next=new Node<T>(list,p.next);}public void append(SinglyLinkedList<T> list){public SinglyLinkedList(SinglyLinkedList<T> list){//复制单链表所有结点的深拷贝构造方法this();//创建空单链表,只有头结点Node<T> p=this.head.next;Node<T> rear=this.head;while(p!=null){rear.next=new Node<T>(p.data,null);rear=rear.next;p=p.next;}}insert(Integer。