11021199实验一 线性表的插入与删除实验报告

合集下载

线性顺序表的插入与删除(实验报告)

线性顺序表的插入与删除(实验报告)

一、实验目的和要求通过对顺序表的编程练习,加强对顺序表的特点、顺序存储结构及其基本运算的理解和掌握。

提前了解实验相关的c语言的知识。

使用C语言根据相应算法编写一个程序,实现建立线性顺序表、插入和删除等基本操作。

要求仔细阅读下面的内容,编写一个C程序,上机调试通过,并观察其结果,写出实验报告书。

二、实验内容和原理内容:建立一个容量10的顺序表,在其中插入3个元素,然后作删除运算。

原理:在第i个元素前插入元素,从第i个元素开始到最后一个元素均向后移动一个位置,然后将新元素插入到第i个位置,将线性表的长度加1。

删除第i个元素,从第i+1个元素开始到最后一个元素均向前移动一个位置,然后将线性表的长度减1。

三、主要仪器设备计算机一台四、实验主程序#include<stdio.h>#include<stdlib.h>struct List{int size;int n;int *head;};void init(struct List *pl,int size){pl->size=size;pl->n=0;pl->head=malloc(size*sizeof(int)); }void in(int i,int val,struct List *pl){int k;if(pl->n==pl->size){printf("list is full.\n");return;}if(i>pl->n)i=pl->n+1;if(i<1)i=1;for(k=pl->n-1;k>=i-1;--k)pl->head[k+1]=pl->head[k];pl->head[i-1]=val;++pl->n;}void out(int i,struct List *pl){int k;if(pl->n==0){printf("list is empty.\n");return;}if(i<1||i>pl->n){printf("this element is not in the list.\n");return;}for(k=i;k<=pl->n;++k)pl->head[k-1]=pl->head[k];--pl->n;return;}void print(const struct List *pl) {int i;for(i=0;i!=pl->n;++i)printf("%d ",pl->head[i]);printf("\n");}int main(void){int i;struct List list;init(&list,10);for(i=0;i!=5;++i)in(i+1,i,&list);print(&list);in(1,5,&list);print(&list);in(10,4,&list);print(&list);in(5,50,&list);print(&list);out(1,&list);print(&list);out(list.n,&list);print(&list);out(3,&list);print(&list);getchar();return 0;}实验结果五、实验心得通过实验学习,我理解了线性顺序表的插入与删除的算法,了解到线性顺序表的插入与删除得效率低下,感到受益匪浅。

实验一 线性表的插入和删除

实验一 线性表的插入和删除

实验一线性表的插入和删除一、实验目的1、掌握用Turbo C上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。

二、实验内容线性表基本操作的实现当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。

若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。

程序实现:typedef Null 0;typedef int datatype;#define maxsize 1024;typedef struct{ datatype data[maxsize];int last;}sequenlist;int insert(L, x, i)sequenlist *L;int i;{ int j;if ((*L).last= =maxsize-1){ printf(“overflow”);return Null;}elseif ((i<1)‖(i>(*L).last+1){ printf(“error”);return Null;}else{ for(j=(*L).last; j>=i-1; j--) (*L).data[j+1]=(*L).data[j]; (*L).data[i-1]=x;(*L).last=(*L).last+1;}return(1);}int delete(L,i)sequenlist *L;int i;{ int j;if ((i<1)‖(i>(*L).last+1)){printf (“error”);return Null;}else{ for(j=i, j<=(*L).last; j++)(*L).data[j-1]=(*L).data[j];(*L).data - -;}return(1);}void creatlist( ){ sequenlist *L;int n, i, j;printf(“请输入n个数据\n”); scanf(“%d”,&n);for(i=0; i<n; i++){ printf(“data[%d]=”, i);scanf (“%d”, (*L).data[i]);}(*L).last=n-1;print f(“\n”);}printout (L)sequenlist *L;{ int i;for(i=0; i<(*L).last; i++){ printf(“data[%d]=”, i);printf(“%d”, (*L).data[i]);}}main( ){ sequenlist *L;char cmd;int i, t;clscr( );printf(“i, I…..插入\n”);printf(“d,D…..删除\n”);printf(“q,Q……退出\n”);do{ do{cmd =getchar( );}while((cmd!=‘d’)‖(cmd!=‘D’)‖(cmd!=‘q’)‖(cmd!=‘Q’)‖(cmd!=‘i’)‖(cmd!=‘I’));switch (cmd){ case ‘i’,‘I’; scanf(&x);scanf(&i);insert(L, x, i);printout(L);break;case ‘d’,‘D’; scanf(&i);delete(L, i);printout(L);break;}}while ((cmd!=‘q’)&&( cmd!=‘Q’));}。

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

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

数据结构..实验报告线性表的基本操作数据结构实验报告线性表的基本操作1.引言本实验报告旨在介绍线性表的基本操作。

线性表是一种常见的数据结构,它是一组有限元素的有序集合,其中每个元素之间存在一个特定的顺序关系。

线性表的操作包括插入、删除、查找等,这些操作对于有效地管理和利用数据非常重要。

2.实验目的本实验的目的是通过实践理解线性表的基本操作,包括初始化、插入、删除、查找等。

通过编写相应的代码,加深对线性表的理解,并掌握相应的编程技巧。

3.实验内容3.1 初始化线性表初始化线性表是指创建一个空的线性表,为后续的操作做准备。

初始化线性表的方法有多种,如顺序表和链表等。

