数据结构实验报告 有序表合并

合集下载

顺序表合并实验体会

顺序表合并实验体会

顺序表合并实验体会
在进行顺序表合并的实验过程中,我深刻体会到了数据结构的重要性以及合并操作的灵活性。

通过这个实验,我进一步巩固了对顺序表的理解,并学会了如何将两个有序的顺序表合并成一个有序表。

在合并两个顺序表时,我首先需要判断两个表是否为空,若有一个为空,则直接返回另一个表。

然后,我创建一个新的顺序表作为合并后的结果表,并设置两个指针分别指向两个表的起始位置。

接下来,我使用循环来比较两个指针所指向的元素大小,并将较小的元素插入结果表中。

然后,将指向较小元素的指针向后移动一位,再次进行比较,重复这个过程直到其中一个表中的元素全部插入到结果表中。

当其中一个表的元素全部插入到结果表后,我将剩余的表中的元素依次插入到结果表的末尾。

最后,返回结果表即可完成合并操作。

通过这个实验,我深刻认识到了顺序表合并的重要性。

顺序表合并不仅可以提高数据存储的效率,还可以简化数据操作的过程。

在实际应用中,顺序表合并被广泛应用于各个领域,如数据库查询、数据分析等。

在实验中我还发现,合并操作的灵活性可以通过改变合并的顺序来实现不同的效果。

例如,如果我将两个表的元素按照从大到小的顺
序合并,则结果表将按照从大到小的顺序排列。

这种灵活性使得顺序表合并操作具有很大的应用潜力。

总的来说,顺序表合并实验让我更加深入地理解了数据结构中的顺序表,并通过实际操作掌握了顺序表合并的方法和技巧。

这对我以后的学习和工作都具有重要的意义。

通过这个实验,我不仅提高了对数据结构的理解能力,还锻炼了自己的编程能力和问题解决能力。

我相信,在今后的学习和工作中,这些能力都将对我产生积极的影响。

数据结构实验一_顺序表的基本操作实验报告

数据结构实验一_顺序表的基本操作实验报告

实验一顺序表的基本操作一、实验目的掌握线性表的顺序表基本操作:建立、插入、删除、查找、合并、打印等运算。

二、实验要求包含有头文件和main函数;1.格式正确,语句采用缩进格式;2.设计子函数实现题目要求的功能;3.编译、连接通过,熟练使用命令键;4.运行结果正确,输入输出有提示,格式美观。

三、实验设备、材料和工具1.奔腾2计算机或以上机型2.turboc2,win-tc四、实验内容和步骤1. 建立一个含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。

2. 往该顺序表中第i位置插入一个值为x的数据元素。

3. 从该顺序表中第j位置删除一个数据元素,由y返回。

4. 从该顺序表中查找一个值为e的数据元素,若找到则返回该数据元素的位置,否则返回“没有找到”。

五、程序#include<stdio.h>#include<stdlib.h>#define list_init_size 10#define increment 2typedef struct {int *elem;int length,listsize;}sqlist; //类型定义void initlist_sq(sqlist &L) //初始化顺序表{ }void output(sqlist L) //输出顺序表{ }void insertlist(sqlist &L,int i, int x) //顺序表中插入x{ }void deletelist(sqlist &L,int j, int y) //顺序表中删除y{ }int locateelem(sqlist &L,int e) //顺序表中查找e{ }void main(){ }【运行结果】void initlist_sq(sqlist &L) //初始化顺序表{L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));if(!L.elem) exit (OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZE;return OK;}void output(sqlist L) //输出顺序表{for(int i=0;i<=L.length-1;i++)printf("%d,",L.elem[i]);return OK;}void insertlist(sqlist &L,int i, int x) //顺序表中插入x{int p,q;if(i<1||i>L.length+1)return ERROR;if(L.length>=L.listsize){newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));if(!newbasde)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;*p=x;++L.length;return ok;}void deletelist(sqlist &L,int j, int y) //顺序表中删除y{int p,q;if(i<1||I>L.length+1) return ERROR;p=&(L.elem[i-1]);y=*p;q=L.elem+L.length-1;for(++p;p<=q;++p)*(p-1)=*p;--L.length;return ok;}int locateelem(sqlist &L,int e) //顺序表中查找e { int p;i=1;p=L.elem;while(i<=L.length&&!(*p++,e))++i;if(i<=L.length) return i;else return 0;}void main(){int d,p,a,b;int c;initlist_sq(&L);output( L);insertlist( &L, d, a);deletelist( &L, p, b);locateelem( &L, c);}。

