完整版12信管实验报告(线性表基本操作)

合集下载

实验一线性表操作实验报告

实验一线性表操作实验报告

实验一线性表操作实验报告__大学计算机学院实验报告课程名称数据结构实验名称__线性表操作实验报告要求:1.实验目的 2.实验内容 3.实验步骤 4.运行结果 5.流程图 6.实验体会一、实验目的 1 熟悉并掌握线性表的逻辑结构、物理结构。

2 熟悉并掌握顺序表的存储结构、基本操作和具体的函数定义。

3 熟悉VC++程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互关系及各自的作用。

4 熟悉VC++操作环境的使用以及多文件的输入、编辑、调试和运行的全过程。

二、实验要求 1 实验之前认真准备,编写好程序。

2 实验中认真调试程序,对运行结果进行分析^p ,注意程序的正确性和健壮性的验证。

3 不断积累程序的调试方法。

三、实验内容基本题: 1 对元素类型为整型的顺序存储的线性表进行插入、删除和查找操作。

程序:#include #include #include const LIST_INIT_SIZE=10; const LISTINCREMENT=1; typedef struct { int _elem; int length; int listsize; }SqList; void InitList_Sq(SqListL) //构造一个空的线性表L { L.elem=(int_)malloc(LIST_INIT_SIZE_sizeof(int)); if(!L.elem)e_it(0); //存储分配失败 L.length=0; //空表长度为0L.listsize=LIST_INIT_SIZE; //初始存储容量 coutL.length+1)cout=L.listsize) //当前存储空间已满,增加分配 { int_newbase=(int_)realloc(L.elem,(L.listsize+LISTINCREMENT)_sizeof(int)); if(!newbase) e_it(0); //存储分配失败 L.elem=newbase; //新基址 L.listsize+=LISTINCREMENT; //增加存储容量 } int_q=(L.elem[i-1]); for(int_p=(L.elem[L.length-1]);=q;--p) _(p+1)=_p; _q=j; ++L.length; coutL.length)) cout>_; _p=_; p++;List.length++; } cout>y; if(y==1) { cout>m>>n;ListInsert_Sq(List,m,n); disp(List); } else if(y==2){ cout>m; ListDelete_Sq(List,m,j); cout>m; cout #include#include int a[100]; int josephus(int n,int s,int m) { if(!(n_s_m)) { cout>n; cout>s; cin>>m; _=josephus(n,s,m);cout>y; }while(y==1); getch; } 运行结果:(2)提高:#include using namespace std; typedef struct LNode { struct LNode _ne_t; int a; }LNode,_LinkList; class JosephouCircle //定义一个类包括三个元素 { public: void SetValue; void PickOut; private: int n; int s; int m; }; void JosephouCircle::SetValue //设置初值的大小{ cout>n; cout>s; cout>m; } void JosephouCircle::PickOut { LinkList L; LNode _p,_q; int j,k; L=(LinkList)malloc(sizeof(LNode)); L->ne_t=NULL; LNode_r; r=L; for (int i=1;ia=i; p->ne_t=NULL; r->ne_t=p; r=p; } p->ne_t=L->ne_t; p=L->ne_t; j=1;while(pjne_t;++j; } for(i=1;ine_t; } q=p->ne_t;p->ne_t=q->ne_t; p=q->ne_t; k=q->a; cout<<“输出的结果为:“<<k<<endl; free(q); } } int main(int argc,char_argv[]) { JosephouCircle Jo1; Jo1.SetValue; Jo1.PickOut; return 0; } 运行结果:四、实验体会与总结 1、对于线性链表和顺序表都属于线性表问题,但是线性链表比顺序表要灵活,方便;2、线性表在做元素寻找的操作的时候,必须从头结点开始寻找。

数据结构实验报告——线性表

数据结构实验报告——线性表

实验报告:线性表的基本操作实验1:实现顺序表各种基本运算的算法一、实验目的学会并运用顺序表存储结构及各种运算。