下面以顺序表为例进行说明。

顺序表的初始化包括定义表头指针和设置表的长度等操作。

3.2 插入元素插入元素是指将一个新的元素插入到线性表的指定位置。

插入元素有两种情况:插入到表的开头和插入到表的中间。

插入元素的操作包括移动其他元素的位置以腾出空间,并将新的元素插入到指定位置。

3.3 删除元素删除元素是指将线性表中的某个元素删除。

删除元素有两种情况:删除表的开头元素和删除表的中间元素。

删除元素的操作包括将被删除元素的前一个元素与后一个元素进行连接,断开被删除元素与表的联系。

3.4 查找元素查找元素是指在线性表中寻找指定的元素。

查找元素的方法有多种,如遍历线性表、二分查找等。

查找元素的操作包括比较目标元素与线性表中的元素进行匹配,直到找到目标元素或遍历完整个线性表。

4.实验步骤4.1 初始化线性表根据线性表的类型选择相应的初始化方法,如创建一个空的顺序表并设置表的长度。

4.2 插入元素输入要插入的元素值和插入的位置,判断插入的位置是否合法。

如果合法,移动其他元素的位置以腾出空间,将新的元素插入到指定位置。

如果不合法,输出插入位置非法的提示信息。

4.3 删除元素输入要删除的元素值,判断元素是否在线性表中。

如果在,则找到目标元素的前一个元素和后一个元素,进行连接删除操作。

线性表的创建插入和删除的操作

线性表的创建插入和删除的操作