数据结构实验两个有序顺序表的合并

数据结构实验两个有序顺序表的合并

南昌大学实验报告学生姓名:李木子学号:专业班级:软工实验类型:□验证□综合□设计□创新实验日期:实验成绩:一、实验项目名称两个有序顺序表的结合二、实验目的顺序表的创建.实现顺序表的追加.实现顺序表的显示.两顺序表的合并三、实验基本原理四、主要仪器设备及耗材电脑,五、实验步骤******************************************** 顺序表的创建 ** .实现顺序表的追加 ** .实现顺序表的显示 ** .两顺序表的合并 ********************************************<><>;************************************* 顺序表结构体的定义 ************************************* {[];;};************************************ * 函数声明 * ************************************ (*);(*);();();(*);(*);(***);************************************ * 顺序表的初始化函数 * ************************************ (*){>;}************************************ * 顺序表的追加函数 * ************************************ (*){(>){("\顺序表是满的!");();}>[>];>>;}。

有序链表的合并实验总结

有序链表的合并实验总结

有序链表的合并实验总结有序链表的合并是计算机科学中常见的操作之一,它在许多算法和数据结构中都有广泛的应用。

本文将对有序链表的合并进行实验总结,并探讨其应用和实现方法。

我们需要了解什么是有序链表。

有序链表是一种数据结构,它按照某种规则将元素按顺序排列在链表中。

在有序链表中,每个节点都包含一个值和一个指向下一个节点的指针。

这种数据结构的优点是插入和删除操作相对容易,但查找操作的效率较低。

因此,在某些场景下,有序链表比其他数据结构更适合。

有序链表的合并就是将两个有序链表合并成一个新的有序链表。

合并的过程是将两个链表中的节点逐个比较,并按照大小顺序插入到新链表中。

具体步骤如下:1. 创建一个新链表和两个指针,分别指向两个待合并的链表的头节点。

2. 比较两个指针所指节点的值的大小,将较小的节点插入到新链表中,并将指针向后移动一位。

3. 重复步骤2,直到有一个链表的指针为空。

4. 将另一个链表剩余的节点直接插入到新链表的末尾。

在实验过程中,我们可以编写一个简单的函数来实现有序链表的合并。

以下是一个示例代码:```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef mergeTwoLists(l1, l2):dummy = ListNode(0) # 创建一个虚拟节点作为新链表的头节点curr = dummy # 创建一个指针指向新链表的当前位置while l1 and l2:if l1.val < l2.val:curr.next = l1l1 = l1.nextelse:curr.next = l2l2 = l2.nextcurr = curr.next# 将剩余的节点直接插入到新链表的末尾if l1:curr.next = l1if l2:curr.next = l2return dummy.next # 返回新链表的头节点```通过上述代码,我们可以在O(n)的时间复杂度内完成两个有序链表的合并,其中n为两个链表的总长度。

数据结构实验两个有序顺序表的合并

数据结构实验两个有序顺序表的合并