二、实验环境VC++6.0三、实验准备(1) 复习课件中理论知识(2)练习课堂所讲的例子四、实验内容编写一个程序实现SqList.cpp,实现顺序表基本运算,并在此基础上设计个主程序exp1.cpp,完成如下功能:(1)初始化顺序表L;(2)依次插入a、b、c、d、e元素;(3)输出顺序表L;(4)输出顺序表L长度;(5)判断顺序表L是否为空:(6)输出顺序表L的第3个元素;(7)输出元素a的位置;(8)在第4个位置上插入f元素;(9)输出顺序表L;(10)删除顺序表L的第3 个元素;(11)输出顺序表L;(12)顺序表L;五、实验步骤1、构造一个空的线形表并分配内存空间Status InitList_Sql(SqList &L){L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem) exit(OVERFLOW);L.length=0; L.listsize=LIST_INIT_SIZE; return OK; }2、求线性表的长度Status ListLength(SqList L) {return L.length; }3、线性表清空void ClearList(SqList &L){ L.length = 0; }4、在顺序线形表 L 中第 i 个位置之前插入新的元素 eStatus ListInsert_Sq(SqList &L,int i,ElemType e)5、查找'm'在顺序表中的位序e = 'm'; i = LocateElem_Sq(L,e);printf("元素 m 在顺序表中的位序是:%d\n",i);6、在第4个位置上插入f元素printf("(在第 4 个元素位置上插入 f 元素\n");ListInsert_Sq(L,4,'f');7、删除第 3 个元素printf("(删除顺序表 L 中第 3 个元素:"); ListDelete_Sq(L, 3, e);printf("被删除的第 3 个元素值是:%c",e);8、重新申请空间ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof( ElemType)); if(!newbase) exit(OVERFLOW);L.elem=newbase;新的存储空间基址 L.listsize+=LISTINCREMENT;9、初始化并插入元素InitList_Sql(L); printf("依次插入 a,b,c,d,e 元素\n");10、输出顺序表、释放顺序表printf("输出顺序表 L:"); ListTraverse(L); printf("(释放顺序表L\n"); DestroyList(L);六、实验总结通过该实验的学习,对课堂内容再次巩固,对顺序表也有了更深的了解。

线性表的操作算法实验报告

线性表的操作算法实验报告

实验报告2013学年第一学期任课老师:2、在实验过程中遇到的问题与解决方法:问题有很多,比如局部变量与全局变量的声明,常常顾此失彼,此处概念仍然不清。

填写内容时,可把表格扩大。

附:实验源程序代码顺序表(链表):// 线性表(链表)#include <stdio.h>#include "malloc.h"#include <iostream>using namespace std;typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;//创建一个长度为n的链表void CreateList(LinkList &L, int n) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;for (int i=n; i>0; --i){LinkList p = (LinkList)malloc(sizeof(LNode));cin>>p->data;p->next = L->next;L->next = p;}}// 在链表L第i个元素之前插入元素eint ListInsert(LinkList &L, int i, int e) {LinkList p=L;int j=0;while(p&&j<i-1) {p=p->next; ++j;}if(!p ||j>i-1) return 0;LinkList s = (LinkList)malloc(sizeof(LNode)); s->data=e;s->next=p->next;p->next=s;return 1;}// 在链表L中删除第i个元素,并由e返回其值int ListDelete(LinkList &L, int i, int &e) { LinkList p=L;int j=0;while(p->next&&j<i-1) {p=p->next; ++j;}if(!(p->next)||j>i-1) return 0;LinkList q=p->next;p->next=q->next;e=q->data;free(q);cout<<"被删除的元素数据为"<<e<<"\n"; return 0;}//查找第i个元素,并由e返回其值int GetElem(LinkList &L,int i, int &e) {LinkList p=L->next;int j=1;while (p && j<i) {p=p->next; ++j;}if (!p||j>i) return 0;e=p->data;cout<<"该元素的值为"<<e<<"\n";return 1;}//让链表L中的元素按从小到大的顺序排列LinkList Sort(LinkList L){ LinkList p,q;int temp;for(p=L;p!=NULL;p=p->next){for(q=p->next;q!=NULL;q=q->next){if(p->data>q->data){temp=q->data;q->data=p->data;p->data=temp;}}}return L;}//归并L和La得到新的单链性表Lbvoid MergeList_L(LinkList &L,LinkList &La,LinkList &Lb) { LinkList p,pa,pb;p=L->next;pa=La->next;Lb=pb=L; //用L的头结点作为Lb的头结点while (p&&pa) {if (p->data<=pa->data) {pb->next=p;pb=p;p=p->next;}else {pb->next=pa;pb=pa;pa=pa->next;}}pb->next=p?p:pa;free(La);}int main(){LinkList L;int n,s,e,i,f,g,h;cout<<"输入链表长度n:";cin>>n;cout<<"请输入L中的元素:"<<endl;CreateList( L, n);cout<<"输入的链表为:"<<" ";LNode *q=L->next;while(q){cout<<q->data<<" ";q=q->next;} cout<<endl;int choice;cout<<"请选择功能:"<<endl;cout<<"1.插入元素"<<endl;cout<<"2.删除元素"<<endl;cout<<"3.查找元素"<<endl;cout<<"4.给元素排序"<<endl;cout<<"5.合并链表"<<endl;cout<<"0.退出程序"<<endl;cout<<"PS:若先排序再合并,可将得到新的排序后的合并链表。

12信管实验报告(树与二叉树的基本操作_1)