实验内容:线性表的创建、插入删除等#include"stdio.h"#include"stdlib.h"int*inistl(int m,int *n) /*建立线性表函数*/{int*v=NULL;v=malloc(m*sizeof(int*)); /*创建链表,并把首地址赋给指针V*/n=0;return v;}void insl(int*v,int m,int*n,int i,int b)/*在链表指定位置插入元素b*/{int j;if(*n>=m) /*检查是否链表溢出*/{printf("the stack is overflow\n");return;}if(i>*n-1) i=*n+1; /*若插入点大于元素位置则在表的结束插入*/ if(i<1) i=1; /*空表在首部插入元素*/for(j=*n;j>=i;j--) /*首位之间任意位置的插入*/v[j]=v[j-1];v[i-1]=b;*n=*n+1; /*插入后元素统计指针加1*/}void desl(int*v,int m,int*n,int i) /*线性表删除函数*/{int j;if(*n==0) /*判断线性表是否为空*/{printf("the stack is underflow\n ");return;}if((i<1)||(i>*n)) /*删除点在首部以前和尾部以后特殊情况排除*/ {printf("not this element in the list!");return;}for (j=i;j<=*n-1;j++) /*在允许位置做删除操作*/v[j-1]=v[j];*n=*n-1; /*元素统计指针减1*/return;})void input(int*v,int n) /*空表起始输入元素函数*/{int i;for(i=0;i<n;i++ /*利用循环指针输入元素*/scanf("%d",v+i);}void output(int*v,int n) /*线性表输出打印函数*/{int i;for(i=0;i<n;i++)printf("%d",*(v+i)); /*指针移动指向下一个节点依次输出元素*/}void main() /*主函数(功能调用函数)*/{int *v,m,*n,i,b; /*v链表空间首地址m线性表容量n线性表实际元素i改变线性表元素位置b插入或删除元素*/n=(int *)malloc(sizeof(int)); /*开辟链表空间*/printf("请输入线性表容量:");scanf("%d",&m);v=inistl(m,n); /*调用创建线性表函数*/printf("请输入线性表实际个数:");scanf("%d",n);printf("请输入线性表起始元素:");input(v,*n); /*调用线性表元素输入函数*/printf("请输入线性表插入点位置:");scanf("%d",&i);printf("请输入线性表插入元素:");scanf("%d",&b);insl(v,m,n,i,b); /*调用线性表插入函数*/printf("输出操作后线性表:");output(v,*n); /*调用线性表输出函数*/printf("\n");printf("请输入线性表删除点位置:");scanf("%d",&i);desl(v,m, n, i); /*调用线性表元素删除函数*/printf("输出操作后线性表:");output(v,*n); /*调用线性表输出函数*/printf("\n");}initsl(int m,int n){int *v=NULL;v=malloc(m*sizeof(int));return v;}void insl(int v,int n,intm,inti,intb){if(*n==m){printf("overflow \n");return;}if(i>*n-1);i=*n+1;if(i<1);i=1;for(j=*n;j>=i:j++)v[j]=v[j-1];v[i-1]=b;*n=*n+1; return;}void desl(int m,int *n,int v,int i) {if(*n==0){printf("underflow \n"); return;if((i<1)||(i>*n)){printf("Not this element") input(int *v,int n){for(i=0;i<*n;i++)scanf("%d",v+i);}output(int v,int *n){for(i=0;i<*n;i++)printf("%d",v+i);}void main(){int *v=NULL,m,*n=NULL,i,b; n=malloc(sizeof(int));printf("请输入空间容量:");scanf("%d",&m);v=initsl(m,n);printf("请输入实际个数:"); scanf("%d",n);input(v,*n);printf("请输入插入位置:");scanf("%d",&i);printf("请输入插入元素:");scanf("%d",&b);insl(v,m,n,i,b);output(v,*n);printf{"请输入删除位置:"); scanf("%d",&i);desl(v,m,n,i);output(v,*n);}软件技术实验#include "stdlib.h"void initsl(v,m,n)int *initsl(int m,int *n);{int *v=NULL;v=malloc(m*sizeof(int);return v;}insl(v,m,n,i,b)void v[],b;int m,*n,i;{ if (*n==m){ printf("overflow \n");return;}if (i>*n-1) i=*n+1;if (i<1) i=1;for (j=*n;j<=i;j――) v[j]=v[j-1];v[i-1]=b;*n=*n+1;return;}desl(v,m,n,i)void v[];int m,*n,i;{ if (*n==0){ printf("underflow \n");return;} if ((i<1) | | (i>*n)){ printf("Not this element in the list \n");return;}for (j=i;j<=*n-1;j++) v[j-1]=v[j];*n=*n-1;return;}input(int *v,int n){for(i=0;i<*n;i++)scanf("%d",&v[i]);void main(){int*v=NULL,m,*n=null,i,b;n=malloc(sizeof(int));printf("请输入空间容量:");scanf("%d",&m);v=initsl(m,n);printf("请输入实际个数:");scanf("%d",n);input(v,*n);printf("请输入插入位置:");scanf("%d",&i);printf("请输入插入元素:");scanf("%d",&b);insl(v,m,n,i,b);output(v,*n);printf{"请输入删除位置:");scanf("%d",&i);desl(v,m,n,i);output(v,*n);}#include"stdio.h"#include"stdlib.h"int*inistl(int m,int *n) /*建立线性表函数*/{int*v=NULL;v=malloc(m*sizeof(int*)); /*创建链表,并把首地址赋给指针V*/n=0;return v;}void insl(int*v,int m,int*n,int i,int b)/*在链表指定位置插入元素b*/{int j;if(*n>=m) /*检查是否链表溢出*/{printf("the stack is overflow\n");return;}void insl(int*v,int m,int*n,int i,int b)/*在链表指定位置插入元素b*/{ int j;if(*n>=m) /*检查是否链表溢出*/{printf("the stack is overflow\n");return;}if(i>*n-1) i=*n+1; /*若插入点大于元素位置则在表的结束插入*/ if(i<1) i=1; /*空表在首部插入元素*/for(j=*n;j>=i;j--) /*首位之间任意位置的插入*/v[j]=v[j-1];v[i-1]=b;*n=*n+1; /*插入后元素统计指针加1*/}void desl(int*v,int m,int*n,int i) /*线性表删除函数*/{int j;if(*n==0) /*判断线性表是否为空*/{printf("the stack is underflow\n ");return;}if((i<1)||(i>*n)) /*删除点在首部以前和尾部以后特殊情况排除*/ {printf("not this element in the list!");return;}for (j=i;j<=*n-1;j++) /*在允许位置做删除操作*/v[j-1]=v[j];*n=*n-1; /*元素统计指针减1*/return;}void input(int*v,int n) /*空表起始输入元素函数*/{int i;for(i=0;i<n;i++) /*利用循环指针输入元素*/scanf("%d",v+i);}void output(int*v,int n) /*线性表输出打印函数*/{int i;for(i=0;i<n;i++)printf("%d",*(v+i)); /*指针移动指向下一个节点依次输出元素*/}void main() /*主函数(功能调用函数)*/{int *v,m,*n,i,b; /*v链表空间首地址m线性表容量n线性表实际元素i改变线性表元素位置b插入或删除元素*/n=(int *)malloc(sizeof(int)); /*开辟链表空间*/int lserch(head,x);struct node *head;int x;{ struct node *p;int k=0;p=head;while((p!=NULL)&&(p->d!=x)){ k++; p=p->next;}if(p==NULL) k=-1;return;}}printf("请输入线性表容量:");scanf("%d",&m);v=inistl(m,n); /*调用创建线性表函数*/printf("请输入线性表实际个数:");scanf("%d",n);printf("请输入线性表起始元素:");input(v,*n); /*调用线性表元素输入函数*/ printf("请输入线性表插入点位置:");scanf("%d",&i);printf("请输入线性表插入元素:");scanf("%d",&b);insl(v,m,n,i,b); /*调用线性表插入函数*/ printf("输出操作后线性表:");output(v,*n); /*调用线性表输出函数*/ printf("\n");printf("请输入线性表删除点位置:");scanf("%d",&i);desl(v,m, n, i); /*调用线性表元素删除函数*/ printf("输出操作后线性表:");output(v,*n); /*调用线性表输出函数*/ printf("请输入要查找的元素"); /*调用线性查找函数*/ scanf("%d",&x);printf("输出操作后线性表:"); /*调用线性表输出函数*/ printf("\n");}运行结果:。

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

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

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

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

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

线性表的插入和删除-栈和队列的算法-利用三元组表实现矩阵相加--实验

线性表的插入和删除-栈和队列的算法-利用三元组表实现矩阵相加--实验

内蒙古科技大学信息工程学院计算机系《数据结构与算法》实验报告
add(a,b,c);
nodeprint(c);
return 0;
}
实验过程及结果线性表的顺序存储和删除:线性表的链式存储和删除:
顺序栈:
链队列:
实验三:
实验总结
【实验1】
这次实验了解了线性表的顺序存储结构和线性表的链式存储结构的插入和删除的操作,了解了线性表这两种存储方式的不同以及这两种线性表的优缺点,顺序存储结构的效率较低而链式存储结构的插入和删除效率高一些,操作更容易一些。