南昌大学实验报告学生姓名:李木子学号:8000113146 专业班级:软工133 实验类型:□验证□综合□设计□创新实验日期:实验成绩:一、实验项目名称两个有序顺序表的结合二、实验目的顺序表的创建1.实现顺序表的追加2.实现顺序表的显示3.两顺序表的合并三、实验基本原理四、主要仪器设备及耗材电脑,VC6.0五、实验步骤/*******************************************//* 顺序表的创建 *//* 1.实现顺序表的追加 *//* 2.实现顺序表的显示 *//* 3.两顺序表的合并 *//*******************************************/#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef int datatype;/************************************//* 顺序表结构体的定义 *//************************************/typedef struct{datatype a[MAXSIZE];int size;}sequence_list;/************************************//* 函数声明 *//************************************/void init(sequence_list *slt);void append(sequence_list *slt,datatype x);void display(sequence_list slt);int find(sequence_list slt ,datatype x);void dele(sequence_list *slt,datatype x);void sort(sequence_list *s);void combine( sequence_list *s1 ,sequence_list *s2 ,sequence_list *s3);/************************************//* 顺序表的初始化函数 *//************************************/void init(sequence_list *slt){slt->size=0;}/************************************//* 顺序表的追加函数 *//************************************/void append(sequence_list *slt,datatype x){if(slt->size==MAXSIZE){printf("\n顺序表是满的!");exit(1);}slt->a[slt->size]=x ;slt->size=slt->size+1;}/************************************/ /* 顺序表的显示函数 */ /************************************/ void display(sequence_list slt){int i;if(!slt.size){printf("\n顺序表为空");}else{for(i=0;i<slt.size;i++)printf("\n%d\n",slt.a[i]);}}/************************************/ /* 顺序表的查找函数 */ /* 返回所查数据的下标 */ /************************************/ int find(sequence_list slt ,datatype x) {int i=0;while(i<slt.size &&slt.a[i]!=x)i++;return(i<slt.size? i:-1);}/************************************/ /* 顺序表的删除函数 */ /************************************/ void dele(sequence_list *slt,datatype x) {int i=0;i=find(*slt,x);for(;i<slt->size-1;i++)slt->a[i]=slt->a [i+1];slt->size--;}/************************************//* 顺序表的插入函数 *//************************************/ void insert(sequence_list *slt,datatype x) {int i=0;i=find(*slt,x);for(;i<slt->size-1;i++)slt->a[i+1]=slt->a [i];slt->size++;}/************************************//* 顺序表排序 *//************************************/ void sort(sequence_list *s){int i ;int j ;int temp ;for(i=0;i<s->size-1;i++){for(j=i+1;j<s->size;j++){if(s->a[i]>=s->a[j]){temp=s->a[i];s->a[i]=s->a[j];s->a[j]=temp;}}}}/************************************//* 两个有序顺序表连接函数 *//************************************/void combine( sequence_list *s1 , sequence_list *s2 , sequence_list *s3 ) {int i=0;int j=0;int k=0;while( i < s1->size && j < s2->size){if(s1->a[i]<=s2->a[j]){s3->a[k]=s1->a[i];i++;}else{s3->a[k]=s2->a[j];j++;}k++;}if(i==s1->size){while(j<s2->size){s3->a[k]=s2->a[j];k++;j++;}}if(j==s2->size){while(i<s1->size){s3->a[k]=s1->a[i];k++;}}s3->size=k;}/************************************/ /* 主函数 */ /************************************/ int main(){int i ;int j ;int x ;int n ;sequence_list list1 ;sequence_list list2 ;sequence_list list3 ;init(&list1);printf("第一个顺序表元素个数:\n");scanf("%d",&n);printf("第一个顺序表输入:\n");for(i=0; i<n ; i++){scanf("%d",&list1.a[i]);list1.size++;}sort(&list1);printf("排序后\n");display(list1);init(&list2);printf("第二个顺序表元素个数:\n");scanf("%d",&n);printf("第二个顺序表输入:\n");for(i=0; i<n ; i++){scanf("%d",&list2.a[i]);list2.size++;}sort(&list2);printf("排序后\n");display(list2);init(&list3);combine(&list1 ,&list2 ,&list3);printf("表一与表二连接后:\n");display(list3);return0;}六、实验数据及处理结果七、思考讨论题或体会或对改进实验的认识八、参考资料[1]《数据结构(c语言版)(第三版)》,李云清,人民邮电出版社[2]《C语言程序设计》,苏小红,高等教育出版社教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

数据结构实验报告 有序表的合并(优质参考)

数据结构实验报告 有序表的合并(优质参考)

数据结构实验报告实验题目:有序表的合并姓名:张耀班级:计嵌151学号: 1513052017一、实验目的把两个有序表归并为一个有序表。

二、数据结构设计(1)存储设计:采用带头结点的单链表存储数据。

输入:数据通过键盘有序输入输出:屏幕显示两个有序表及归并后的表(2)函数设计:CreateList(int n);// 创建具有n个元素的线性链表ListDisplay();//输出表元素Combine(LinkList LA, LinkList LB);//归并单链表LA,LB(3)两个有序表合并算法描述:Step1:初始化。

1.1设置工作指针pa,pb,分别指向两个有序表LA,LB的首元结点。

1.2生成新表LC的头结点,工作指针pc指向LC。

Step2:只要pa和pb有所指,循环执行下列操作。

2.1生成一新节点,链到LC表尾,pc指向它。

2.2如果pa->data<=pb->data:pc->data=pa->data;pa后移。

2.3否则:pc->data=pb->data;pb后移。

Step3:如果pa空,把pb开始的结点依次复制到pc后。

Step4: 如果pb空,把pa开始的结点依次复制到pc后。

三、算法设计与N-S图(1)算法设计:求归并表的过程是在元素有序的情况下不断地从两表中取出元素,添加到新表中,所以元素采取表尾插入。

设两个有序表SA,SB,归并后的有序表为SC,取元素的过程是:依次扫描SA,SB中的元素,比较当前元素的值,将较小的元素赋给SC,直到一个顺序有序表扫描完毕,然后将另一个顺序有序表中余下元素复制到SC中。