12信管实验报告(树与二叉树的基本操作_1)

管理学院信管专业12(1)班学号3112004734 姓名协作者:无教师评定_________________ 实验题目树与二叉树的基本操作实验评分表下述代码尽管输入eclipse或者JC验证,绝无弄虚作假实验报告一、实验目的与要求1.本实验通过对线性表各种操作的算法设计,理解和掌握线性表的概念、存储结构及操作要求,体会顺序和链式两种存储结构的特点;2.根据操作的不同要求,选择合适的存储结构,设计并实现算法,对算法进行时间复杂度分析,从而达到掌握数据结构的研究方法、算法设计和分析方法的目的。

二、实验内容1.在一棵二叉链表表示的二叉树中,实现以下操作,并说明采用哪种遍历算法,其他遍历算法是否可行。

(1)输出叶子结点//求二叉树叶子结点个数的递归算法(2)public class leaf {//输出叶子结点(3)public static<T> void leaf(BinaryTree<T> bitree){(4)leaf(bitree.root);(5)}(6)public static<T> void leaf(BinaryNode<T> p){(7)if(p!=null){(8)if(p.left==null&&p.right==null){(9)System.out.println(p.data+"");(10)}(11)leaf(p.left);(12)leaf(p.right);(13)(14)}(15)}(16)public static void main(String args[]){(17)Stringprelist[]={"A","B","D",null,"G",null,null,null,"C","E",null,null,"F","G"};//先根遍历序列(18)BinaryTree<String> bitree=new BinaryTree<String>(prelist);//以先根遍历序列构造的一棵二叉树(19)bitree.preOrder();//先根次序遍历的递归算法(20)leaf(bitree);(21)(22)String prelist2[]={"A","B",null,null,"C"};//先根遍历序列(23)BinaryTree<String> bitree2=new BinaryTree<String>(prelist2);//以先根遍历序列构造的一棵二叉树(24)bitree2.preOrder();//先根次序遍历的递归算法(25)leaf(bitree2);(26)(27)}(28)}运算结果:(2)求二叉树中叶子节点的个数//求二叉树中叶子结点的个数的递归算法public class getLeaves{public static<T> int getLeaves(BinaryTree<T> bitree){ return getLeaves(bitree.root);}public static<T> int getLeaves(BinaryNode<T> p){ //int i=0;if(p!=null){if(p.left==null&&p.right==null){//i++;//System.out.println("叶子结点的个数是:"+i);return 1;}//getLeaves(p.left);//getLeaves(p.right);return getLeaves(p.left)+getLeaves(p.right);//System.out.println("叶子结点的个数是"+i);}return 0;}public static void main(String args[]){Stringprelist[]={"A","B","D",null,"G",null,null,null,"C","E",nul l,null,"F","E"};BinaryTree<String> bitree=new BinaryTree<String>(prelist); bitree.preOrder();System.out.println(getLeaves(bitree));String prelist2[]={"A","B",null,null,"C"};BinaryTree<String> bitree2=newBinaryTree<String>(prelist2);bitree2.preOrder();System.out.println(getLeaves(bitree2));}}运算结果:(3)将每个结点的左子树和右子树交换//将二叉树的每个结点的左右子树交换的递归算法//交换二叉树的左右子树的递归算法的实现public class Bitree_revolute{public static<T> void Bitree_revolute(BinaryTree<T> bitree){Bitree_revolute(bitree.root);//从bitree树的根结点开始遍历}public static<T> void Bitree_revolute(BinaryNode<T> p){if(p!=null){p.setLeftChild(p.getRightChild());//交换左右子树p.setRightChild(p.getLeftChild());//交换左右子树System.out.println(p.data.toString());if(p.getLeftChild()!=null){Bitree_revolute(p.getLeftChild());}if(p.getRightChild()!=null){Bitree_revolute(p.getRightChild());}}public static void main(String args[]){Stringprelist[]={"A","B","D",null,"G",null,null,null,"C","E",null,null,"F","E"};BinaryTree<String> bitree=new BinaryTree<String>(prelist);bitree.preOrder();//先根次序遍历Bitree_revolute(bitree);String prelist2[]={"A","B",null,null,"C"};BinaryTree<String> bitree2=new BinaryTree<String>(prelist2);bitree2.preOrder();//先根次序遍历Bitree_revolute(bitree2);}}运算结果:(4)验证二叉树的性质3:n0=n2+1//验证二叉树的性质3的递归算法public class Property3<T> {//验证二叉树的性质3,n0=n2+1private static int n0=0,n2=0;//声明并初始化2度结点数n2,0度结点数n0(0度结点数即是叶子结点数)public static<T> void count(BinaryTree<T> bitree){//统计二度结点数n2和叶子结点数n0 n0=0;n2=0;count(bitree.root);System.out.println("验证二叉树的性质3,n0="+n0+",n2="+n2+",n0==n2+1?"+(n0==n2+1));private static<T> void count(BinaryNode<T> p){//统计二度结点数n2和叶子结点数n0//以p结点为根的子树的结点数if(p!=null){if(p.left==null&&p.right==null)//叶子结点n0++;//if(p.left!=null&&p.right!=null)//2度结点n2++;count(p.left);count(p.right);}}public static void main(String args[]){//测试Stringprelist[]={"A","B","D",null,"G",null,null,null,"C","E",null,null,"F","E"}; //以一维数组String prelist[]存储二叉树的标明空子树的先根遍历序列BinaryTree<String> bitree=new BinaryTree<String>(prelist);//以先根遍历序列prelist 构造二叉树bitreebitree.preOrder();//先根次序遍历的递归算法count(bitree);String prelist2[]={"A","B",null,null,"C"};//以一维数组String prelist2[]存储二叉树的标明空子树的先根遍历序列2BinaryTree<String> bitree2=new BinaryTree<String>(prelist2);//以先根遍历序列构造二叉树bitree2bitree2.preOrder();//先根次序遍历的递归算法count(bitree);}}运算结果:(5)判断一棵二叉树bitree是否与当前二叉树的一棵子树匹配。