【实验2】
这次实验初步掌握了栈和队列的简单应用,学会的创建栈和队列,向栈和队列中传入参数,销毁栈和队列。

【实验3】
这次实验掌握了数组的压缩存储和应用,用三元组实现了矩阵之间的相加
1、每个实验项目填写一份实验报告,电子版命名方式为:学号姓名项目号.doc。

例如:1167111182张三3.doc表示张三做的第3个项目的实验报告。

2、实验报告电子版应该在实验后一周内由学习委员收齐后存放在一个文件夹下,文件夹命
名方式为:软件12-1班3,表示软件12-1班第3个项目的实验报告,压缩。

第一时间发送
给任课教师。

必须以班级为单位上交。

实验一 线性表 实验报告

实验一 线性表 实验报告

数据结构实验报告实验名称:实验一线性表学生姓名:班级:班内序号:学号:日期:2012年11月3日1、实验要求据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。

线性表存储结构(五选一):1、带头结点的单链表2、不带头结点的单链表3、循环链表4、双链表5、静态链表线性表的基本功能:1、构造:使用头插法、尾插法两种方法2、插入:要求建立的链表按照关键字从小到大有序3、删除4、查找5、获取链表长度6、销毁7、其他:可自行定义编写测试main()函数测试线性表的正确性2、程序分析2.1存储结构单链表的存储结构2.2关键算法分析一:关键算法1:头插法自然语言描述:a:在堆中建立新结点b:将a[i]写入到新结点的数据域c:修改新结点的指针域d:修改头结点的指针域,并将新结点加入链表中伪代码描述:a:Node * s=new Node ;b:s->data=a[i] ;c:s->next=front->next;d:front->next=s;2:尾插法自然语言描述:a:在堆中建立新结点b:将a[i]写入到新结点的数据域c:将新结点加入到链表中d:修改尾指针伪代码描述:a:Node * s=new Node ;b:s->data=a[i] ;c:r->next=s;d:r=s;3:删除大于min小于max元素算法:自然语言描述:a:建立新结点b:保存第一个结点的位置c:执行循环,查找到p结点为第一个大于min小于max的元素,q为比min 大的前一个元素位置d:执行循环,查找到比max小的最后一个元素位置e:将上述两步骤中的满足条件的中间节点删掉f:将前后两条断链重新连接起来,连接p和q结点伪代码描述:a:Node *p,*q,*r;b: p=front->next;c:while(p&&p->data<=min){q=p;p=p->next;}d和e:while(p&&p->data<max) //找比max小的最后一个元素位置{r=p;p=p->next;delete r; //释放满足条件的结点}f: q->next=p;4:链表逆置算法自然语言描述:a:建立新结点b:判断链表是否为空表或者单结点链表c:将开始结点变成终端结点d:执行循环,使每次循环都将后一个结点变成开始结点e:遍历打印伪代码描述:a:Node *p,*q;b:if(front->next&&front->next->next)c: p=front->next;q=p->next;p->next=NULL;d:while(q){p=q; //每次循环将后一个结点变成起始结点q=q->next;p->next=front->next;front->next=p;}e: z=front->next;while(z) //遍历打印逆置后的序列{cout<<z->data<<"";z=z->next;}5.销毁函数自然语言描述:a:新建立一个指针,指向头结点b:判断要释放的结点是否存在c:暂时保存要释放的结点d:移动a中建立的指针e:释放要释放的指针伪代码描述:a:Node * p=frontb:while(p)c:front=pd:p=p->nexte:delete front6.按位查找函数(查找第i个元素的位置)自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,直到p为空或者j等于1b1:p指向下一个结点b2:j加1c:若p为空,说明第i个元素不存在,抛出异常d:否则,说明p指向的元素就是所查找的元素,返回元素地址伪代码描述a:Node * p=front->next;j=1;b:while(p&&(j!=i))b1:p=p->nextb2:j++c:if(!p) throw ”查找位置有误”d:return p7:按位查找函数(查找值为x的元素并返回其位置)自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,找到这个元素或者p指向最后一个结点b1:判断p指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j的值加1c:如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息伪代码描述:a:Node * p=front->next;j=1;b:while(p)b1: if(p->next==x)return j;p=p->next;j++ ;c:throw "找不到指定元素";8.插入函数自然语言描述:a:在堆中建立新结点b:将要插入的结点的数据写入到新结点的数据域c:修改新结点的指针域d:修改前一个指针的指针域,使其指向新插入的结点的位置伪代码描述:a:Node * s=new Node ;b:s-data=xc:s->next=p->nextd:p->next=s9.删除函数自然语言描述:a:从第一个结点开始,查找要删除的位数i前一个位置i-1的结点b:设q指向第i个元素c:将q元素从链表中删除d:保存q元素的数据e:释放q元素伪代码描述:a: if(i!=1)p=Get(i-1);b: q=p->nextc:p->next=q->nextd:x=q->datae:delete q10.遍历输出函数自然语言描述:a:判断该链表是否为空链表,如果是,报错b:如果不是空链表,新建立一个temp指针c:将temp指针指向头结点d:打印temp指针的data域e:逐个往后移动temp指针,直到temp指针指向的next域为空伪代码描述:a:If(front->next==NULL)cout<<"该链表为空链表!"<<endl;b和c:Node * temp=front->next;d和e:while(temp){cout<<temp->data<<"";temp=temp->next;}11.获取链表长度函数自然语言描述:a:判断该链表是否为空链表,如果是,输出长度0b:如果不是空链表,新建立一个temp指针,初始化整形数n为0c:将temp指针指向头结点d:判断temp指针是否为空,如果不是,n加1,否则return ne: 使temp指针逐个后移,重复d操作,直到temp指针指向的next域为0,返回n伪代码描述:a:int n=0;if(front->next==NULL) //如果为空链表{n=0;}b和c: else{Node * temp=front->next;d:while(temp){n++;e: temp=temp->next;}}return n;二、代码详细分析1、头插法关键代码:Node * s=new Node ;s->data=a[i] ;s->next=front->next;front->next=s;示意图:2、尾插法关键代码:Node * s=new Node ;s->data=a[i] ;r->next=s;r=s;示意图:3:删除大于min 小于max 元素算法:关键代码:Node *p,*q,*r,*s;p=front->next;while (p&&p->data<=min){q=p;p=p->next;} //此循环结束时,当前p 结点为第一个大于min 小于max 的元素,q 为比min 大的前一个元素位置while (p&&p->data<max) //找比max 小的最后一个元素位置{r=p;p=p->next;delete r; //释放满足条件的结点}q->next=p;流程图:4:链表逆置算法关键代码:Node *p,*q,*z;if (front->next&&front->next->next) //当链表不是空表或者单结点时{p=front->next;q=p->next;p->next=NULL; //将开始结点变成终端结点while(q){p=q; //每次循环将后一个结点变成起始结点q=q->next;p->next=front->next;front->next=p;}}流程图:5、查找算法关键代码:Node *p=front->next;int j=1;while(p&&(j!=i)) //i=1时循环体不执行{p=p->next;j++;}if(!p) throw"查找位置有误";elsereturn p;流程图:六、删除算法关键代码:Node *p=front;if (i!=1)p=Get(i-1); //查到第i-1个元素的地址Node *q=p->next;p->next=q->next;int x=q->data;delete q;return x;流程图:三、关键算法的时间、空间复杂度头插法/尾插法 O(n)按位查找/按值查找 O(n)插入操作 O(n)逆置操作 O(n)删除大于min小于max操作o(n)2.3其他函数中的按值查找可以修改,把终止条件改为直到指向的结点的next域为空,返回多个地址,那么在链表中如果存在多个待找元素都可以返回。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实验一 线性表的插入和删除