(2)程序流程图开始初始化:pa = LA.Head->next; pb = LB.Head->next;pc = Head;pa和pb都不为空生成新节点,连接到LC表尾,pc指向它pa->data<=pb->datapc->data = pb->data;pb = pb->next;pc->data = pa->data;pa = pa->next;pa==N ULLPb!=NULL把pb开始的结点依次复制到pc后面pb==N ULLPa!=NULL把pa开始的结点依次复制到pc后面四、程序清单#include<iostream>using namespace std;结束#include"process.h"struct Node{int data;//数据域,存放表元素Node *next;//指针域,指向下一个结点};class LinkList{private:Node *Head;// 链表头指针public:LinkList();//构造函数,创建空链表void CreateList(int n);//创建具有n个元素的线性链表void ListDisplay();//输出表元素void Combine(LinkList, LinkList);//合并};LinkList::LinkList(){//构建函数,建一空链表Head = new Node;Head->next = NULL;}void LinkList::CreateList(int n){//尾插法(正序)创建具有n个元素的线性表Node *p, *s;//设置工作指针。

实习01_线性表的顺序存储和操作(有序表的合并)

实习01_线性表的顺序存储和操作(有序表的合并)

实验一线性表的顺序存储和操作(有序表的合并)1.目的用顺序表(SqList)类型实现书上算法2.1和2.2,了解线性表及在计算机中的两类不同的存储结构;熟练掌握线性表的查找、插入和删除等算法并灵活运用这些算法。

2.要求用C语言编写程序,其中Lb={2,4,6,8,10} La={1,2,3,4,5},①算法2.1执行后,得到的new La = 1,2,3,4,5,6,8,10②修改Lb=2,6,8,9,11,15,20,并利用新生成的La,得到合并后的Lc,Lc= 1,2,2,3,4,5,6,6,8,8,9,10,11,15,203、预习要求:1、复习书上第20页的例2-1和例2-2;2、复习算法2.3,理解如何构造线性表;3、复习算法2.7,理解算法的执行步骤和含义;4、项目介绍:前面的课程已经学习了如何用C语言描述顺序表、如何初始化顺序表、以及如何在顺序表中插入和删除数据元素。

现在通过两个顺序表的合并的实验,加深对顺序表的理解,熟悉如何将逻辑上的数学模型转化为计算机能够理解的指令代码。

该实验是数据结构课程的第一个实验,实验的目标除了加深理解课堂内容外,还对学生的动手能力提出了更高的要求,锻炼学生动手的能力。

5、算法设计#include <stdio.h>#include <stdlib.h>#include <malloc.h># define TRUE 1# define ERROR 0# define OK 1# define OVERFLOW -2# define FALSE 0# define LIST_INIT_SIZE 10# define LISTINCREMENT 5void main(){List La,Lb,Lc;int j,b[7]={2,6,8,9,11,15,20};InitList(La); // 创建空表La。

如不成功,则会退出程序的运行for(j=1;j<=5;j++) // 在表La中插入5个元素,依次为1、2、3、4、5 ListInsert(La,j,j);printf("La= ");ListTraverse(La,printer); // 输出表La的内容InitList(Lb); // 创建空表Lbfor(j=1;j<=5;j++) // 在表Lb中插入5个元素,依次为2、4、6、8、10 ListInsert(Lb,j,2*j);printf("Lb= ");ListTraverse(Lb,printer); // 输出表Lb的内容Union(La,Lb); // 调用算法2.1,将Lb中满足条件的元素插入La(不改变Lb) printf("new La= ");ListTraverse(La,printer); // 输出新表La的内容ClearList(Lb); // 清空表Lbfor(j=1;j<=7;j++) // 在表Lb中重新依次插入数组b[]的7个元素ListInsert(Lb,j,b[j-1]);printf("Lb= ");ListTraverse(Lb,printer); // 输出表Lb的内容MergeList(La,Lb,Lc); // 调用算法2.2,生成新表Lc(不改变表La和表Lb)printf("Lc= ");ListTraverse(Lc,printer); // 输出表Lc的内容}6.小结线性表是软件设计中最基础的数据结构。

数据结构实验一顺序表实验报告

数据结构实验一顺序表实验报告

数据结构实验一顺序表实验报告一、实验目的本次实验的主要目的是通过实现顺序表的基本操作,深入理解线性表的逻辑结构和存储结构,掌握顺序表的插入、删除、查找等操作的实现方法,提高编程能力和问题解决能力。

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