线性表操作实验报告

线性表操作实验报告

忻州师范学院计算机科学与技术系实验报告(第六组)组长:梁启超组员:晋丹丹张艳华马军刘雪梅孙钰林刘涛分块调试:把算法分拆成几个功能模块,按C程序结构标准分模块调试;3)错误跟踪有两种方法:错误信息排查法、执行路线跟踪法。

错误信息排查法:根据错误信息进行分类排查,要求分析者对C的错误代码要有足够的了解和认识,有经验的程序员多用此法。

执行路线跟踪法:变量分析法(跟踪变量的值)、插入标签法(插入输出标签),这种方法适合初学者。

4)调试分析不宜面面俱到,具体写出关键问题就行。

分析如下:主函数main()首先调用显示操作菜单函数scan(),再根据用户输入的数字选项分别调用以下函数:(1)createlist_l头插法构造单链表;(2)createlist_l2尾插法构造单链表;两种二选一;(2)listinsert_l向单链表中插入元素;(3)listdelete_l删除单链表中的元素;(4)printlist_l遍历单链表;(5)getelem_l按位序查找单链表;(6)locateElem_l按值查找单链表;由上述结构可知,采用分功能模块调试的方法较合理,即主要功能按以下顺序实现:添加——查找——删除——遍历。

5.使用说明与测试结果程序名为TXL.exe,运行环境为DOS。

程序执行后显示(下图为参考截图例子。

)第一次操作需选择1或者2,并且只能选择一种。

程序执行显示我们选择的的是头插法构造单链表,输入1后显示要输入几个数1我们写5个请输入要插入的数据:我们插入15 25 35 45 55遍历单链表删除表中第2个元素在第3个元素中插入68按位序查找单链表;查找第4个元素五、实验总结(调试和运行程序过程中产生的问题及采取的措施;对算法的程序的讨论、分析,改进设想以及其它经验教训;对实验方式、组织、设备、题目的意见和建议等)附源程序清单:#include<stdio.h>#include<stdlib.h>typedef struct lnode{int data;struct lnode *next;}lnode,*linklist;linklist createlist_l(int n){int i;linklist l,p;l=(linklist)malloc(sizeof(lnode));l->next=NULL;printf("please input the data of :");for(i=n;i>0;--i){p=(linklist)malloc(sizeof(lnode));scanf("%d",&p->data);p->next=l->next;l->next=p;}return l;}linklist createlist_l2(int n){int i;linklist l,p,r;l=(linklist)malloc(sizeof(lnode));l->next=NULL;r=l;printf("please input the data of:");for(i=1;i<=n;i++)。

线性表的基本操作

线性表的基本操作

实验一:线性表的基本操作一、实验目的:(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);}}五、测试结果:六、心得体会:通过这次写实验报告,我深切的理解了这门课的本质。

数据结构--实验报告 线性表的基本操作

数据结构--实验报告 线性表的基本操作

数据结构--实验报告线性表的基本操作数据结构--实验报告线性表的基本操作一、引言本实验报告旨在通过实际操作,掌握线性表的基本操作,包括初始化、插入、删除、查找等。

线性表是最基本的数据结构之一,对于理解和应用其他数据结构具有重要的作用。

二、实验目的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)判断线性表是否已满。

数据结构--实验报告 线性表的基本操作

数据结构--实验报告 线性表的基本操作