实验一  线性表的插入和删除
int n;
node *p;
p=head;
n=0;
while(p!=NULL){
n=n+1;
p=p->next;
} return(n);
}
//删除链表上第k个结点
node *delete_k_node(node *head,int k)
{
int j=1;
node *p,*p1;
if(head==NULL){
}
oid deletechain(node *h)
{
node *p1;
while(h){
p1=h;
h=h->next;
delete p1;
}
cout<<"已释放链表的结点空间!\n";
}
int count(node *head)//求链表的结点数
{
{
node *head;
int num;
int k;
head= create_sort ();
print(head);
cout<<"结点数:"<<count(head)<<"\n";
cout<<"输入要删除结点上的序号!\n";
cin>>num;
head=delete_k_node(head,k);
int a;
cout<<"建立一条有序链表,请输入数据,以-1结束:\n";
while(!(cin>>a))//输入整数,若不为整数则重输
{
cerr << "输入错误!请重新输入:";

线性表的实验报告

线性表的实验报告

线性表的实验报告线性表的实验报告概述:线性表是一种常见的数据结构,它是由一组具有相同数据类型的元素组成的序列。

本次实验旨在通过实际操作线性表,掌握线性表的基本操作以及了解其应用场景。

实验目的:1. 理解线性表的概念和基本操作;2. 掌握线性表的顺序存储结构和链式存储结构;3. 熟悉线性表的常见应用场景。

实验材料:1. 计算机;2. 编程软件(如C、C++、Java等);3. 实验教材或参考资料。

实验步骤:一、线性表的顺序存储结构实验1. 创建一个空的线性表;2. 向线性表中插入若干元素;3. 删除线性表中的某个元素;4. 根据索引查找线性表中的元素;5. 遍历线性表,输出所有元素。

二、线性表的链式存储结构实验1. 创建一个空的链表;2. 向链表中插入若干节点;3. 删除链表中的某个节点;4. 根据节点值查找链表中的节点;5. 遍历链表,输出所有节点。

实验结果:1. 顺序存储结构实验结果:- 成功创建空的线性表;- 成功插入若干元素;- 成功删除某个元素;- 成功根据索引查找元素;- 成功遍历线性表,输出所有元素。

2. 链式存储结构实验结果:- 成功创建空的链表;- 成功插入若干节点;- 成功删除某个节点;- 成功根据节点值查找节点;- 成功遍历链表,输出所有节点。

实验分析:1. 顺序存储结构适用于元素个数固定或变化不大的情况,插入和删除操作需要移动大量元素,效率较低;2. 链式存储结构适用于元素个数不固定的情况,插入和删除操作只需修改指针,效率较高;3. 线性表的应用场景包括但不限于:图书馆图书管理系统中的图书列表、学生信息管理系统中的学生列表等。

实验总结:通过本次实验,我深入了解了线性表的概念、基本操作以及两种常见存储结构。

顺序存储结构适用于元素个数固定的情况,而链式存储结构适用于元素个数不固定的情况。

线性表在实际应用中有着广泛的应用场景,如图书馆管理系统、学生信息管理系统等。

在以后的学习和工作中,我将灵活运用线性表,为解决实际问题提供便利。

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

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

实验一_线性表操作_实验报告实验一:线性表操作一、实验目的1.理解线性表的基本概念和特点。

2.掌握线性表的基本操作,包括插入、删除、查找等。

3.通过实验,提高动手能力和解决问题的能力。

二、实验原理线性表是一种较为常见的数据结构,它包含零个或多个数据元素,相邻元素之间有前后关系。

线性表具有以下特点:1.元素之间一对一的顺序关系。

2.除第一个元素外,每个元素都有一个直接前驱。

3.除最后一个元素外,每个元素都有一个直接后继。

常见的线性表有数组、链表等。

本实验主要针对链表进行操作。

三、实验步骤1.创建链表:首先创建一个链表,并给链表添加若干个节点。

节点包括数据域和指针域,数据域存储数据,指针域指向下一个节点。

2.插入节点:在链表中插入一个新的节点,可以选择在链表的头部、尾部或中间插入。

3.删除节点:删除链表中的一个指定节点。

4.查找节点:在链表中查找一个指定数据的节点,并返回该节点的位置。

5.遍历链表:从头节点开始,依次访问每个节点的数据。

四、实验结果与分析1.创建链表结果:我们成功地创建了一个链表,每个节点都有数据域和指针域,数据域存储数据,指针域指向下一个节点。

2.插入节点结果:我们成功地在链表的头部、尾部和中间插入了新的节点。

插入操作的时间复杂度为O(1),因为我们只需要修改指针域即可。

3.删除节点结果:我们成功地删除了链表中的一个指定节点。

删除操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要删除的节点。

4.查找节点结果:我们成功地在链表中查找了一个指定数据的节点,并返回了该节点的位置。

查找操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要查找的节点。

5.遍历链表结果:我们成功地遍历了整个链表,并访问了每个节点的数据。

遍历操作的时间复杂度为O(n),因为我们可能需要遍历整个链表。

通过本次实验,我们更加深入地理解了线性表的基本概念和特点,掌握了线性表的基本操作,包括插入、删除、查找等。

实验一 线性表的插入和删除

实验一  线性表的插入和删除
struct node{
int data;
node *next;
};
//建立一条升序单链表
node *create_sort(void)
{
node *head=NULL;
int a;
cout<<"建立一条有序链表,请输入数据,以-1结束:\n";
while(!(cin>>a))//输入整数,若不为整数则重输
{
if(p->next==NULL)
{
return NULL;
}
p=p->next;
}
return p;
}
}
node *insert(node *head,int a)
{
node *p1;
p1=new node;
p1->data=a;
p1->next=NULL;
if(head==NULL)
{
return p1;
struct node{
int data;
node *next;
};
//建立一条有序链表
node *create_sort(void)
{
node *p1,*head=0;
int a;
cout<<"建立一条有序链表,请输入数据,以-1结束:";
cin>>a;
while(a!=-1){
p1=new node;
print(head);
deletechain(head);
cout<<"输入要插入的整数!\n"
cin>>num;
head=insert(head, num);

线性表的建立,插入与删除

线性表的建立,插入与删除

一、实验目的1、掌握使用VC++上机调试线性表的基本方法;2、掌握线性表的基本操作:插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。

二、实验要求1、设计对线性表进行链式存储操作的内容;2、写出相应程序;3、保存和打印出程序的运行结果,并结合程序进行分析。

三、实验内容线性表的建立,插入与删除算法:Status InitList_ Sq(SqList &L)Status ListInsert_ Sq(SqList &L, int i, Elemtype e){if(i<1||i>L.length+1) return ERROR;q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]); p>=q; --p)*(p+1)=*p;*q=e;++l.length;return OK;}//ListInsert_ Sq;Status ListDelete_ Sq(SqList &L, int i, Elemtype e){if(i<1||i>L.length+1) return ERROR;p=&(L.elem[i-1]);e=*pq=L.elem+L.length-1;for(++p;p<=q;++p)*(p-1)=*p;--L.length;return OK;}//ListDelete_ Sq;四、程序代码#include<stdlib.h>#include<stdio.h>typedef struct{int *elem;int length;}sqlist;void init(sqlist *L){L->elem=(int*)malloc(100*sizeof(int));L->length=0;}void read1(sqlist *L,int n){int i;printf("input n shu:");for(i=0;i<n;++i)scanf("%d",&L->elem[i]);L->length=n;}void print(sqlist L){int i;for(i=0;i<=L.length-1;++i)printf("%5d",L.elem[i]);printf("\n");}void insert(sqlist *L,int i,int e){int *p,*q;if(i<1||i>L->length+1)printf("error");else{q=&L->elem[i-1];for(p=&L->elem[L->length-1];p>=q;--p)*(p+1)=*p;*q=e;++L->length;}}void delist(sqlist *L,int i ,int *e){ int *p,*q;if(i<1||i>L->length)printf("error\n");else{q=&L->elem[i-1]; *e=*q;for(p=q;p<=&L->elem[L->length-1];++p)*(p)=*(p+1);--L->length;}}main(){sqlist L; int e;int i,n;init(&L);printf("input n;");scanf("%d",&n);read1(&L,n);print(L);printf("input i,e;"); printf("input i,e;");scanf("%d%d",&i,&e);insert(&L,i,e);printf("insert:");print(L);printf("input i;");scanf("%d",&i);delist(&L,i,&e); printf("delete:");print(L);getch();}五、结果及分析。

线性表实验报告

线性表实验报告

线性表实验报告实验目的:掌握线性表的基本概念和实现方式,熟悉线性表的各种操作。

实验原理:线性表是由同类型的数据元素构成的有序序列。

在线性表中,除了第一个元素外,每个元素都有且仅有一个直接前驱元素;除了最后一个元素外,每个元素都有且仅有一个直接后继元素。

本实验主要通过C语言的实现,实现了线性表的基本操作,包括初始化、插入、删除、查找等。

实验内容:1.初始化线性表:定义一个长度为n的结构体数组,用于存储线性表的元素,同时设置线性表的长度为0。

2.插入元素:在指定位置pos后插入元素elem,首先判断线性表是否已满,若已满则无法插入;若未满,则将pos后的所有元素往后移动一位,然后将elem插入到pos位置,最后将线性表的长度加1。

3.删除元素:删除指定位置pos的元素,首先判断线性表是否为空或pos是否合法,若为空或pos不合法则无法删除;若合法,则将pos后的所有元素往前移动一位,最后将线性表的长度减1。

4.查找元素:按照元素值查找元素在线性表中的位置,首先判断线性表是否为空,若为空则无法查找;若不为空,则遍历线性表,逐一比较元素值,找到则返回其位置,找不到则返回-1。

5.输出线性表:按顺序输出线性表中的元素值。

实验结果:经过测试,线性表的各种操作均实现了。

可以正确地初始化、插入、删除、查找元素,并成功输出线性表中的元素值。

实验总结:通过本实验,我对线性表的概念和实现方式有了更深入的了解,并通过C语言的实现掌握了线性表的各种操作。

线性表是数据结构中最基本、最简单的一种,但在实际应用中非常广泛。

掌握了线性表的操作,对于理解和应用其他更复杂的数据结构具有重要的意义。

线性表的插入和删除实验报告

线性表的插入和删除实验报告

printf("Please input code(a/b/c):"); scanf("\n%c",&c); } } void insertlist(seqlist *L) { int x,i,j; if(L->length>=ListSize) {printf("\n===>Overflow,don't insert!\n"); return; } printf("\nInit datas:"); for(i=0;i<L->length;i++) printf("%3d",L->data[i]); printf("\nWill be insert data:"); scanf("%d",&x); i=0; /****************************************/ while (x<L->data[i] && i<L->length) i++; /****************************************/ if(x==L->data[i]) printf("\n===>Error!\n"); else{ /*********************************/ for(j=L->length-1;j>=i;j--) L->data[j+1]=L->data[j]; L->data[i]=x; L->length++; /*********************************/ } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// 使用数组建立线性表类 class LinerList {
private: int d[1001]; int n,nl,m;
public: void initList(int mn) {
n = mn; nl = 1; }
// 初始化线性表
void insert(int a)
//向线性表中插入整数 a
要在原线性表中删除一个元素 b(在本实验中,保证 b 在线性表中),且仍保持线性表 的顺序存储结构,可以从线性表的第一个元素开始,往后逐个与新元素相比较,直到发现一 个元素与新元素相等。然后从当前位置的下一个元素开始,将后面所有元素都往前移动一个 位置,直到线性表的最后一个位置为止。显然,删除一个元素之后,线性表的长度减小了 1。 其算法如下。
(1) 定义一个有序(非递减)线性表,其最大容量为 1000,初始时为空。 (2) 从由 1 产生的数据文件中依次取前 N 个随机整数,陆续插入到此线性表中,
并要求在每次插入后保持线性表的有序性。最后将此有序线性表打印输出。 (3) 在由(2)产生的线性表中,依在 1 中产生的次序逐个将元素删除,直至表空 为止。 3. 以 N=100 及 N=400 分别运行 2 的程序,并比较它们的运行时间。 4. 编写一个程序,用插入排序依次将 1 中产生的 1000 个随机整数链接成有序链表(不 改变原随机数在存储空间中的顺序)。
fout<<data[i]<<endl;
//向文件输出
//cout<<data[i]<<endl;
//向标准输出输出
}
//step 3 以 1000 个随机数为数据源向线性表中插入 100 个数据 LinerList l1,l2; startt = clock(); //初始计时 l1.initList(110); for(i=1;i<=100;i++)
{
if(nl+1>=n) cout<<"Oh,GOsh,OVERFLOW!\n"; //判断溢出
else
{
int i,j,mm;
i=++nl;
while(i>=1)
{
mm=d[i-1];
if(mm>=a)
d[i]=mm;
else
{
d[i]=a;
break;
}
i--;
}t m) //删除下标为 m 的数据节点
// 利用链表构造线性表 ChainList cl; cl.initit(1001);
for(i=1;i<=1001;i++) {
cl.setitem(data[i]); }
cl.isort(); //进行插入排序 cl.printit(); //打印排序后列表 system("pause"); return 0; }
4. 方法说明
(1)随机整数的产生 产生随机整数的方法有很多,下面只介绍一种方法: 设 m=216,初值 y0=0,则递推公式 yi=mod(2053 yi-1+13849,m)产生 0 至 65535 之间的 随机整数。如要产生 0 至 999 之间的随机整数,只需做运算 xi=INT(1000yi/m)。
} } };
int main()
{
int i,j,m,data[1001];
clock_t startt,finisht;
//step 1 产生随机数
LRandom lrandom;
lrandom.initRand();
for(i=1;i<=1000;i++)
{
data[i]=lrandom.nextRand();
l1.insert(data[i]); l1.printIt(); for(i=1;i<=100;i++)
l1.del(i); l1.printIt(); finisht = clock(); //结束计时 cout<<(finisht-startt)<<endl; //打印计时 system("pause");
3. 实验步骤和要求
1. 事先编制好实验内容中 1、2、4 的程序(可参考本实验中的方法说明),并调 试通过。
2. 运行 1 的程序,生成 1000 个 0 至 999 之间的随机整数的数据文件,并打印输 出此数据文件。
3. 以 N=100 运行 2 的程序,并记下运行时间。 4. 以 N=400 运行 2 的程序,并记下运行时间。 5. 运行 4 的程序。 6. 整理程序清单和运行结果,写出实验报告。
实验一 线性表的插入与删除实验报告
110228 刘宇 11021199
1. 实验目的
掌握线性表在顺序分配下的插入与删除运算;掌握线性表的链式存储结构;掌握插 入排序的方法;并掌握一种产生随机数的方法。
2. 实验内容
1. 产生 1000 个 0 至 999 间的随机整数,并以产生的次序存入一个数据文件中。 2. 编制一个程序,依次实现以下功能:
输入:线性表 L(1:n),n 为线性表的长度,删除的元素 b(一定在线性表中)。 输出:删除 b 后的线性表 L(1:n)。
在上述算法中,从线性表的第一个元素开始寻找要删除的元素 b,实际上我们还可以从线 性表的最后一个元素开始寻找 b,其算法留给读者自行考虑。
(3)线性链表的插入排序 定义一个二列数组 A(1:1000,1:2),其中,A(i,1)(i=1,2,…,1000)依随机数产生的顺序存 放 1000 个数据,A(i,2)(i=1,2,…,1000)为链接指针,将 1000 个随机数链接成有序链表。其插 入排序的方法如下。 依次从数据文件中读入一个数据,将它按行顺序存放到数组 A 的第一列中,然后通过 相应行的第二列将它链接到已经有序的链表中。其过程为:将读入的数据依次与链表中各元 素进行比较,找到其应该插入的位置后,适当改变链指针,将其插入。其算法如下: 输入:1000 个随机整数。 输出:头指针为 H 的有序链表。
vm = pr->d; pr->d = tr->d; tr->d = vm; } tr=tr->next; } pr=pr->next; } } void printit() //打印线性表全体 { Lnode *pr; int i=1; pr = r->next; while(1)
{ cout<<i++<<' '<<(pr->d)<<' '; if(pr->next == NULL) break; pr=pr->next;
六、结果分析
结果 1: 事先编制好实验内容中 1、2、4 的程序(可参考本实验中的方法说明),并调试通过。 运行 1 的程序,生成 1000 个 0 至 999 之间的随机整数的数据文件,并打印输出此数据文件。 以 N=100 运行 2 的程序,并记下运行时间。
结果 2: 以 N=400 运行 2 的程序,并记下运行时间。
其中 mod(*) 是模运算,INT(*)是取整函数。 (2)线性表的插入与删除 在本实验中线性表是动态增长的。插入一个新元素后,为了使线性表仍保持有序,必须 要找到新元素应插入的位置。实际上这是一个插入排序的问题。 为了要将新元素插入到一个有序的线性表中,可以从原有序表的最后一个元素开始,往 前逐个与新元素比较,并将大于新元素的所有元素都往后移动一个位置,直到找到新元素应 插入的位置为止。显然,插入一个新元素后,表的长度也增加了 1。现假设用一个数组 L(1:m) 来存储线性表,其中 m 为最大容量(在本实验中为 m=1000);用一个变量 n 表示线性表的 长度(在本实验中,其初值为 n=0)。则可以得到将新元素插入到有序线性表的算法如下。 输入:数组 L(1:m),有序线性表 L(1:n),需插入的新元素 b。其中 n<m。 输出:插入 b 后的有序线性表 L(1:n)。
} void setitem(int a) //插入整数 a 到线性表中 {
q = (Lnode*)malloc(sizeof(Lnode)); q->d = a; q->next = NULL;
if(nl==1) {
r->next = q; p=q; nl++; } else { p->next = q; p = q; nl++; } }
结果 3: 编写一个程序,用插入排序依次将 1 中产生的 1000 个随机整数链接成有序链表(不改 变原随机数在存储空间中的顺序)。
实验反思:
本次实验内容为数据结构中最基础的线性表,通过利用数组和链表分表实现并处理不同 规模的数据,进一步理解数组与链表的存储方式、实现方法及效率区别。数组实现方案中, 随着数据规模的增大,运行时间急剧增加,而同样的操作对链表运行时间的影响不大。从另 一方面分析,在程序开发过程中,数组方式的开发难度明显小于链表,原因在于数组可以使 用下表进行索引,链表的指针操作则相对复杂抽象。使用面向对象的思想以 c++语言为平台 实现了两个线性表类,分别用数组和指针存储实现。具体使用指针调换节点顺序时,使用一 个跟班指针记录单向链表前驱,但仍因一时混乱造成了窘迫。使用指针时一定要逻辑清晰, 并且清楚指针的指向,以免指针访问非法数据区域,引起崩溃。
//step 3 以 1000 个随机数为数据源向线性表中插入 400 个数据 startt = clock(); l2.initList(410); for(i=1;i<=400;i++)
l2.insert(data[i]); l2.printIt(); for(i=1;i<=400;i++)
相关文档
最新文档