数据结构实验报告 有序表合并
顺序表合并实验体会
顺序表合并实验体会
在进行顺序表合并的实验过程中,我深刻体会到了数据结构的重要性以及合并操作的灵活性。
通过这个实验,我进一步巩固了对顺序表的理解,并学会了如何将两个有序的顺序表合并成一个有序表。
在合并两个顺序表时,我首先需要判断两个表是否为空,若有一个为空,则直接返回另一个表。
然后,我创建一个新的顺序表作为合并后的结果表,并设置两个指针分别指向两个表的起始位置。
接下来,我使用循环来比较两个指针所指向的元素大小,并将较小的元素插入结果表中。
然后,将指向较小元素的指针向后移动一位,再次进行比较,重复这个过程直到其中一个表中的元素全部插入到结果表中。
当其中一个表的元素全部插入到结果表后,我将剩余的表中的元素依次插入到结果表的末尾。
最后,返回结果表即可完成合并操作。
通过这个实验,我深刻认识到了顺序表合并的重要性。
顺序表合并不仅可以提高数据存储的效率,还可以简化数据操作的过程。
在实际应用中,顺序表合并被广泛应用于各个领域,如数据库查询、数据分析等。
在实验中我还发现,合并操作的灵活性可以通过改变合并的顺序来实现不同的效果。
例如,如果我将两个表的元素按照从大到小的顺
序合并,则结果表将按照从大到小的顺序排列。
这种灵活性使得顺序表合并操作具有很大的应用潜力。
总的来说,顺序表合并实验让我更加深入地理解了数据结构中的顺序表,并通过实际操作掌握了顺序表合并的方法和技巧。
这对我以后的学习和工作都具有重要的意义。
通过这个实验,我不仅提高了对数据结构的理解能力,还锻炼了自己的编程能力和问题解决能力。
我相信,在今后的学习和工作中,这些能力都将对我产生积极的影响。
数据结构实验一_顺序表的基本操作实验报告
实验一顺序表的基本操作一、实验目的掌握线性表的顺序表基本操作:建立、插入、删除、查找、合并、打印等运算。
二、实验要求包含有头文件和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_线性表的顺序存储和操作(有序表的合并)
实验一线性表的顺序存储和操作(有序表的合并)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、基本思想大体上的方法与“有序顺序表的插入”方法类似。
创建两个数组,实现两个有序顺序表。
需定义第二个表长length2,逐个将第二个顺序表中的数据与第一个数据表中的数据对比大小,并按大小顺序排列、合并,生成第三个表。
最后输出。
2、编码#include<iostream>using namespace std;const int MaxSize=200;class SeqList{ public:SeqList(int a[],int n);int Length();void Insert(int b[],int length2);void PrintList();private:int data[MaxSize];int length;};SeqList::SeqList(int a[],int n){int i;if(n>MaxSize)throw"参数非法";for(i=0;i<n;i++)data[i]=a[i];length=n;}int SeqList::Length(){return length;}void SeqList::Insert(int b[],int length2) { int j,h,i=0;for( j=0;j<length&&i<length2;++j){if(b[i]<data[j]){ for(h=length;h!=j;--h)data[h]=data[h-1];data[j]=b[i];++length;++i;}else if(j==length-1&&b[i]>data[length-1]) {data[length]=b[i];length++;++i;}}}void SeqList::PrintList(){for(int i=0;i<length;i++)cout<<data[i]<<" ";cout<<endl;}void main(){int a[6]={1,5,8,10,15,21};int b[3]={6,13,18};SeqList s(a,6);SeqList c(b,3);cout<<"合并前的顺序表A"<<endl;s.PrintList();cout<<"合并前的顺序表B"<<endl;c.PrintList();cout<<"合并后的顺序表C"<<endl;int x=c.Length();s.Insert(b,x);s.PrintList();}四、调试与运行1、调试时遇到的主要问题及解决括号、花括号未正确配对,出现混乱导致编译出错;第一次运行成功,由于数组输出语句为cout<<data[i]<<endl;界面如下:经调整数组输出语句为cout<<data[i]<<””;cout<<endl;2、运行结果(输入及输出,可以截取运行窗体的界面)五、实验心得写程序代码时务必认真。
链表合并实验报告
《数据结构》实验报告◎实验题目: 实现两个有序循环链表的合并◎实验目的:掌握链表的建立、遍历以及数据的插入,加深对链表的理解。
◎实验内容:设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列),list1和list2分别为指向两个链表的头指针。
请写出将这两个链表合并为一个带头结点的有序循环链表的算法。
一、需求分析1、输入:该实验需要建立循环链表,以及读入数据,输出数据,并实现合并。
该链表输入为整数形式,输入值的范围为整个整数域。
2、输出:而输出的形式为整数。
3、程序功能:该程序实现了循环链表的建立,读入和输出数据,主要功能为实现了两个有序循环链表的合并。
4、程序执行命令:(1)创建链表(2)输入数据(3)合并链表(4)输出合并后链表(5)结束5、测试数据:假设第一个链表的输入数据个数为5,其分别为1、3、5、7、9,第二个链表的输入数据个数为3个,其分别为7、9、10,则合并后应输出结果:1 3 5 7 7 9 9 10。
二概要设计为了实现上述操作,应以单向循环链表为存储结构。
本程序的主程序的流程为:本程序的调用函数有创建链表函数create,输出函数displist,以及合并函数add三个模块,其中这三个函数都在主函数中被调用,三个调用函数为平行关系。
三详细设计1.元素类型,结点类型和指针类型:typedef int elemtype;typedef struct lnode{elemtype data;struct lnode *next;}linklist;linklist *s,*r;linklist *list1,*list2,*list3; 2.每个模块的分析:(1)主程序模块:main(){linklist *l1,*l2,*l3;int i,x,n;printf("请输入要建立的链表节点个数:\n");scanf("%d",&n);create(l1,n);displist(l1);getch();printf("请输入要建立的链表节点个数:\n");scanf("%d",&n);create(l2,n);displist(l2);getch();add(l1,l2,l3);printf("合并后链表:\n");displist(l3);getch();return 0;}(2)链表创建并输入数据create(linklist *&l,int n){linklist *s,*r;int i;l=(linklist *)malloc(sizeof(linklist));l->next=NULL;r=l;for(i=0;i<n;i++){s=(linklist *)malloc(sizeof(linklist));printf("\n请输入新节点数据:\n");scanf("%d",&s->data) ;r->next=s;r=s;}r->next=l->next;}(3)数据输出displist(linklist *l){linklist *p=l->next;do{printf("%5d",p->data);p=p->next;}while(p!=l->next);printf("\n");}(4)链表合并add(linklist *l1,linklist *l2,linklist *&l3){linklist *list1,*list2,*list3;l3=(linklist *)malloc(sizeof(linklist));l3->next=NULL;list3=l3;list1=l1->next;list2=l2->next;do{if(list1->data<=list2->data){list3->next=list1;list1=list1->next;list3=list3->next;}else{list3->next=list2;list2=list2->next;list3=list3->next;}} while(list3->next!=l1->next&&list3->next!=l2->next);if(list3->next==l2->next)while(list3->next!=l1->next){list3->next=list1;list3=list1;list1=list1->next;}elsewhile(list3->next!=l2->next){list3->next=list2;list3=list2;list2=list2->next;}list3->next=l3->next;}(5)函数调用关系图main()create()displist()add()diaplist()3.完整的程序:(见源文件).四使用说明、测试分析及结果1.程序使用说明:(1)本程序的运行环境为VC6.0。
数据结构实验报告(实验)
深 圳 大 学 实 验 报 告课程名称: 数据结构实验与课程设计 实验项目名称: 实验一:顺序表的应用 学院: 计算机与软件学院 专业: 指导教师: **报告人: 文成 学号: ********** 班级: 5 实验时间: 2012-9-17实验报告提交时间: 2012-9-24教务部制一、实验目的与要求:目的:1.掌握线性表的基本原理2.掌握线性表地基本结构3.掌握线性表地创建、插入、删除、查找的实现方法要求:1.熟悉C++语言编程2.熟练使用C++语言实现线性表地创建、插入、删除、查找的实现方法二、实验内容:Problem A: 数据结构——实验1——顺序表例程Description实现顺序表的创建、插入、删除、查找Input第一行输入顺序表的实际长度n第二行输入n个数据第三行输入要插入的新数据和插入位置第四行输入要删除的位置第五行输入要查找的位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行插入操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行删除操作后,顺序表内的所有数据,数据之间用空格隔开第四行输出指定位置的数据Sample Input611 22 33 44 55 66888 352Sample Output11 22 33 44 55 6611 22 888 33 44 55 6611 22 888 33 55 6622HINT第i个位置是指从首个元素开始数起的第i个位置,对应数组内下标为i-1的位置Problem B: 数据结构——实验1——顺序表的数据交换Description实现顺序表内的元素交换操作Input第一行输入n表示顺序表包含的·n个数据第二行输入n个数据,数据是小于100的正整数第三行输入两个参数,表示要交换的两个位置第四行输入两个参数,表示要交换的两个位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行第一次交换操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行第二次交换操作后,顺序表内的所有数据,数据之间用空格隔开注意加入交换位置的合法性检查,如果发现位置不合法,输出error。
有序顺序表合并
(4)主函数:
#include"Common.h"
int main()
{
Seqlist LA,LB,LC;
int n;
cout<<"请输入顺序表LA的长度:";
cin>>n;
cout<<"请输入要归并的顺序表LA:";
Creat(LA,n);
cout<<"你输入的顺序表LA为:";
for(int i=0;i<n;i++)//输出顺序表LA
在对上述测试的第二种情况时出现了一些错误久久不能改正也困扰了自己很久不过最终通过自己的努力成功克服了这也是使我自己非常高兴的
1.问题描述
设计一个两个顺序表合的程序。根据用户输入的两个顺序表将其合并后并输出;例如:
输入:1 2 3和2 3 5合并后得到:1 2 2 3 3 5;输入:1 3 6 9和2 4 7 8得到1 2 3 4 6 7 8 9
cout<<LA.elem[i]<<' ';
cout<<endl;
cout<<"请输入顺序表LB的长度:";
cin>>n;
cout<<"请输入要归并的顺序表LB:";
Creat(LB,n);
cout<<"你输入的顺序表LB为:";
for(int i=0;i<n;i++)//输出顺序表LB
cout<<LB.elem[i]<<' ';
数据结构线性表操作实验报告
《数据结构》实验报告实验题目:线性表的操作实验目的: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就指向第一个节点。
数据结构实验两个有序顺序表的合并
南昌大学实验报告学生姓名:李木子学号: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语言程序设计》,苏小红,高等教育出版社。
数据结构 耿国华 西北大学 2-10有序顺序表的合并
被删除结点的前驱。
{
p = p->next;
}
q = p->next;
//找到经第 m 次报数的人
m = q->data;
p->next = q->next; //删除结点
printf("%3d",q->location); //输出该人的位置 }
free(q); p->next = NULL; printf("\n"); }
void FormTail(LinkList L) //建立单向循环链表 {
Node * s,* r; int num; int k=1; char temp[80]; r = L;
printf("Everyone's password is:\n"); while(1) {
fflush(stdin); gets(temp);
个元素值递增有序的顺序表 LC。C
[基本要求]
要求在 O(n)的时间复杂度下完成有序顺序表的合并。
[测试数据]
LA=(2,2,3),LB=(1,3,3,4),
合并结果 LC=(1,2,2,3,3,3,4)
约瑟夫环
[问题描述]
约瑟夫(Joeph)问题的一种描述是:编号为 1,2,…,n 的 n 个人按顺时针方向围坐一圈,
L->last=-1; }
void CrtSeqList(SeqList *L) {int i;int length; printf("请输入要建立的顺序表中元素个数:"); scanf("%d",&length); for(i=0;i<length;i++) {printf("\n 请输入第%d 个元素值:",i);
2018~2019(1)-数据结构与算法-有序单链表的合并-实验报告模板
《数据结构与算法》实验报告
一、实验题目:有序单链表的合并
二、实验目的
1、掌握单链表的基本原理,基本操作的方法,以及上机调试单链表的基本方法;
2、掌握单链表的基本操作,插入、删除、查找、合并等运算在链式存储结构上的实现和应用。
三、实验内容
1、建立两个有序的单链表,表中元素的数据类型自己指定;
2、将建立的两个链表合并为一个新的有序的单链表;
3、输出显示已合并好的有序的单链表。
四、实验要求
1、认真阅读本实验的内容和要求,设计和掌握单链表的存储结构和本实验的相关算法;
2、上机实验前预先书写好源程序,上机调试通过本实验程序;
3、保存和打印出程序的运行结果,并结合程序进行分析。
五、算法思想
通过流程图等描述工具描述算法思想
六、实验中遇到的问题及解决方法
七、实验结果
实验运行结果截图
八、实验总结及心得
九、源代码。
有序表的合并的标准实验报告Word版
软件工程专业类课程实验报告课程名称:学院专业:学生姓名:学号:指导教师:日期:电子科技大学计算机学院实验中心电子科技大学实验报告一、实验室名称:二、实验项目名称:有序单链表的合并三、实验原理:合并单链表算法的思想描述,因这是本实验重点,这里老是就不写了。
四、实验目的:1. 掌握带头结点的单链表建立,插入,删除,查找等基本操作的设计与实现2. 通过单链表的排序编程理解单链表与顺序表操作的区别与联系3. 理解单链表对集合操作的实现4. 掌握有序集合合并的算法设计与存储结构的关系,及时空复杂度与算法性能的关系五、实验内容:1. 编程实现建立单链表的操作2. 编程实现单链表的排序3. 编程实现用单链表合并有序表,使得合并结果有序,但是要求不额外增加内存空间存放合并后的数据,时间开销尽量少六、实验器材(设备、元器件):电脑1台;XP或者windows 7操作系统Visual studio 2010开发环境七、实验步骤:1. 项目分析与概要设计(1)输入:第一个单链表长度第一个单链表的所有数据第二个单链表长度第二个单链表的所有数据(2)输出:2个有序单链表合并成一个有序表(3)算法分析与概要设计:a). 实现两个有序单链表的合并,首先要保证输入的单链表有序,因此要判断单链表是否有序,如果无序,要先重新对单链表进行排序,然后才能够做合并操作。
b). 因为单链表合并后不能增加额外空间,所以原来单链表的结点要串连到新的合并后的单链表中,原来的单链表合并后将不再存在。
原来的单链表有2个头结点,合并后只有一个单链表,因此有一个头结点将被释放。
这里选择A集合的头结点为合并后的头结点,而原来B集合的头结点将被释放。
合并有序单链表的算法流程图见图1所示。
图1 有序单链表的合并的概要设计流程图2. 数据结构与详细设计(1)数据结构采用带头结点的单链表存储数据,结点结构如下:struct node {int value;struct node * next;};typedef struct node Node;typedef struct node *ptrList,*List;(2)详细设计根据概要设计流程图,需要实现如下功能:建立带头结点的单链表;判断单链表是否有序;单链表排序;合并有序表使其仍然有序;打印输出单链表的所有数据。
数据结构实验报告
void main()
{
SeqList LA,LB,LC;
LA=creat_SeqList();
LB=creat_SeqList();
printf("list LA:");
print_SeqList(LA);
printf("list LB:");
print_SeqList(LB);
printf("\n");
LC=Merge_SeqList(LA,LB);
printf("Output union list:\n");
print_SeqList(LC);
}
typedef struct
{
int data[MAXSIZE];
int len;
}SeqList;
SeqList creat_SeqList()
{
SeqList l;
int i=0;
printf("input sequece list(0 end):\n");
scanf("%d",&l.data[i]);
实验一顺序存储的有序表归并
1.问题描述:已知两有序表SA、SB,其元素均为递增有序,将此两表归并成一个新的有序表SC,并保持递增顺序。
2.基本要求:输入按非递减有序的两有序表SA、SB,对SA、SB进行非递减归并,归并以后的有序表为SC。
3.测试数据
有序表SA:1 3 5 7有序表SB:2 4 6 8
{
SC.data[k]=SB.data[j];
k++;j++;
}
SC.len=SA.len+SB.len+1;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.一开始输入输出函数在主函数里,发现太繁琐,所以把输入输出提取出来,做了一个新函数。
收获:程序可以用简洁的程序取代繁琐的程序。
通过本次实验对链表的理解更加深刻。