数据结构--实验报告线性表的基本操作数据结构实验报告[引言]在本次实验中,我们将学习线性表的基本操作,包括插入、删除、查找等。

通过实践操作,加深对线性表的理解和掌握。

[实验目的]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 释放线性表的内存空间[实验结果]使用线性表进行各种基本操作的测试,并记录操作的结果和运行时间。

数据结构--实验报告 线性表的基本操作

数据结构--实验报告 线性表的基本操作

数据结构--实验报告线性表的基本操作线性表的基本操作实验报告1.引言线性表是最基本的数据结构之一,它可以用来存储一系列具有相同数据类型的元素。

本实验旨在通过实践掌握线性表的基本操作,包括插入、删除、查找和修改元素等。

本文档将详细介绍实验所需的步骤和操作方法。

2.实验目的1.掌握线性表的插入和删除操作。

2.理解线性表的查找和修改元素的方法。

3.熟悉线性表的基本操作在算法中的应用。

3.实验环境本实验使用编程语言/软件名称作为开发环境,具体要求如下:________●操作系统:________操作系统名称和版本●编程语言:________编程语言名称和版本4.实验步骤4.1 初始化线性表在程序中创建一个空的线性表,用于存储元素。

实现方法:________具体的初始化方法和代码示例 4.2 插入元素在线性表中指定位置插入一个新元素。

实现方法:________具体的插入元素方法和代码示例 4.3 删除元素删除线性表中指定位置的元素。

实现方法:________具体的删除元素方法和代码示例 4.4 查找元素在线性表中查找指定元素的位置。

实现方法:________具体的查找元素方法和代码示例 4.5 修改元素修改线性表中指定位置的元素值。

实现方法:________具体的修改元素方法和代码示例5.实验结果在完成上述步骤后,我们得到了一个可以进行插入、删除、查找和修改元素的线性表。

具体操作结果如下:________●插入元素操作结果:________插入元素的具体操作结果●删除元素操作结果:________删除元素的具体操作结果●查找元素操作结果:________查找元素的具体操作结果●修改元素操作结果:________修改元素的具体操作结果6.实验总结通过本次实验,我们深入理解了线性表的基本操作,并且掌握了这些操作的实现方法。

线性表在实际应用中十分常见,熟练掌握线性表的操作对于开发高效的算法和数据结构具有重要意义。

线性表实验报告

线性表实验报告

线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。

在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。

线性表有两种存储结构:顺序存储结构和链式存储结构。

顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。

其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。

链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。

其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。

四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。

1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。

实现顺序表的初始化函数,将表的长度初始化为 0。

实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。

实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。

实现顺序表的遍历函数,输出表中的所有元素。

2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。

实现链表的创建函数,创建一个空链表。

实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。

实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

数据结构_实验1_线性表的基本操作

数据结构_实验1_线性表的基本操作

数据结构_实验1_线性表的基本操作在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地进行访问、修改和操作。

线性表是一种常见且基础的数据结构,它就像是一个有序的元素队列。

在本次实验 1 中,我们将深入探索线性表的基本操作,理解其背后的原理和实现方式。

线性表可以分为顺序表和链表两种常见的实现方式。

顺序表是将元素存储在连续的内存空间中,而链表则是通过节点之间的链接来存储元素。

首先,让我们来看看顺序表的基本操作。

顺序表的优点是可以通过下标直接访问元素,时间复杂度为 O(1)。

比如,如果我们要获取顺序表中第 5 个元素的值,只需要通过下标 4 就可以快速得到。

但在插入和删除元素时,情况就变得复杂一些。

如果要在顺序表的中间插入一个元素,就需要将插入位置后面的元素依次向后移动,以腾出空间插入新元素。

这一操作的时间复杂度为 O(n),其中 n 是顺序表的长度。

同样,删除中间的元素时,也需要将后面的元素依次向前移动。

接下来,我们再聊聊链表。

链表中的每个节点包含数据域和指针域。

指针域用于指向下一个节点,从而形成链表的链接结构。

在链表中进行插入和删除操作相对简单,只需要修改相关节点的指针即可,时间复杂度通常为 O(1)。

然而,要访问链表中的特定元素,就需要从链表的头节点开始,沿着指针依次遍历,直到找到目标节点,其时间复杂度为 O(n)。

在实验中,我们实现了线性表的创建操作。

对于顺序表,我们首先确定其初始容量,然后分配相应的连续内存空间。

对于链表,我们创建一个头节点,并初始化其指针域为 NULL。

接着是元素的插入操作。

在顺序表中,如果插入位置合法且还有剩余空间,我们将插入位置后面的元素向后移动,然后将新元素插入指定位置。

在链表中,我们根据插入位置找到前一个节点,然后创建新节点并修改指针链接。