三、实验原理顺序表是一种线性表的存储结构,它使用一组连续的存储单元依次存储线性表中的元素。

在顺序表中,元素的逻辑顺序与物理顺序是一致的。

顺序表的基本操作包括初始化、插入、删除、查找、遍历等。

在实现这些操作时,需要考虑顺序表的存储空间是否已满、插入和删除元素时元素的移动等问题。

四、实验内容(一)顺序表的定义```cdefine MAXSIZE 100 //定义顺序表的最大长度typedef struct {int dataMAXSIZE; //存储顺序表的元素int length; //顺序表的当前长度} SeqList;```(二)顺序表的初始化```cvoid InitList(SeqList L) {L>length = 0;}```(三)顺序表的插入操作```cint InsertList(SeqList L, int i, int e) {if (L>length == MAXSIZE) {//顺序表已满return 0;}if (i < 1 || i > L>length + 1) {//插入位置不合法return 0;}for (int j = L>length; j >= i; j) {//移动元素L>dataj = L>dataj 1;}L>datai 1 = e; //插入元素L>length++;return 1;}```(四)顺序表的删除操作```cint DeleteList(SeqList L, int i, int e) {if (L>length == 0) {//顺序表为空return 0;}if (i < 1 || i > L>length) {//删除位置不合法}e = L>datai 1; //取出被删除的元素for (int j = i; j < L>length; j++){//移动元素L>dataj 1 = L>dataj;}L>length;return 1;}```(五)顺序表的查找操作```cint SearchList(SeqList L, int e) {for (int i = 0; i < Llength; i++){if (Ldatai == e) {return i + 1;}}}```(六)顺序表的遍历操作```cvoid TraverseList(SeqList L) {for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);}printf("\n");}```五、实验步骤1、打开 Visual Studio 2019,创建一个新的 C 语言项目。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验有序表合并姓名:窦晓磊班级:软件工程142
学号:********** 试验时间:2015.10.11
1.问题描述
把两个有序表归并为一个有序表。

2.数据结构设计
链表结点的结构为:
Typedef struct Node{
T data;
Node *next;
};
3.算法设计
(1)表的输入和输出。

设计一个输入输出函数Node *CreateList()。

Step1:设计指针。

Node *q, //工作指针,存储head
*Head, //头指针
*p; //工作指针,存储数据
int size, //用于存储有序表元素的个数
n; //元素的输入
Step2:利用指针进行输入。

q=Head=new Node; //建立头结点
利用循环输入
for(int i=1;i<=n;i++)
{
p=new Node; //建立结点
cin>>n; //输入元素
p->data=n; //将输入的元素赋值给链表
Head->next=p; //尾指针后移
Head=p; //指向下一个结点
Head=p;
}
Head->next=NULL; //设置尾指针
Head=q;
Step3:输出。

for(p=Head->next;p!=NULL;p=p->next)
cout<<p->data;
Return Head; //返回Head所指的链表
(2)合并算法
1’初始化
Step1:设置工作指针pa、pb,分别指向两个有序表LA、LB的首元结点。

Node *pa,*pb; //工作指针pa,pb
pa=LA->next;pb=LB->next;
Step2:生成新表LC的头结点,工作指针pc指向LC。

Node *pc;
LC=pc;
2’只要pa和pb有所指,循环执行下列操作。

While(pa!=NULL&&pb!=NULL)
Step1:生成一新结点,链到LC表尾,pc指向它。

LC=new Node;
如果pa->data<=pb->data:pc->data=pa->data;pa后移。

if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next; //指针后移
}
否则:pc->data=pb->data;pb后移。

else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
Step2:如果pb空,把pa开始的结点依次复制到pc
if(pa!=NULL)
{
pc->next=pa;
}
Step3:如果pa空,把pb开始的结点依次复制到pc。

while(pb!=NULL)
{
pc->next=pb;
}
4.运行与测试
(1)运行程序,A表输入11,22,33,44。

B表输入1,13,17,39。

A表输入11,B表输入1,13,17,39。

A表输入11,22,33,44,B表输入1。

A表输入11,22,33,44,B表为空
A表为空,B表输入1,13,17,39
A表为空,B表为空。

A表输入55,B表输入1 13 17 39
5.调试记录及收获。

1.在合并的函数里while后面少了{}导致程序在输出A表B表之后无法进行下去。

2.一开始输入输出函数在主函数里,发现太繁琐,所以把输入输出提取出来,做了一个新函数。

收获:程序可以用简洁的程序取代繁琐的程序。

通过本次实验对链表的理解更加深刻。

相关文档
最新文档