武汉理工大学数据结构线性表实验报告
- 格式:doc
- 大小:133.00 KB
- 文档页数:10
实验报告实验一线性表实验目的:1. 理解线性表的逻辑结构特性;2. 熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;3. 熟练掌握线性表的链表存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;4•掌握双向链表和循环链表的的描述方法,以及在该存储结构下的基本操作。
实验原理:线性表顺序存储结构下的基本算法;线性表链式存储结构下的基本算法;实验内容:2 - 21设计单循环链表,要求:(1 ) 单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取消数据元素操作和判非空操作。
(2 ) 设计一个测试主函数,实际运行验证所设计单循环链表的正确性。
2 — 22 .设计一个有序顺序表,要求:(1 ) 有序顺序表的操作集合有如下操作:初始化、求数据元素个数、插入、删除和取数据元素。
有序顺序表与顺序表的主要区别是:有序顺序表中的数据元素按数据元素值非递减有序。
(2 ) 设计一个测试主函数,实际运行验证所设计有序顺序表的正确性。
(3) 设计合并函数ListMerge ( L1,L2,L3 ),功能是把有序顺序表 L1和L2中的数据元素合并到L3,要求L3中的数据元素依然保持有序。
并设计一个主函数,验证该合并函数的正确性。
程序代码:2-21 (1)头文件 LinList.h 如下:typedef struct node{DataType data;struct node *next;}SLNode;/* ( 1 )初始化 ListInitiate(SLNode * * head)*/void ListInitiate(SLNode * * head){ /* 如果有内存空间,申请头结点空间并使头指针 head 指向头结点 */if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1);(*head)->next=NULL; /* 置结束标记 NULL*/}/*(2) 求当前数据元素个数 ListLength(SLNode * head)*/int ListLength(SLNode * head){SLNode *p=head;int size=0;while(p->next!=head){p=p->next;size++;}return size;}/*(3) 插入 ListInsert(SLNode * head , int i , DataType x)*//* 在带头结点的单链表的第 i(0<=i<=size) 个结点前 *//* 插入一个存放数据元素 x 的结点。
《数据结构》实验报告专业:学号:姓名:实验二线性表【实验目的】1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。
2.通过编程、上机调试,进一步理解线性表的基本概念,东运用C语言实现线性表基本操作。
3.熟练掌握线性表的综合应用问题。
【实验内容】1、一个线性表有n个元素(n-MAXSIZE.MAXSIZE指线性表的最大长度),且递增有。
现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。
设计程序实现。
要求:采用顺序存储表示实现;采用链式存储表示方法实现:比较两种方法的优劣。
2.从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。
要求:①指定的值x由键盘输入;②程序能处理空链表的情况。
3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。
要求:①该算法用函数(非主函数)实现;②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。
LinkedList Exchange(LinkedList HEAD,p)//HEAD是单链表头结点的指针,p是链表中的一个结点。
本算法将p所指结点与其后继结点交换。
(q=head->next;//q是工作指针,指向链表中当前待处理结点。
pre=head;//pre是前驱结点指针,指向q的前驱。
while(q'=null &&q1=p)(pre=q;q=q->next;]/未到p结点,后移指针。
if(p->next==null)printf(“p无后继结点\n”);/p是链表中最后一个结点,无后继。
else/处理p和后继结点交换(q=p->next;//暂存p的后继。
pre->next=q://p前驱结点的后继指向p的后继。
p->next=q->next;//p的后继指向原p后继的后继。
q->next=p://原p后继的后继指针指向p。
一、实验目的1、深刻理解线性结构的特点以及线性表的概念。
2、熟练掌握线性表的顺序存储结构、链式存储结构及基本运算算法的实现,特别是查找、插入和删除等算法。
二、实验环境1) 硬件:每个学生需配备计算机一台,操作系统:Windows2000/XP。
2) 软件:visual c++6.0。
三、实验题目和实验内容实验题目:线性表的顺序、链式表示及其应用实验内容:1、基本题:实验2.1、实验2.2、实验2. 4、实验2.72、附加题:实验2.3、实验2.6(没做)四、实验数据和实验结果2.1a,b,c,d,e2.2a,b,c,d,e22.4a,b,c,d,e2.7第一个多项式:2x+6x^2-4x^3+3x^4 第二个多项式1x-3x^2+6x^3-3x^4五、附录(程序代码)2.1#include<iostream.h>#include<malloc.h>#define MaxSize 50typedef struct{char data[MaxSize];int length;}SqList;void CreateList(SqList *&L,char a[],int n) {int i;L=(SqList *)malloc(sizeof(SqList));for(i=0;i<n;i++)L->data[i]=a[i];L->length=n;}void InitList(SqList *&L){L=(SqList *)malloc(sizeof(SqList));L->length=0;}void DestroyList(SqList *&L){free(L);}int ListEmpty(SqList *L){return (L->length==0);}int ListLength(SqList *L){return (L->length);}void DispList(SqList *L){int i;for(i=0;i<L->length;i++)cout<<L->data[i];cout<<endl;}char GetElem(SqList *L,int i,char &e){if(i<1||i>L->length)return 0;e=L->data[i-1];return e;}第3 页共15 页int LocateElem(SqList *L,char e){int i=0;while(i<L->length&&L->data[i]!=e) i++;if(i>=L->length)return 0;elsereturn i+1;}int ListInsert(SqList*&L,int i,char e) {int j;if(i<1||i>L->length+1)return 0;i--;for(j=L->length;j>i;j--)L->data[j]=L->data[j-1];L->data[i]=e;L->length++;return 1;}int ListDelete(SqList *&L,int i,char &e) {int j;if(i<1||i>L->length)return 0;i--;e=L->data[i];for(j=i;j<L->length-1;j++)L->length--;return 1;}void main (){SqList *p;char b[10],e;int k;cout<<"元素个数:";cin>>k;cout<<"输入元素:";for(int m=0;m<k;m++)cin>>b[m];InitList(p);4CreateList(p,b,k);cout<<"输出顺序表:";DispList(p);cout<<"顺序表长度是:"<<ListLength(p)<<endl;if(ListEmpty(p))cout<<"顺序表为空"<<endl;elsecout<<"顺序表不为空"<<endl;cout<<"顺序表第3位元素是:"<<GetElem(p,3,e)<<endl;cout<<"元素a的位置是:第"<<LocateElem(p,'a')<<"位"<<endl;ListInsert(p,4,'f');cout<<"在第4个元素上插入元素f:";DispList(p);cout<<"删除顺序表第3个元素:";ListDelete(p,3,e);DispList(p);DestroyList(p);}2.2#include<iostream.h>#include<malloc.h>typedef struct LNode{char data;struct LNode *next;}LinkList;void CreateListR(LinkList *&L,char a[],int n){LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList));r=L;for(i=0;i<n;i++){s=(LinkList *)malloc(sizeof(LinkList));s->data=a[i];r->next=s;r=s;}r->next=NULL;}第5 页共15 页void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;}void DestroyList(LinkList *&L){LinkList *pre=L,*p=pre->next;while(p){free(pre);pre=p;p=pre->next;}free(pre);}int ListEmpty(LinkList *L){return(L->next==NULL);}int ListLength(LinkList *L){int n=0;LinkList *p=L;while(p->next){n++;p=p->next;}return(n);}void DispList(LinkList *L){LinkList *p=L->next;while(p){cout<<p->data;p=p->next;}cout<<endl;}char GetElem(LinkList *L,int i,char &e) {int j=0;6LinkList *p=L;while(j<i&&p!=NULL){j++;p=p->next;}if(!p)return 0;else{e=p->data;return e;}}int LocateElem(LinkList *L,char e){int i=1;LinkList *p=L->next;while(p&&p->data!=e){p=p->next;i++;}if(!p)return(0);elsereturn(i);}int ListInsert(LinkList *&L,int i,char e){int j=0;LinkList *p=L,*s;while(j<i-1&&p){j++;p=p->next;}if(!p)return 0;else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;第7 页共15 页p->next=s;return 1;}}int ListDelete(LinkList *&L,int i,char &e){int j=0;LinkList *p=L,*q;while(j<i-1&&p){j++;p=p->next;}if(!p)return 0;else{q=p->next;if(!q)return 0;e=q->data;p->next=q->next;free(q);return 1;}}void main(){LinkList *h;char b[10],e;int k;cout<<"元素个数:";cin>>k;cout<<"输入元素:";for(int m=0;m<k;m++)cin>>b[m];InitList(h);CreateListR(h,b,k);cout<<"输出单链表:";DispList(h);cout<<"单链表长度是:"<<ListLength(h)<<endl;if(ListEmpty(h))cout<<"单链表为空"<<endl;else8cout<<"单链表不为空"<<endl;cout<<"单链表第3位元素是:"<<GetElem(h,3,e)<<endl;cout<<"元素a的位置是:第"<<LocateElem(h,'a')<<"位"<<endl;ListInsert(h,4,'f');cout<<"在第4个元素上插入元素f:";DispList(h);cout<<"删除单链表第3个元素:";ListDelete(h,3,e);DispList(h);DestroyList(h);}2.4#include<iostream.h>#include<malloc.h>typedef struct LNode{char data;struct LNode *next;}LinkList;void CreateListR(LinkList *&L,char a[],int n){LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList));r=L;for(i=0;i<n;i++){s=(LinkList *)malloc(sizeof(LinkList));s->data=a[i];r->next=s;r=s;}r->next=L;}void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;}void DestroyList(LinkList *&L){第9 页共15 页LinkList *pre=L->next,*p=pre->next;L->next=NULL;while(p){free(pre);pre=p;p=pre->next;}free(pre);}int ListEmpty(LinkList *L){return(L->next==NULL);}int ListLength(LinkList *L){int n=0;LinkList *p=L;while(p->next!=L&&p->next){n++;p=p->next;}return(n);}void DispList(LinkList *L){LinkList *p=L->next;while(p!=L&&p){cout<<p->data;p=p->next;}cout<<endl;}char GetElem(LinkList *L,int i,char &e) {int j=1;LinkList *p=L->next;while(j<i&&p!=L&&p){j++;p=p->next;}10return 0;else{e=p->data;return e;}}int LocateElem(LinkList *L,char e){int i=1;LinkList *p=L->next;while(p!=L&&p->data!=e&&p){p=p->next;i++;}if(!p)return(0);elsereturn(i);}int ListInsert(LinkList *&L,int i,char e){int j=1;LinkList *p=L->next,*s;while(j<i-1&&p&&p!=L){j++;p=p->next;}if(!p)return 0;else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}int ListDelete(LinkList *&L,int i,char &e) {第11 页共15 页LinkList *p=L->next,*q;while(j<i-1&&p&&p!=L){j++;p=p->next;}if(!p)return 0;else{q=p->next;if(!q||q==L->next)return 0;e=q->data;p->next=q->next;free(q);return 1;}}void main(){LinkList *h;char b[10],e;int k;cout<<"元素个数:";cin>>k;cout<<"输入元素:";for(int m=0;m<k;m++)cin>>b[m];InitList(h);CreateListR(h,b,k);cout<<"输出循环单链表:";DispList(h);cout<<"循环单链表长度是:"<<ListLength(h)<<endl;if(ListEmpty(h))cout<<"循环单链表为空"<<endl;elsecout<<"循环单链表不为空"<<endl;cout<<"循环单链表第3位元素是:"<<GetElem(h,3,e)<<endl;cout<<"元素a的位置是:第"<<LocateElem(h,'a')<<"位"<<endl;ListInsert(h,4,'f');cout<<"在第4个元素上插入元素f:";DispList(h);12cout<<"删除循环单链表第3个元素:";ListDelete(h,3,e);DispList(h);DestroyList(h);}2.7#include<iostream.h>#include<malloc.h>typedef struct polynomial{int coef; //系数int index; //指数struct polynomial *next;}LinkList;void CreateList(LinkList *&L, int n){LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList));r=L;for(i=0;i<n;i++){s=(LinkList*)malloc(sizeof(LinkList));cout<<"依次输入多项式系数和指数:";cin>>s->coef>>s->index;s->next = NULL;r->next=s;r=s;}}void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;}void AddList(LinkList *&list1,LinkList *&list2,int m,int n) {LinkList *s,*r,*t;int i;s=list1->next;r=list2->next;t=list1;第13 页共15 页for(i=0;i<n;i++){if(s==NULL){s=list1->next;t=list1;}while(s!=NULL){if(s->index!=r->index){s=s->next;t=t->next;}else break;}if(!s){s=(LinkList*)malloc(sizeof(LinkList));s->coef=r->coef;s->index=r->index;s->next=NULL;t->next=s;s=s->next;r=r->next;continue;}else{if(s->index==r->index)s->coef=s->coef+r->coef;if(s->coef==0){LinkList *temp1;temp1=s;s=s->next;t->next=s;delete temp1;}}r=r->next;s=NULL;}cout<<"多项式相加的结果是:";14list1=list1->next;while(list1){cout<<list1->coef<<"x^"<<list1->index;if(list1->next!=NULL)cout<<"+";list1=list1->next;}}void DispList(LinkList *L){L=L->next;while(L){cout<<L->coef<<"x^"<<L->index;if(L->next!=NULL)if(L->next->coef>0)cout<<"+";L=L->next;}}void main(){LinkList *list1,*list2;InitList(list1);InitList(list2);int m,n;cout<<"请输入第一个多项式的项数:";cin>>m;CreateList(list1,m);cout<<"多项式表示是:";DispList(list1);cout<<endl;cout<<"请输入第二个多项式的项数:";cin>>n;CreateList(list2,n);cout<<"多项式表示是:";DispList(list2);cout<<endl;AddList(list1,list2,m,n);cout<<endl;}第15 页共15 页。
数据结构..实验报告线性表的基本操作数据结构实验报告线性表的基本操作1.引言本实验报告旨在介绍线性表的基本操作。
线性表是一种常见的数据结构,它是一组有限元素的有序集合,其中每个元素之间存在一个特定的顺序关系。
线性表的操作包括插入、删除、查找等,这些操作对于有效地管理和利用数据非常重要。
2.实验目的本实验的目的是通过实践理解线性表的基本操作,包括初始化、插入、删除、查找等。
通过编写相应的代码,加深对线性表的理解,并掌握相应的编程技巧。
3.实验内容3.1 初始化线性表初始化线性表是指创建一个空的线性表,为后续的操作做准备。
初始化线性表的方法有多种,如顺序表和链表等。
下面以顺序表为例进行说明。
顺序表的初始化包括定义表头指针和设置表的长度等操作。
3.2 插入元素插入元素是指将一个新的元素插入到线性表的指定位置。
插入元素有两种情况:插入到表的开头和插入到表的中间。
插入元素的操作包括移动其他元素的位置以腾出空间,并将新的元素插入到指定位置。
3.3 删除元素删除元素是指将线性表中的某个元素删除。
删除元素有两种情况:删除表的开头元素和删除表的中间元素。
删除元素的操作包括将被删除元素的前一个元素与后一个元素进行连接,断开被删除元素与表的联系。
3.4 查找元素查找元素是指在线性表中寻找指定的元素。
查找元素的方法有多种,如遍历线性表、二分查找等。
查找元素的操作包括比较目标元素与线性表中的元素进行匹配,直到找到目标元素或遍历完整个线性表。
4.实验步骤4.1 初始化线性表根据线性表的类型选择相应的初始化方法,如创建一个空的顺序表并设置表的长度。
4.2 插入元素输入要插入的元素值和插入的位置,判断插入的位置是否合法。
如果合法,移动其他元素的位置以腾出空间,将新的元素插入到指定位置。
如果不合法,输出插入位置非法的提示信息。
4.3 删除元素输入要删除的元素值,判断元素是否在线性表中。
如果在,则找到目标元素的前一个元素和后一个元素,进行连接删除操作。
数据结构--实验报告线性表的基本操作数据结构--实验报告线性表的基本操作一、引言本实验报告旨在通过实际操作,掌握线性表的基本操作,包括初始化、插入、删除、查找等。
线性表是最基本的数据结构之一,对于理解和应用其他数据结构具有重要的作用。
二、实验目的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 释放线性表的内存空间[实验结果]使用线性表进行各种基本操作的测试,并记录操作的结果和运行时间。
数据结构线性表实验报告数据结构线性表实验报告实验目的:本次实验主要是为了学习和掌握线性表的基本操作和实现方式。
通过实验,我们可以加深对线性表的理解,并能够熟悉线性表的基本操作。
实验设备与环境:本次实验所需的设备包括计算机和编程环境。
我们选择使用C语言来实现线性表的操作,并在Visual Studio Code编程软件中进行编写和调试。
实验内容:1.线性表的定义和基本操作1.1 线性表的定义:线性表是一种有序的数据结构,其中的元素按照一定的顺序存储,可以插入、删除和访问元素。
1.2 线性表的基本操作:1.2.1 初始化线性表:创建一个空的线性表。
1.2.2 判断线性表是否为空:判断线性表是否不含有任何元素。
1.2.3 获取线性表的长度:返回线性表中元素的个数。
1.2.4 在线性表的指定位置插入元素:在线性表的第i个位置插入元素x,原第i个及其之后的元素依次后移。
1.2.5 删除线性表中指定位置的元素:删除线性表中第i个位置的元素,原第i+1个及其之后的元素依次前移。
1.2.6 获取线性表中指定位置的元素:返回线性表中第i个位置的元素的值。
1.2.7 清空线性表:将线性表中的元素全部删除,使其变为空表。
2.线性表的顺序存储结构实现2.1 线性表的顺序存储结构:使用数组来实现线性表的存储方式。
2.2 线性表的顺序存储结构的基本操作:2.2.1 初始化线性表:创建一个指定长度的数组,并将数组中的每个元素初始化为空值。
2.2.2 判断线性表是否为空:判断线性表的长度是否为0。
2.2.3 获取线性表的长度:返回线性表数组的长度。
2.2.4 在线性表的指定位置插入元素:将要插入的元素放入指定位置,并将原位置及其之后的元素依次后移。
2.2.5 删除线性表中指定位置的元素:将指定位置的元素删除,并将原位置之后的元素依次前移。
2.2.6 获取线性表中指定位置的元素:返回指定位置的元素的值。
2.2.7 清空线性表:将线性表数组中的每个元素赋空值。
线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。
在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。
线性表有两种存储结构:顺序存储结构和链式存储结构。
顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。
其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。
链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。
其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。
四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。
1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。
实现顺序表的初始化函数,将表的长度初始化为 0。
实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。
实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。
实现顺序表的遍历函数,输出表中的所有元素。
2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。
实现链表的创建函数,创建一个空链表。
实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。
实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
数据结构线性表实验报告数据结构线性表实验报告1.实验目的1.1 理解线性表的概念和操作方法1.2 学习线性表的顺序存储结构和链式存储结构1.3 掌握线性表的各种基本操作算法2.实验内容2.1 实现线性表的顺序存储结构a. 定义顺序存储结构的数据类型和长度b. 实现线性表的初始化操作c. 实现线性表的插入操作d. 实现线性表的删除操作e. 实现线性表的查找操作2.1.6 实现线性表的更新操作2.1.7 实现线性表的打印操作2.2 实现线性表的链式存储结构a. 定义链式存储结构的数据类型和长度b. 实现线性表的初始化操作c. 实现线性表的插入操作d. 实现线性表的删除操作e. 实现线性表的查找操作2.2.6 实现线性表的更新操作2.2.7 实现线性表的打印操作2.3 实现线性表的其他操作a. 实现线性表的长度计算b. 实现线性表的合并操作c. 实现线性表的排序操作3.实验步骤3.1 初始化线性表a. 选择合适的存储结构b. 设置线性表的初始状态c. 完成线性表的初始化工作3.2 插入操作a. 根据线性表的存储结构选择插入点b. 将要插入的元素放入插入点位置c. 调整线性表的长度和位置3.3 删除操作a. 根据线性表的存储结构选择删除点b. 删除指定位置的元素c. 调整线性表的长度和位置3.4 查找操作a. 根据线性表的存储结构选择查找方法b. 实现线性表的按值查找3.4.3 实现线性表的按位置查找3.5 更新操作a. 根据线性表的存储结构选择更新点b. 更新指定位置的元素c. 调整线性表的长度和位置3.6 打印操作a. 根据线性表的存储结构选择打印方法b. 实现线性表的打印功能4.实验结果4.1 实现了线性表的顺序存储结构,包括初始化、插入、删除、查找、更新和打印功能4.2 实现了线性表的链式存储结构,包括初始化、插入、删除、查找、更新和打印功能4.3 实现了线性表的其他操作,包括长度计算、合并和排序操作5.实验总结5.1 通过本次实验,掌握了线性表的基本概念和操作方法5.2 熟悉了线性表的顺序存储结构和链式存储结构的实现方式5.3 熟练使用了线性表的各种基本操作算法附件:●附件1:代码实现●附件2:实验数据法律名词及注释:1.著作权:著作权是指作者对其创作的文学、艺术和科学等作品享有的法律权利。
线性表上机实习1、实验目的(1)熟悉将算法转换为程序代码的过程。
(2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。
(3)熟练掌握顺序表的基本运算:查找、插入、删除等,掌握顺序表的随机存取特性。
(4)了解线性表的链式存储结构,熟练掌握线性表的链式存储结构的C语言描述方法。
(5)熟练掌握线性链表(单链表)的基本运算:查找、插入、删除等,能在实际应用中灵活选择适当的链表结构。
2、实验要求(1)熟悉顺序表的插入、删除和查找。
(2)熟悉单链表的插入、删除和查找。
3、实验内容:①顺序表(1)抽象数据类型定义typedef struct {TypeData data[maxsize]; //容量为maxsize的静态顺手表int n; //顺序表中的实际元素个数}SeqList; //静态顺序表的定义在本次实验中,首先建立一个空的静态顺序表,然后键盘输入数据存入表中,然后进入菜单选择界面,通过不同的数字输入,实现对顺序表,删除,插入,查找,显示等操作。
(2)存储结构定义及算法思想在顺序表结构体的定义中,typedef int TypeData 为整型,存储结构如下:for(n=0;n<m;n++){cout<<"请输入线性表数据"<<endl;cin>>[n]; //顺序将数据存入顺序表} //其他存储与此类似,都是直接赋值与数组的某一位插入版块子函数:void insert(SeqList &L) //插入数据{int a,b,c,k;cout<<"请输入插入的数及其插入的位置"<<endl;cin>>a>>b;if(b<=0||b>+1)) {cout<<"不能在该位置插入"<<endl; return;} //判断插入位置是否合法k=[b-1];[b-1]=a; c=; =+1;while(c>b){[c]=[c-1];c--; //通过循环,实现插入位置后的数据挨个往后移动一位}[b]=k;}顺序表的插入与删除操作类似,在插入与删除后,都要循环调整后面数组的每一位元素,同时记录数据元素的长度的标示符也要跟着改变。
实验一_线性表操作_实验报告实验一:线性表操作一、实验目的1.理解线性表的基本概念和特点。
2.掌握线性表的基本操作,包括插入、删除、查找等。
3.通过实验,提高动手能力和解决问题的能力。
二、实验原理线性表是一种较为常见的数据结构,它包含零个或多个数据元素,相邻元素之间有前后关系。
线性表具有以下特点:1.元素之间一对一的顺序关系。
2.除第一个元素外,每个元素都有一个直接前驱。
3.除最后一个元素外,每个元素都有一个直接后继。
常见的线性表有数组、链表等。
本实验主要针对链表进行操作。
三、实验步骤1.创建链表:首先创建一个链表,并给链表添加若干个节点。
节点包括数据域和指针域,数据域存储数据,指针域指向下一个节点。
2.插入节点:在链表中插入一个新的节点,可以选择在链表的头部、尾部或中间插入。
3.删除节点:删除链表中的一个指定节点。
4.查找节点:在链表中查找一个指定数据的节点,并返回该节点的位置。
5.遍历链表:从头节点开始,依次访问每个节点的数据。
四、实验结果与分析1.创建链表结果:我们成功地创建了一个链表,每个节点都有数据域和指针域,数据域存储数据,指针域指向下一个节点。
2.插入节点结果:我们成功地在链表的头部、尾部和中间插入了新的节点。
插入操作的时间复杂度为O(1),因为我们只需要修改指针域即可。
3.删除节点结果:我们成功地删除了链表中的一个指定节点。
删除操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要删除的节点。
4.查找节点结果:我们成功地在链表中查找了一个指定数据的节点,并返回了该节点的位置。
查找操作的时间复杂度为O(n),因为我们可能需要遍历整个链表才能找到要查找的节点。
5.遍历链表结果:我们成功地遍历了整个链表,并访问了每个节点的数据。
遍历操作的时间复杂度为O(n),因为我们可能需要遍历整个链表。
通过本次实验,我们更加深入地理解了线性表的基本概念和特点,掌握了线性表的基本操作,包括插入、删除、查找等。
实验目的实验内容和要求源代码顺序表的代码单链表的代码测试结果顺序表的测试结果单链表的测试结果五、心得体会实验一线性表的基本操作及其应用一、实验目的1.帮助读者复习C++语言程序设计中的知识。
2.熟悉线性表的逻辑结构。
3.熟悉线性表的基本运算在两种存储结构上的实现。
4.掌握顺序表的存储结构形式及其描述和基本运算的实现。
5.熟练掌握动态链表结构及有关算法的设计二、实验内容题目一: 顺序表的基本操作[问题描述]实现顺序表的建立、求长度, 取元素、修改元素、插入、删除等顺序表的基本操作。
[基本要求](1)依次从键盘读入数据, 建立带头结点的顺序表;(2)输出顺序表中的数据元素(3)求顺序表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。
(6)根据算法, 将两个有序的顺序表合并成一个有序顺序表。
[测试数据] 由学生任意指定。
题目二: 单链表的基本操作[问题描述]实现带头结点的单链表的建立、求长度, 取元素、修改元素、插入、删除等单链表的基本操作。
[基本要求](1)依次从键盘读入数据, 建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。
(6)根据算法, 将两个有序的单链表合并成一个有序单链表。
[测试数据]由学生任意指定。
三、源代码顺序表的基本操作#include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct { //结构体ElemType *elem;int length;int listsize;}SqList;SqList Lx;Status InitList_Sq(SqList &L) //分配空间{ L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW);L.length =0;L.listsize=LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e) //插入新元素{ int *q,*p;ElemType *newbase;if(i<1 || i>L.length+1) return ERROR;if(L.length>=L.listsize){ newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status Listlength(SqList L) //长度{ int *p=L.elem; //判断线形表是否存在while(p){ return (L.length); }}Status GetElem(SqList L, int i,ElemType &e) //取元素{ if(i<1 || i>L.length)return ERROR;else{ e=L.elem[i-1];return e;}}void MergeList(SqList La,SqList Lb,SqList &Lc) //合并{ ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while((i<=La_len)&&(j<=Lb_len)){ GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ ListInsert(Lc,++k,ai);++i; }else{ ListInsert(Lc,++k,bj);++j; }}while(i<=La_len){ GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){ GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}void show(SqList L,int i) //显示{ int j;ElemType k;cout<<"顺序表显示如下:"<<endl;for(j=0;j<i-1;j++){ k=L.elem[j];cout<<k<<"->"; }if(j==i-1 && i>0){ k=L.elem[j]; cout<<k; }cout<<endl;}void create(SqList &L,int n) //输入元素{ int e;for(int i=0;i<n;i++){ cin>>e;L.elem[i]=e;L.length=i+1; }}Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除{ ElemType *p, *q;if(i<1 || i>L.length) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p) *(p-1)=*p;--L.length;return OK;}Status Listxiugei(SqList &L,int i,ElemType &e) //修改{ if(i<1 || i>L.length)return ERROR;else{ L.elem[i-1]=e;return OK; }}void shuru(SqList &L1) //顺序表的创建{ int a;InitList_Sq(L1);cout<<"请输入顺序表的长度: ";cin>>a;cout<<"请输入顺序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);}void chaxun(SqList &L1) //取第i个位置的元素{ int j;ElemType e1;cout<<"请选择所要取出元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误, 请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>j; }GetElem(L1,j,e1);cout<<"取出的元素为:"<<e1<<endl; }void xiugai(SqList &L1) //修改第i个位置的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要修改元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误, 请重新输入"<<endl;cout<<"请选择所要修改元素的位置:";cin>>j; }cout<<"要修改成的元素:";cin>>e1;Listxiugei(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a);}void shanchu(SqList &L1) //删除顺序表里的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误, 请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>j; }ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a-1);}void charu(SqList &L1) //插入元素到顺序表里{ int a; int j; ElemType e1;a=L1.length;cout<<"请选择所要插入元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误, 请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>j; }cout<<"要插入的元素:";cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a+1);}void hebing(SqList &L3) //合并两个顺序表{ SqList L1,L2;int a,b;InitList_Sq(L1); InitList_Sq(L2);cout<<"请输入第一个有序表的长度: "; cin>>a;cout<<"请输入第一个有序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);cout<<"请输入第二个有序表的长度: "; cin>>b;cout<<"请输入第二个有序表的元素(共"<<b<<"个)"<<endl;create(L2,b);show(L2,b);MergeList(L1,L2,L3);cout<<"合并后的有序表如下: "; show(L3,a+b);}void main() //主菜单{ int choice;for(;;){ cout<<" 顺序表的基本操作"<<endl;cout<<" 1.顺序表的创建"<<endl;cout<<" 2.顺序表的显示"<<endl;cout<<" 3.顺序表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到顺序表里"<<endl;cout<<" 7.删除顺序表里的元素"<<endl;cout<<" 8.合并两个顺序表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择: ";cin>>choice;switch(choice){ case 1: shuru(Lx);break;case 2: show(Lx,Lx.length);break;case 3: cout<<"顺序表的长度:"<<Listlength(Lx)<<endl;break;case 4: chaxun(Lx);break;case 5: xiugai(Lx);break;case 6: charu(Lx);break;case 7: shanchu(Lx);break;case 8: hebing(Lx);break;case 9: cout<<"退出系统!"<<endl;exit(0);break;default : cout<<"输入有误, 请重新选择"<<endl;break; } }}单链表的基本操作#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode //存储结构{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n) //尾插法创建单链表{ LinkList p;L=new LNode;L->next=NULL; //建立一个带头结点的单链表LinkList q=L; //使q指向表尾for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素{ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error; //第i个元素不存在e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) //插入{ LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; } //寻找第i-1个结点if(!p||j>i-1)return error; //i小于1或者大于表长加1 LinkList s=new LNode; //生成新结点s->data=e;s->next=p->next; //插入L中p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e) // 删除{ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){ //寻找第i个结点, 并令p指向其前驱p=p->next;++j; }if(!(p->next)||j>i-1) return error; //删除位置不合理q=p->next;p->next=q->next; //删除并释放结点e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){ //合并两个顺序链表LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L) //显示{ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i) //表长{ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L) //修改{ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing() //合并两个单链表{ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个): "<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个): "<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下: "<<endl;show(Lc);}void main() //主函数{ int select;int x;ElemType y;LinkList list;for(;;){ cout<<" 单链表的基本操作"<<endl;cout<<" 1.单链表的创建"<<endl;cout<<" 2.单链表的显示"<<endl;cout<<" 3.单链表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到单链表里"<<endl;cout<<" 7.删除单链表里的元素"<<endl;cout<<" 8.合并两个单链表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择所要取出元素的位置:";cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误, 请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>x; }GetElem(list,x,y);cout<<"该位置的元素为:"<<y<<endl;break;case 5: xiugai(list); break;case 6: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误, 请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 7: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误, 请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 8: hebing();break;case 9: exit(0);break;default : cout<<"输入有误, 请重新输入"<<endl;break;}}}四、测试结果顺序表的测试结果单链表的测试结果五、心得体会当听到老师说写数据结构实验报告时, 我有点惊讶, 才学了不到一个月, 就要写实验报告。
《数据结构》实验报告实验题目:线性表的操作实验目的:1.掌握上机调试线性表的基本方法;2.掌握线性表的一些基本操作;实验内容:将两个有序链表合并为一个有序链表一、需求分析1.实验程序中先创建两个有序链表,演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入两个链表中的相应数据。
2.将两个链表合并时可按数据从大到小或从小到大合并,用户根据提示可选择一种排序方式。
3.程序执行命令包括:(1)构造链表;(2)输入数据;(3)合并两个链表,根据用户需求选择一种排序方式;(4)将合并结果输出;(5)结束4.测试数据:链表1数据为:2,4,6,7,10链表2数据为:1,3,5,6,7,12按从小到达合并为:1,2,3,4,5,6,6,7,7,10,12;按从大到小合并为:12,10,7,7,6,6,5,4,3,2,1;二、概要设计1.基本操作Linklist creat ()操作结果:构造一个链表,并输入数据,返回头节点指针。
void print(Linklist head)初始条件:链表已存在;操作结果:将链表输出。
void MergeList_1(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从小到大的顺序合并。
void MergeList_2(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从大到小的顺序合并。
2.本程序包括四个模块:(1)主程序模块;(2)链表数据输入模块;(3)链表合并模块;(4)链表输出模块;三、详细设计1.元素类型,节点类型,指针类型主程序模块 数据输入 按从小到大合并两链表 按从大到小合并两链表 将新链表输出 将新链表输出typedef struct LNode //定义节点{int data;struct LNode *next;}LNode,* Linklist;2.每个模块的分析(1)主函数模块int main(){Linklist head1,head2;int i;printf("请输入链表1数据(由小到大,输入0表示输入结束):\n");head1=creat(); //创建链表1,将头结点指针返回为head1printf("请输入链表2数据(由小到大,输入0表示输入结束):\n");head2=creat();printf("请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):");scanf("%d",&i); //创建链表2,将头结点指针返回为head2if(i==1) //选择两种排序方式,如果输入1,则合并后按从小到大输出;输入其它数,合成链表按从大到小输出{printf("按小到大将两表合并得:\n");MergeList1(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}else{ printf("按从大到小将两表合并得:\n");MergeList2(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}return 0;}(2)数据输入创建链表模块Linklist creat() //创建链表函数,并将创建链表的头结点指针返回{Linklist head,p,s;int z=1,x;head=(LNode *) malloc(sizeof(LNode));p=head;while(z){scanf("%d",&x);if(x!=0) //输入0表示链表数据输入结束{s=(LNode *)malloc(sizeof(LNode));s->data=x;p->next=s;s->next=NULL;p=s;}elsez=0;}return(head);}(3)合并链表模块,两个函数分别表示两种排序方式,将链表合并后直接在函数中调用链表输出函数void print(Linklist head)将链表输出void MergeList_1(Linklist La,Linklist Lb)//已知链表La和Lb元素都按从小到大排列,将La和Lb合并成新链表,其中元素也按从小到大排列{Linklist pa,pb,pc,Lc;pa = La->next; pb = Lb->next;Lc = pc = La; //把La的头节点作为新建链表Lc的头结点while (pa && pb){if (pa->data <= pb->data){pc->next = pa;pc = pa;pa = pa->next;}else{pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb; //插入剩余段print(Lc); //将链表Lc输出}void MergeList_2(Linklist La,Linklist Lb)//已知链表La和Lb的元素都按从小到大排列,合并La和Lb得到新链表,其中元素按照从大到小的顺序排列{Linklist pa,qa,pb,qb,Lc; //设指针qa,qb,分别作为pa,pb的前驱的指针pa=La->next;pb=Lb->next;Lc=La;Lc->next=NULL;while(pa&&pb){if(pa->data<=pb->data){qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}else{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}}while(pa) //如果pa不为空,则将La链的剩余段倒叙插入到头节点的后面{qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}while(pb) //如果pb不为空,则将Lb链的剩余段倒叙插入到头结点的后面{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}print(Lc); //将新合成的链表Lc输出}(4)链表输出模块,实现最终链表的输出void print(Linklist head) //链表输出函数,将链表输出{LNode *p;p=head->next;if(head!=NULL)do{printf("%d ",p->data);p=p->next;} while (p);printf("\n");四、程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.0;(2)进入演示程序后显示提示信息:请输入链表1数据(由小到大,输入0表示输入结束):按要求输入数据请输入链表2数据(由小到大,输入0表示输入结束):按要求输入数据请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):输入数据选择合并方式2.测试结果对链表1输入数据2,4,6,7,10,0对链表2输入数据1,3,5,6,7,12,0输入数据选择排序方式:如果输入:1 输出结果为:1,2,3,4,5,6,6,7,7,10,12如果输入:3(整数非1)输出结果为:12,10,7,7,6,6,5,4,3,2,13.调试中遇到的错误分析第一次运行时有问题,看以看出它的排序方式是对的,但是输出是多出前面一个很大的数,可能是输出函数void print(Linklist head)有问题,检查程序:此处逻辑出错,直接将p指针指向head,然后就将p->data输出,因此第一个数是头指针head所对应节点的值,所以可将p=head;改为p=head->next;这样p就指向第一个节点。
数据结构实验报告(实验名称)1.实验目标a)熟练掌握线性表的顺序存储结构和链式存储结构。
b)熟练掌握顺序表和链表的有关算法设计。
c)根据具体问题的需要,设计出合理的表示数据的顺序和链式结构,并设计相关算法2.实验内容和要求a)每个题目分别用顺序存储和链式存储实现;b)实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;c)程序有适当的注释3.数据结构设计顺序表和链表4.算法设计求两个递增有序线性表L1和L2中的公共元素,放入新的顺序表L3中。
算法思想:将两个顺序表L1,L2之间的元素进行比较,若L1中元素大于L2中元素,则L2往后移1个元素至有与L1中元素相等时,将该元素放至新的顺序表L3中,反之,若L2中大于L1的元素,则移动L1的元素至有与L2中元素相等时,将该元素存储到L35.运行和测试链表1.实验1插入位置5插入位置n插入位置n+1插入位置0插入位置1插入位置12第二组数据2.删除删除位置5删除位置10删除位置1删除位置11删除位置12实验3插入25插入85插入110插入8实验4第一组数据第二组数据第三组数据链表实验实验一插入到5位置插入到n位置插入到n+1位置插入到0位置插入到1位置插入到n+2位置实验2删除位置5删除位置n删除位置1删除位置n+1删除位置0实验3插入25插入85插入110插入8实验4第一组数据第二组数据第三组数据6.总结和心得总结:顺序存储:特点:地址连续,随机/存取,顺序存储。
建立:首地址/存储空间大小(数组),表长。
方式:静态和动态。
优点:存储密度大;随机存储:快速存取表中任一位置元素。
缺点:插入删除移动大量元素;对存储空间要求高,会产生存储空间的碎片链式存储:特点:地址可以不连续建立:利用指针。
方式:动态有点:可以有效减少内存的浪费缺点:查找需要一个个查找不能像顺序表一样可以进行“索引”心得:顺序表使用的时候一定要进行初始化,否则程序虽然可以正常运行但是输出的结果不对,而且这种错误还不易找到。
一、实验目的和要求(1)理解线性表的逻辑结构特性。
(2)深入掌握线性表的两种存储方法,即顺序表和链表。
体会这两种存储结构之间的差异。
(3)重点掌握顺序表和链表上各种基本运算的实现。
(4)综合运用线性表解决一些复杂的实际问题。
二、实验内容实验2.1 编写一个程序algo2-1.cpp,实现顺序表的各种基本运算(假设顺序表的元素类型为char),并在此基础上设计一个程序exp2-1.cpp,完成如下功能:(1)初始化顺序表L;(2)采用尾插法依次插入元素a,b,c,d,e;(3)输出顺序表L;(4)输出顺序表L长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第三个元素;(7)输出元素a的位置;(8)在第4个元素位置上插入元素f;(9)输出顺序表L;(10)删除L的第3个元素;(11)输出顺序表L;(12)释放顺序表L。
实验2.2 编写一个程序algo2-2.cpp,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上设计一个程序exp2-2.cpp,完成如下功能:(1)初始化单链表h;(2)采用尾插法依次插入元素a,b,c,d,e;(3)输出单链表h;(4)输出单链表h长度;(5)判断单链表h是否为空;(6)输出单链表h的第三个元素;(7)输出元素a的位置;(8)在第4个元素位置上插入元素f;(9)输出单链表h;(10)删除L的第3个元素;(11)输出单链表h;、(12)释放单链表h。
释放顺序表L。
实验2.3 编写一个程序algo2-3.cpp,实现双链表的各种基本运算(假设双链表的元素类型为char),并在此基础上设计一个程序exp2-3.cpp,完成如下功能:(1)初始化双链表h;(2)采用尾插法依次插入元素a,b,c,d,e;(3)输出双链表h;(4)输出双链表h长度;(5)判断双链表h是否为空;(6)输出双链表h的第三个元素;(7)输出元素a的位置;(8)在第4个元素位置上插入元素f;(9)输出双链表h;(10)删除L的第3个元素;(11)输出双链表h;、(12)释放双链表h。
数据结构线性表实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中线性表的基本概念、存储结构和操作算法,并通过实际编程实现来提高对线性表的应用能力和编程技能。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验内容(一)线性表的顺序存储结构顺序表是用一组地址连续的存储单元依次存储线性表的数据元素。
其特点是逻辑上相邻的元素在物理位置上也相邻,便于随机存取,但插入和删除操作需要移动大量元素,效率较低。
(二)线性表的链式存储结构链表是通过指针将一组零散的存储单元链接成一个线性序列。
常见的链表有单链表、双向链表和循环链表。
链表的插入和删除操作只需修改指针,无需移动元素,但随机存取效率较低。
(三)线性表的基本操作实现1、初始化线性表2、销毁线性表3、清空线性表4、判断线性表是否为空5、获取线性表的长度6、获取指定位置的元素7、查找指定元素在线性表中的位置8、在线性表指定位置插入元素9、删除线性表指定位置的元素四、实验步骤(一)顺序表的实现1、定义顺序表的结构体,包括数据存储数组和表的长度。
2、实现顺序表的初始化函数,分配初始存储空间并设置表长度为0。
3、销毁顺序表函数,释放存储空间。
4、清空顺序表函数,将表长度置为 0。
5、判断顺序表是否为空,根据表长度判断。
6、获取顺序表长度,直接返回表长度。
7、获取指定位置元素,检查位置合法性后返回对应元素。
8、查找指定元素位置,遍历表进行比较。
9、插入元素函数,检查插入位置合法性,若合法则移动后续元素,插入新元素并更新表长度。
10、删除元素函数,检查删除位置合法性,若合法则移动后续元素,更新表长度。
(二)链表的实现1、定义链表节点结构体,包含数据域和指针域。
2、实现链表的初始化函数,创建头节点。
3、销毁链表函数,遍历链表释放节点内存。
4、清空链表函数,遍历链表删除节点但保留头节点。
5、判断链表是否为空,检查头节点的指针域是否为空。
数据结构实验报告1线性表的顺序存储结构一、实验目的本次实验的主要目的是深入理解线性表的顺序存储结构,并通过编程实现其基本操作,包括创建线性表、插入元素、删除元素、查找元素以及输出线性表等。
通过实际操作,掌握顺序存储结构的特点和优势,同时也了解其在不同情况下的性能表现。
二、实验环境本次实验使用的编程语言为C++,编译环境为Visual Studio 2019。
三、实验原理1、线性表的定义线性表是由 n(n≥0)个数据元素组成的有限序列。
在顺序存储结构中,线性表的元素存储在一块连续的存储空间中,通过数组来实现。
2、顺序存储结构的特点存储密度高,无需额外的指针来表示元素之间的关系。
可以随机访问表中的任意元素,时间复杂度为 O(1)。
插入和删除操作需要移动大量元素,平均时间复杂度为 O(n)。
四、实验内容及步骤1、定义线性表的数据结构```cppdefine MAX_SIZE 100 //定义线性表的最大长度typedef struct {int dataMAX_SIZE; //存储线性表元素的数组int length; //线性表的当前长度} SeqList;```2、初始化线性表```cppvoid InitList(SeqList L) {L>length = 0; //初始时线性表长度为 0}```3、判断线性表是否为空```cppbool ListEmpty(SeqList L) {return (Llength == 0);}```4、求线性表的长度```cppint ListLength(SeqList L) {return Llength;}```5、按位查找操作```cppint GetElem(SeqList L, int i) {if (i < 1 || i > Llength) {printf("查找位置不合法!\n");return -1;}return Ldatai 1;}```6、按值查找操作```cppint LocateElem(SeqList L, int e) {for (int i = 0; i < Llength; i++){if (Ldatai == e) {return i + 1;}}return 0; //未找到返回 0}```7、插入操作```cppbool ListInsert(SeqList L, int i, int e) {if (L>length == MAX_SIZE) {//表已满printf("表已满,无法插入!\n");return false;}if (i < 1 || i > L>length + 1) {//插入位置不合法printf("插入位置不合法!\n");return false;}for (int j = L>length; j >= i; j) {//移动元素L>dataj = L>dataj 1;}L>datai 1 = e; //插入元素L>length++;//表长加 1return true;}```8、删除操作```cppbool ListDelete(SeqList L, int i) {if (L>length == 0) {//表为空printf("表为空,无法删除!\n");return false;}if (i < 1 || i > L>length) {//删除位置不合法printf("删除位置不合法!\n");return false;}for (int j = i; j < L>length; j++){//移动元素L>dataj 1 = L>dataj;}L>length; //表长减 1return true;}```9、输出线性表```cppvoid PrintList(SeqList L) {for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);}printf("\n");}```10、测试用例```cppint main(){SeqList L;InitList(&L);ListInsert(&L, 1, 10);ListInsert(&L, 2, 20);ListInsert(&L, 3, 30);ListInsert(&L, 4, 40);ListInsert(&L, 5, 50);printf("线性表的长度为:%d\n", ListLength(L));printf("查找第 3 个元素:%d\n", GetElem(L, 3));int loc = LocateElem(L, 30);if (loc) {printf("元素 30 的位置为:%d\n", loc);} else {printf("未找到元素 30\n");}ListDelete(&L, 3);printf("删除第 3 个元素后的线性表:");PrintList(L);return 0;}```五、实验结果及分析1、实验结果成功创建并初始化了线性表。
数学与计算科学学院实验报告实验项目名称线性表的顺序表示与实现所属课程名称数据结构实验类型验证型实验日期班级学号姓名成绩2.调试第一次出现的错误:原因:由于许多变量未定义,以及没有头文件与宏定义所以错误许多,还有更多错误没有显示出来3.将以下语句编入程序中:#include "stdio.h"#include "stdlib.h"#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define LIST_INIT_SIZE 9#define LISTINCREMENT 2typedef int ElemType;typedef int Status;4.调试第二次出现以下错误:原因:是在每个算法中有许多变量未定义,导致许多错误5.再将语句:int *newbase;int *q;int *p;写入插入算法中;将语句:int *p;int *q;写入删除算法中;6.调试第三次显示没有错误:7.运行第一次显示结果为:8.但运行后的界面显得很单调;要是忘记下一个算法是什么就容易输入出错,也不适合大众使用;因此为了将程序优化,所以在主函数中增加以下输入输出语句和条件语句;为了让程序更加严谨,因此还加入一些循环语句。
int i,p,q;p=2,q=2;printf("请输入您想构建的顺序表(元素为%d个):\n",LIST_INIT_SIZE);printf("您构建的顺序表是:\n");printf("请输入您想在第几个元素位置前插入元素:\n",LIST_INIT_SIZE);while((i<=0||i>L.length)&&p>=0){printf("输入的数字错误,(只剩下%d次重新输入符合要求的数字的机会)\n",p);--p;if(p<0){printf("原因:您输入数字错误过多,程序终止运行\n");return ERROR;}scanf("%d",&i);}printf("请输入您想插入的数:\n");printf("形成的新顺序表为:\n");printf("请输入您想删除的是第几个元素:\n");while((i<=0||i>L.length)&&q>=0){printf("输入的数字错误,(只剩下%d次重新输入符合要求的数字的机会)\n",q);--q;ListInsert_Sq(L,i,e);printf("形成的新顺序表为:\n");for(i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");printf("请输入您想删除的是第几个元素:\n");scanf("%d",&i);while((i<=0||i>L.length)&&q>=0){printf("输入的数字错误,(只剩下%d次重新输入符合要求的数字的机会)\n",q);--q;if(q<0){printf("原因:您输入数字错误过多,程序终止运行\n");return ERROR;}scanf("%d",&i);}ListDelect_Sq(L,i,e);printf("删除的数为:\n");printf("%d\n",e);printf("形成的新顺序表为:\n");for(i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");return 0;}10. 调试第四次显示没错误:11.运行第二次显示结果为:12.运行第三次显示结果为:13.运行第四次显示结果为:这样那么程序就完整了,清晰明了,用户运行的时候也容易知道自己要输入什么了【实验结论】(结果)附录1:源程序附录2:实验报告填写说明1.实验项目名称:要求与实验教学大纲一致。
实验报告实验名称:线性表——栈和队列实验目的:(1)、熟悉C语言的上机环境,进一步掌握C语言的结构特点;(2)、掌握线性表的队列的定义及C语言实现;(3)、掌握线性表在序表中的各种基本操作;实验步骤:(1)建立栈方面首先要建立结构体,并定义相关的指针,然后再建立一个空的栈,建立好后首先要申请空间,并判断该栈是空的。
(2)建立栈方面首先要建立结构体,并定义相关的指针,然后再建立一个空的栈,建立好后首先要申请空间,并判断该栈是空的。
(3)、建立带头节点的单链表,节点的值域整型数据。
要求将用户输入的数据按尾插入法来建立相应单链表一个实验内容:.回文判断。
试编写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字母序列。
其中序列1和序列2中不含字符‘&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属于该模式的字符序列,而‘1+3&3-1’则不是。
实验数据记录:(源代码及执行过程)#include <stdio.h>void main(){char c[80];int i=0;printf("请输入一个字符串来判断是否为回文:");gets(c);while(c[i++]!='\0');i=i-2;for(int j=0;j<=i/2;j++)if(c[j]!=c[i-j]) break;if(j<=i/2)printf("%s不是回文!\n",c);else printf("%s是回文!\n",c);}运行结果:。