元素的删除操作也是重点之一。

对于顺序表,删除指定位置的元素后,将后面的元素依次向前移动。

而在链表中,找到要删除节点的前一个节点,修改指针跳过要删除的节点。

线性表及其应用实验报告

线性表及其应用实验报告

数据结构实验报告实验名称:线性表及其应用班级:12级电气本2学号:2012081227姓名:赵雪磊指导教师:梁海丽日期:2013年9月9日数学与信息技术学院一、实验目的1、掌握线性表的概念,理解线性表的顺序、链式存储。

2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。

二、实验要求1、建立顺序存储的线性表,并对之进行插入、删除操作。

2、建立链式存储的线性表,并对之进行插入、删除操作。

;三、算法描述#include <cstdlib>#include <iostream>#include "myList.h"using namespace std;template <class T> class Link {public:T data; // 用于保存结点元素的内容Link * next; // 指向后继结点的指针Link(const T info, Link* nextValue = NULL) { // 具有两个参数的Link构造函数data = info;next = nextValue;}Link(Link* nextValue = NULL) { // 具有一个参数的Link构造函数next = nextValue;}}// 【代码2.7】单链表的类型定义template <class T>class lnkList : public List<T> {protected:Link<T>* head, tail; // 单链表的头、尾指针public:lnkList(); // 构造函数~lnkList(); // 析构函数bool isEmpty(); // 判断链表是否为空void clear(); // 将链表存储的内容清除,成为空表int length(); // 返回此顺序表的当前实际长度bool append(T value); // 在表尾添加一个元素value,表的长度增1 bool insert(int p, T value); // 在位置p上插入一个元素value,表的长度增1 bool delete(int p); // 删除位置p上的元素,表的长度减 1int getPos(const T value); // 查找值为value的元素,并返回第1次出现的位置Link<T> setPos(int p); // 返回线性表指向第p个元素的指针值}template <class T>class lnkList:: lnkList() {head = tail = new Link<T>;}template <class T>class lnkList:: ~lnkList() {Link tmp;while (head != NULL) {tmp = head;head = head->next;delete tmp;}}template <class T> // 假定线性表的元素类型为TLink lnkList :: setPos(int i) {int count = 0;Link *p;if (i == -1) // i为-1则定位到"虚"头结点return head;p = head->next; // 若i为0则定位到第一个结点while (p != NULL && count < i) {p = p-> next;count++;};return p; // 指向第 i 结点,i=0,1,…,当链表中结点数小于i时返回NULL }template <class T> // 假定线性表的元素类型为Tbool lnkList :: insert (int i, T value) {Link *p, *q;q = new Link<T>;p = setPos(i-1); // p是第i个结点的前驱if (p == NULL ) {cout << " the inserted point is illegal"<<endl;return false;}q->next = p->next;q->data = value;p->next = q;if (q->next == NULL ) // 插入点在链尾,插入结点成为新的链尾tail = q;return true;}// delete a node from singly linked listtemplate <class T> // 假定线性表的元素类型为Tbool lnkList :: delete(int i) {Link *p, *q;p = setPos(i-1); // p是第i个结点的前驱if (p == NULL ) {cout << " the deletion point is illegal"<<endl;return false;}q = p->next; // q是真正待删结点if (q == tail) // 待删结点为尾结点,则修改尾指针tail = p;if (q != NULL) { // 删除结点q 并修改链指针p->next = q->next;delete q;}return true;}template <class T> // 假定顺序表的元素类型为Tvoid lnkList<T> :: print() {while (head != NULL) {cout << head->data;cout << endl; // 从位置p开始每个元素左移直到curLen, tmp = head;head = head->next;}}四、程序清单#include <iostream.h>#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #defineOVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 10 #define LISTINCREMENT 2typedef struct shunxubiao{ ElemType *list;int size;int Maxsize; }SqList;int InitList_Sq(SqList &L) {// 构造一个空的线性表L。

线性表的基本操作

线性表的基本操作

数据结构实验报告2011 年 4 月13 日项目组成一.二.程序结构图题目一:mainInitList_SqListEmpty_S ListLength_S PriorElem_Sq LocateElem_SGetElem_Sq ListInsert_Sq CreateList_S DestroyList_S ClearList_Sq NextElem_SqListDelete_Sq ListTraverse_S题目二:三.算法及其功能函数题目一:InitList_Sq(SqList *L) /*创建线性表*/CreateList_Sq(SqList *L) /*输入线性表中元素 */ DestroyList_Sq(SqList *L) /*销毁线性表*/ ClearList_Sq(SqList *L) /*清空线性表*/ ListEmpty_Sq(SqList L) /*判断是否为空*/ ListLength_Sq(SqList L) /*求线性表长度 */GetElem_Sq(SqList L, int i, ElemType *e) /*取第i 个元素并用e 返回*/ LocateElem_Sq (SqList L, int e) /*判断e 在表中位置*/ PriorElem_Sq(SqList L,int i, ElemType cur_e, ElemType *pre_e) /*取前驱*/ NextElem_Sq(SqList L,int i, ElemType cur_e, ElemType *next_e ) /*取后继*/ ListInsert_Sq(SqList *L, int i, ElemType e) /*在第i 个元素前插入e*/ ListDelete_Sq(SqList *L, int i, ElemType *e) /*删除第i 个元素 */ ListTraverse_Sq(SqList L,int i) /*遍历线性表*/mainInitList_LListInsert_LCreateList_LNextElem_LDestroyList_LocateElem_PriorElem_LListEmpty_LListDelete_LClearList_LListTraverse_ListLength_L GetElem_L题目二:InitList_L(LinkList *L) /*创建线性表*/ CreateList_L(LinkList *L) /*输入线性表中元素*/ DestroyList_L(LinkList *L) /*销毁线性表*/ClearList_L(LinkList *L) /*清空线性表*/ ListEmpty_L(LinkList L) /*判断是否为空*/ ListLength_L(LinkList L) /*求线性表长度*/ GetElem_L(LinkList L, int i, ElemType *e) /*取第i个元素并用e返回*/ LocateElem_L (LinkList L, int e) /*判断e在表中位置*/ PriorElem_L(LinkList L,int i, ElemType cur_e, ElemType *pre_e) /*取前驱*/ NextElem_L(LinkList L,int i, ElemType cur_e, ElemType *next_e ) /*取后继*/ ListInsert_L(LinkList *L, int i, ElemType e) /*在第i个元素前插入e*/ ListDelete_L(LinkList *L, int i, ElemType *e) /*删除第i个元素*/ ListTraverse_L(LinkList L,int i) /*遍历线性表*/四.源代码题目一:#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef int Status;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -2#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量#define LISTINCREMENT 10 //线性表空间的分配增量typedef struct{ElemType *elem; //存储空间基址int length; //当前长度int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)}SqList;Status InitList_Sq(SqList *L) {//构造一个空的线性表L。

实验一 线性表的基本操作

实验一 线性表的基本操作

实验报告实验一线性表的基本操作姓名:班级:物联网161学号:161 实验时间:2017.9.281.问题描述设计一个线性表实现将两个有序表s1={4,8,11,15,17}和s2={2,5,6,9,12}合并成一个新的有序表。

2.数据结构设计class LinkList{int *elem;int length;int listsize;public:LinkList(int n=10){elem = new int[n];length = 0;listsize = n;}创建一个链表,定义初始长度为0、链表初始结构,申请动态内存空间void CreateList(int i);void Insert(int i, int x);int Getelem(int i);void ListDisp();void Union(LinkList &La, LinkList &Lb);};构造链表,删除申请动态内存空间,插入数据元素,获取链表元素,变例运行合并链表中的元素,生成新链表3.算法设计#include<iostream>#include<cstdlib>using namespace std;(1)定义一个类,创建一个空链表,设置空链表长度、内存元素class LinkList {int *elem;int length;int listsize;public:LinkList(int n=10)elem = new int[n];length = 0;listsize = n;}析构函数~LinkList(){delete[]elem;length = 0;listsize = 0;}创建有序表函数,有序表插入,获取链表元素值,变例,合并两个链表元素void CreateList(int i);void Insert(int i, int x);int Getelem(int i);void ListDisp();void Union(LinkList &La, LinkList &Lb);};构造链表内元素,如果超过链表长度,则输入输入表长超过最大值返回值1,申请的动态内存空间每使用一个位置减少1void LinkList::CreateList(int n){if(n>listsize){cout << "输入表长超过最大值!";exit(1);}for (int i = 1; i <= n; i++)cin >> elem[i - 1];length = n;}插入链表元素,并判断插入元素是否超过链表元素容量,然后比较两个链表中元素的值的大小,按照从小到大的顺序在新构造的链表中排序void LinkList::Insert(int i, int x){if (length >= listsize){cout << "Insert():表长超出表容量!";exit(1);}if (i<1 || i>length + 1){cout << "插入位置异常!" << endl;for (int j = length; j >= i; j--)elem[j] = elem[j - 1];elem[i - 1] = x;length++;}获取元素,申请的动态内存和减少1int LinkList::Getelem(int i){int x;if(i<1||i>length){cout << "获取的元素不存在!";exit(1);}x = elem[i - 1];return x;}void LinkList::ListDisp(){for (int i = 0; i < length; i++)cout << elem[i] << " ";cout << endl;}合并两个链表每个链表5个元素互相比较然后在新构建的链表中进行排序void LinkList::Union(LinkList &La, LinkList &Lb){int time=5;for (int i = 1; i <= 5; i++){for (int j = 1; j <= time++; j++)if ( Lb.Getelem(i)<=La.Getelem(j)){La.Insert(j, Lb.Getelem(i));break;}}}构造主函数,输入两个链表元素值进行调试后合并int main(){LinkList s1, s2;cout << "输入两个有序表" << endl;s1.CreateList(5);s2.CreateList(5);cout << "合并后:";s1.Union(s1, s2);s1.ListDisp();return 0;}4.运行与调试5.调试记录#include<iostream>#include<cstdlib>using namespace std;class LinkList {int *elem;int length;//空表,表长为0 int listsize;//表容量public:LinkList(int n=20){elem = new int[n];length = 0;listsize = n;}~LinkList(){delete[]elem;length = 0;listsize = 0;}void CreateList(int i);void Insert(int i, int x);int Getelem(int i);void ListDisp();void Union(LinkList &La, LinkList &Lb); };void LinkList::CreateList(int n){if(n>listsize){cout << "输入表长超过最大值!";exit(1);}//cout << "输入元素:" << endl;for (int i = 1; i <= n; i++)cin >> elem[i - 1];length = n;}void LinkList::Insert(int i, int x) {if (length >= listsize){cout << "Insert():表长超出表容量!";exit(1);}if (i<1 || i>length + 1){cout << "插入位置异常!" << endl;}for (int j = length; j >= i; j--) elem[j] = elem[j - 1];elem[i - 1] = x;length++;}int LinkList::Getelem(int i){int x;if(i<1||i>length){cout << "获取的元素不存在!";exit(1);}x = elem[i - 1];return x;}void LinkList::ListDisp(){for (int i = 0; i < length; i++)cout << elem[i] << " ";cout << endl;}void LinkList::Union(LinkList &La, LinkList &Lb) {int time = 5;for (int i = 1; i <= 5; i++){for (int j = 1; j <= time++; j++)if ( Lb.Getelem(i)<=La.Getelem(j)){La.Insert(j, Lb.Getelem(i));break;}}}int main(){LinkList s1, s2;cout << "输入两个有序表" << endl;s1.CreateList(5);s2.CreateList(5);cout << "合并后:";s1.Union(s1, s2);s1.ListDisp();return 0;}。

线性表实验报告

线性表实验报告

线性表实验报告导言:线性表是数据结构中最基本也是最常用的一种结构之一。

它以一种线性的方式存储和组织数据,简单而高效。

本实验旨在通过对线性表的实践操作,加深对线性表概念的理解,并掌握其基本操作。

实验目的:1. 了解线性表的基本概念和特点;2. 掌握线性表的基本操作,如插入、删除、查找等;3. 熟悉线性表的顺序存储和链式存储结构;4. 学会通过编程实现线性表的基本操作。

实验内容:本次实验分为两个部分,分别是线性表的顺序存储和链式存储结构。

一、顺序存储结构的线性表操作1. 初始化线性表:定义一个固定大小的数组,用于存储线性表中的元素;2. 插入元素:从表尾开始,逐个向前移动元素,为新元素腾出位置;3. 删除元素:从指定位置开始,逐个向后移动元素,覆盖待删除元素;4. 查找元素:按照线性表的顺序依次比较元素,直到找到目标元素或遍历结束;5. 获取表长度:通过记录插入和删除操作的次数,得到线性表的长度。

二、链式存储结构的线性表操作1. 定义结点:创建一个结点类,包含数据域和指向下一结点的指针;2. 初始化链表:定义一个头指针,将其初始化为 NULL,表示链表为空;3. 插入元素:找到插入位置的前一个结点,将新结点插入到其后面;4. 删除元素:找到待删除结点的前一个结点,将其指针指向待删除结点的下一个结点;5. 查找元素:从链表头部开始遍历,逐个比较结点中的数据,直到找到目标元素或遍历结束;6. 获取表长度:通过遍历链表中的结点,计数来获取表长度。

实验过程:1. 根据实验目的,在 C/C++ 环境下创建一个项目,并命名为"LinearList";2. 依次完成顺序存储结构和链式存储结构的线性表操作函数的编写;3. 调用这些函数,对线性表进行初始化、插入、删除、查找等操作;4. 验证线性表操作的正确性,并检查函数是否能正确处理各种边界情况;5. 根据实验内容,编写实验报告,记录实验过程和结果。

线性表的基本操作实验报告

线性表的基本操作实验报告

线性表的基本操作实验报告线性表的基本操作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) 遇见形参与实参搞混问题,改形参里面的内容并不影响其原本数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档