数据结构与算法实验报告-线性表
线性表实验报告
安徽师范大学数学计算机科学学院实验报告专业名称物联网工程实验室 6号楼2060404实验课程数据结构实验名称顺序表姓名庞现然学号 14111206029 同组人员无实验日期 2015.4.91、实验目的1. 熟练掌握顺序表的类型定义和基本操作算法(以建立、插入、删除、遍历、排序和归并等操作为重点)的实现。
2. 通过实验加深对C语言的使用(特别是函数、数组、结构体和指针)。
3. 掌握模块化程序设计方法。
2、实验原理运用各函数的调用,来实现线性表的基本操作。
3、需求分析输:(1)程序目的:实验线性表的基本操作。
(2)输入的形式:线性表(3)输入值的范围:处理范围内(4)输出的形式:线性表(5)程序能达到的功能:实现线性表的基本操作(6)测试数据:13,5,27,9,32,123,76,98,54,874、概要设计typedef int Status;typedef int ElemType;5、详细设计各函数及其定义:开始1.构造初始化线性表!InitList(&L)2.输入10个元素给线性表L(整数):1.输出顺序表DispList(&L); 6.输出元素的位置2.输出顺序表的长度 7.插入数据ListInsert(&L,4,56)3.输入所要查询的元素为序n 8.输出此时的线性表DispList(&L)4.输出第n个数据的值 9.输出顺序表的表长5.输入一个要查询的元素的值 10.删除数据元素ListDelete(&L,n,&e) 11.销毁线性表结束1.Status InitList(Sqlist *L)//初始化线性表!{L->elem = (ElemType *)malloc(LIST_Init_Size*sizeof(ElemType));if(! L->elem) exit (OVERFLOW) ; //储存分配失败L->length = 0; //空表长度为0L->listsize = LIST_Init_Size; //初始储存量return OK;}//InitLIst_Sq2.void DestroyList(Sqlist *L)//销毁线性表!{free(L);}//DestroyList_Sq3.Status ListEmpty(Sqlist L)//判定是否为空表!{if(L.length == 0)return ERROR;//如L为空表,则返回0,否则返回1.return OK;}//ListEmpty_Sq4.Status ListLength(Sqlist *L)//求线性表的长度!{return(L->length);}//ListLength_Sq5.void DispList(Sqlist *L)//输出线性表!{int i;/*if ( ListEmpty(L) == 0 ) return;//判断是否为空? */ for ( i = 0; i<L->length;i++){printf("%d ",L->elem[i]);} printf("\n");}//DIspList_Sq6.int GetElem(Sqlist *L,int i,ElemType *e)//求某个数据元素的值!{if (i<1 || i>L->length) return 0;e = &L->elem[i-1];//该运算返回L中第 i(1≤i≤ListLength(L))个元素的值,存放在e中return OK;}//GetElem_Sq7.int LocateElem(Sqlist *L,ElemType e)//按元素查找!{int i = 0;while (i < L->length && L->elem[i] != e)i++;if (i >= L->length)return 0; //若这样的元素不存在,则返回值为0。
实验报告一
在进行非递减有序线性链表的创建时,如果随机读入数据并不是需要的非递减线性链表。
解决方法:人为的控制读入的数据的顺序,如果运用头插法,则应先插入大的,再插入小的;如果用尾插法,则应先插入小的,然后插入大的。
当进行删除、插入操作时,应该先连接,然后再断开原有的。
{
if (p->next->data<q->next->data)
{ s = p->next;p->next=s->next;}
else
{ s = q->next;q->next = s->next;}//先连接再释放
s->next = c->next;
c->next = s;
}
while (p->next)
实验报告
《数据结构与算法》实验报告
题目:
日期
2012年10月21日
班级
20111121
学号
2011112136
姓名
史彭飞
成绩
实验环境:
WindowsXP
VC++6.0
实验内容与完成情况:
1.设有一个顺序表A,包含n个元素,要求写出一个将该表逆置的算法,并只允许在原表的存储空间外再增加一个附加的工作单元。
}nodetype;
nodetype *create()// create创建创造
{
elemtype d;
nodetype h=NULL,*s,*t;
int i=1;
printf(“建立一个单链表\n”);
while (1)
实验报告
实验报告课题名称:数据结构与算法班级:09网络工程姓名:杨益良学号:2009181105指导老师:梁海丽实验一:线性表的顺序存储一、实验目的1.掌握用C语言调试程序的基本方法。
2.掌握线性表顺序存储的基本运算,如插入、删除等。
二、实验内容线性表在顺序存储结构上的插入元素,删除元素运算三、实验要求1.C++/C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.分析算法,要求给出具体的算法分析结果,并简要给出算法设计小结和心得。
四、源程序#include<stdio.h>#define MAXSIZE 100int list[MAXSIZE];int n;/*insert in a seqlist*/int sq_insert(int list[], int *p_n, int i, int x){int j;if (i<0 || i>*p_n) return(1);if (*p_n==MAXSIZE) return(2);for (j=*p_n+1; j>i; j--)list[j]=list[j-1];list[i]=x;(*p_n)++;return(0);}/*delete in a seq list*/int sq_delete(int list[], int *p_n, int i){int j;if (i<0 || i>=*p_n) return(1);for (j = i+1; j<=*p_n; j++)list[j-1] = list[j];(*p_n)--;return(0);}void main(){int i,x,temp;printf("please input the number for n\n");printf("n=");scanf("%d",&n);for (i=0; i<=n; i++){printf("list[%d]=",i);scanf("%d",&list[i]);}printf("The list before insertion is\n");for (i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("please input the position where you want to insert a value\nposition=");scanf("%d",&i);printf("please input the value you want to insert.\nx=");scanf("%d",&x);temp=sq_insert(list,&n,i,x);switch(temp){case 0:printf("The insertion is successful!\n");printf("The list is after insertion is\n");for(i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("%d\n",n);break;case 1:case 2:printf("The insertion is not successful!\n");break;}/*deleting*/printf("The list before deleting is\n");for (i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("please input the position where you want to delete a value\nposition=");scanf("%d",&i);temp=sq_delete(list,&n,i);switch(temp){case 0:printf("The deleting is successful!\n");printf("The list is after deleting is\n");for(i=0; i<=n; i++) printf("%d ",list[i]);printf("\n");printf("%d",n);break;case 1:printf("The deleting is not successful!");break;}}五、程序运行情况六、实验结果分析在顺序表中插入一个元素后,插入位置及之后的元素后移表长增长1;在顺序表中删除一个元素后,插入位置及之前的元素左移,表长减1;在该实验通过c语言调试程序了解并掌握了线性表在顺序存储结构上插入元素、删除元素的算法设计及相关程序设计和实现方法。
【数据结构算法】实验1 线性表应用-多项式计算(附源代码)
浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验一线性表应用---多项式计算实验成绩指导老师(签名)日期一.实验目的和要求1.进一步掌握线性表的的基本操作。
2.掌握线性表的典型应用----多项式表示与计算。
二. 实验内容1.设用线性表( (a1, e1), (a2, e2), ……, (am, em) ) 表示多项式P(x) = a1*x e1 + a2*x e2+…+ am*x em,其中:a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。
多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。
要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。
2.选做:编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。
要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。
3.填写实验报告,实验报告文件取名为report1.doc。
4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。
三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路※注1:除了[多项式求值]与[多项式相加]两个函数外,线性表的基本操作函数,大部分沿用上学期[线性表的链式/顺序表示和实现]两个实验中的函数。
※注2:选作部分函数功能与思路与非选作部分基本一致,略去思路描述函数:void InitList(LNode *&H)功能:初始化单链表思路:使用附带头结点的方式初始化单链表函数:int LengthList (LNode *H)功能:求单链表长度思路:遍历整个单链表,设置变量记录并返回它的长度函数:bool EmptyList (LNode *H)功能:判断单链表是否为空表思路:判断头结点的后一结点是否为空,若空则为空表函数:void TraverseList(LNode *H)功能:遍历单链表思路:遍历整个单链表,输出所含所有元素函数:bool InsertList ( LNode *&H, ElemType item, int pos)功能:向单链表插入一个元素思路:创建新结点,根据pos的值来确定位置并向单链表中插入新元素。
《数据结构与算法(C++语言版)》第2章 线性表
数据结构与算法 (C++语言版)
第2章 线性表
线性表的类型定义
• 基本概念 • 线性表是由n(n≥0)个类型相同的数据元素组成的有限序 列,通常表示为L=(a1, …, ai–1, ai, ai+1, …, an)。其中,L为线 性表名称,ai为组成该线性表的数据元素,ai–1领先于ai,ai 领先于ai+1,称ai–1是ai的直接前驱元素,ai+1是ai的直接后继 元素。当i=1, 2, …, n–1时,ai有且仅有一个直接后继;当 i=2, 3, …, n时,ai有且仅有一个直接前驱。 • 线性表的长度就是线性表中元素的个数n(n≥0)。当n=0时, 称为空表。在非空表中的每个数据元素都有一个确定的位 置,如a1是第一个数据元素,an是最后一个数据元素,ai是 第i个数据元素。称i为数据元素ai在线性表中的位序。
线性表的类型定义
Prev_Elem(L, cur_e, &pre_e) //返回当前元素的前一个元素值 输入:线性表L。 输出:若cur_e是线性表L的数据元素,且不是第一个,则用 pre_e返回它的直接前驱元 素;否则操作失败,pre_e无定义。 Next_Elem(L, cur_e, &next_e) //返回当前元素的后一个元素值 输入:线性表L。 输出:若cur_e是线性表L的数据元素,且不是最后一个,则用 next_e返回它的直接后继元素;否则操作失败,next_e无定 义。
数据结构实验指导书(新版)
《数据结构和算法》实验指导书实验及学时数分配序号实验名称学时数(小时)1 实验一线性表 42 实验二树和二叉树 23 实验三图 24 实验四查找 25 实验五内部排序 2合计12几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
数据结构与算法实验报告
《数据结构与算法》综合实验报告系别:专业:学生姓名:指导教师:2011年 11月 25日实验目的掌握线性表的建立、插入、删除算法;掌握查找算法;掌握排序算法;实验要求使用C语言(环境任意)开发程序,能够对用户输入的任意一组数据,建立一个线性表,可以输出此线性表。
并且能够对此线性表进行插入、删除、查找、排序等操作。
程序流程建表如下:定义一个整型的数据类型data和next指针:定义头指针和当前结点指针,申请连续空间将单个字节大小复制给头指针,把头指针赋值给当前节点指针:若输入的数是0,则若输入不为0,把输入的数赋值给已申请的新结点,把新结点赋给当前节点的next域,再把新结点赋值给当前结点,以此方法重复执行得到如下链表:输出函数:把头指针赋值给当前结点指针,当当前节点的next域不为空时输出当前节点所指向的数据,把当前结点的next域赋值给当前节点,否则输出链表为空对此线性表进行插入、删除、查询、排序操作把已申请的结点数据域指向所输入的数再把插入w结点赋值头结点,是插入的位置,如果w=0则插入结点的next域赋值给头结点否则如果w>表长,则输出超出范围代码及运行结果(主要语句要求有注释)#include"stdafx.h"#include<stdio.h>#include<malloc.h>#define NULL 0typedef struct linknode{int data;struct linknode *next;}node;node *head;node *creat(){node *currnode,*newnode;int x;head=(node*)malloc(sizeof(node));currnode=head;do{scanf("%d",&x);newnode=(node*)malloc(sizeof(node));newnode->data=x;currnode->next=newnode;currnode=newnode;}while(x!=NULL);head=head->next;currnode->next=NULL;return head;};int length(){node *currnode;int i=0;currnode=head;while(currnode->data!=NULL){currnode=currnode->next;i++;};return i;};void print(){node *currnode;currnode=head;printf("链表如下....linklist");while(currnode->data!=NULL){printf("%d-->",currnode->data);currnode=currnode->next;};printf("NULL\n");printf("链表长度为........linklist length%d\n",length());};void delete1(){int x;node *delnode,*currnode;printf("输入要删除的数据......input delete data:");scanf("%d",&x);if(head->data==NULL) printf("此链表为空无法删除.....this linklist empty!\n"); if(head->data==x){delnode=head;head=head->next;free(delnode);if(head==NULL) printf("此链表为空.......this linklist enpty!");}else{currnode=head;delnode=currnode->next;while(delnode->data!=x&&delnode!=NULL){currnode=currnode->next;delnode=currnode->next;};if(delnode==NULL)printf("无此数据......no this data!\n");else{currnode->next=delnode->next;free(delnode);};};};void find(){node *currnode;int count=1,x;currnode=head;printf("输入要查找的数据.......input search data:");scanf("%d",&x);while(currnode->data!=NULL&&currnode->data!=x) {currnode=currnode->next;count++;};if(currnode->data!=NULL){printf("\n%d为第........is no.",currnode->data);printf("%d个数据........data。
1线性表(栈和队列) 实验报告册(机器人工程4)(1)
实验报告册2020-2021 学年第二学期
课程名称:数据结构B
学院:
专业:
班级:
学号:
学生姓名:
河南工学院实验报告
实验项目线性表(栈和队列)实验日期
班级姓名
指导教师苏强林综合成绩
一、预习内容
1、实验目的和要求
了解栈的先进后出的特点;
掌握队列的基本操作。
2、实验内容和原理
(1)定义一个字符类型的单链表.
(2)编写出实现进栈、出栈、显示栈顶元素等所有函数.
(3)编写一个求十——二进制数转换的算法.
(4)编写一个将中缀表达式转换为后缀表达式的函数,然后编写用后缀表达式求值函数。
(5)定义一个整型的单链队列.
(6)编写实现进队、出队等基本函数。
(7)设计如下选择式菜单,以选择菜单方式进行操作。
二、实验数据(现象)记录及结果处理
三、实验结果分析与讨论
教师评阅意见
(1)实验预习 (30分)成绩:
□预习认真、熟练掌握方法与步骤(30~28) □有预习、基本掌握方法与步骤(27~22) □有预习、但未能掌握方法与步骤(21~18) □没有预习,不能完成实验(17~0)
(2)操作过程 (40分)成绩:
□遵规守纪、操作熟练、团结协作(40~37) □遵规守纪、操作正确、有协作(36~29) □遵规守纪、操作基本正确、无协作(28~24)□不能遵规守纪、操作不正确、无协作(17~0) (3)结果分析 (30分)成绩:
□结果详实、结论清晰、讨论合理(30~28) □结果正确、讨论适当(27~22)
□结果正确、没有分析讨论(21~18) □结果不正确、没有分析讨论(17~0)
其它意见:
教师签名:年月日。
数据结构的实验报告
一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。
二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。
2)向顺序表插入元素:在顺序表的第i个位置插入元素x。
3)从顺序表删除元素:从顺序表中删除第i个位置的元素。
4)查找顺序表中的元素:在顺序表中查找元素x。
5)顺序表的逆序操作:将顺序表中的元素逆序排列。
(2)链表1)创建链表:创建一个带头结点的循环链表。
2)在链表中插入元素:在链表的第i个位置插入元素x。
3)在链表中删除元素:从链表中删除第i个位置的元素。
4)查找链表中的元素:在链表中查找元素x。
5)链表的逆序操作:将链表中的元素逆序排列。
2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。
2)入栈操作:将元素x压入栈中。
3)出栈操作:从栈中弹出元素。
4)获取栈顶元素:获取栈顶元素。
5)判断栈是否为空:判断栈是否为空。
(2)队列1)队列的初始化:创建一个队列,初始化为空。
2)入队操作:将元素x入队。
3)出队操作:从队列中出队元素。
数据结构实验指导书(新版)
《数据结构与算法》实验指导书实验及学时数分配几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
(从键盘接受删除元素位置i,实现删除;显示删除后的线性表)二、用C语言编程实现建立一个单链表,并在此表中插入一个元素和删除一个元素。
《算法与数据结构》实验报告(新)
《算法与数据结构》实验报告学院专业姓名学号每个实验报告的程序名为班级号_学号_姓名_题号.c++(多文件压缩为rar)实验1:ADT List(线性表)(3学时)[问题描述]线性表是典型的线性结构,实现ADT List,并在此基础上实现两个集合的交运算或并运算。
[实验目的](1)掌握线性表的两种存储结构,即顺序表和链表。
(2)掌握在顺序表和单链表上基本操作的实现。
(3)在掌握顺序表和单链表的基本操作上进行综合题的实现。
[实验内容及要求](1)集合的元素限定为十进制数。
(2)任意输入两个集合的元素。
(3)显示两个集合的内容及其运算结果。
[测试数据](1)set1={3, 5, 8, 11},set2={2, 6, 8, 9, 11, 15, 20}set1∪set2=?set1∩set2=?(2)set1={9, 3, 14, 6},set2={1, 30, 3, 7, 14, 25, 6, 3, 19, 9}set1∪set2=?set1∩set2=?[思考](1)算法的复杂度是多少?(2)线性表可以用顺序表或单链表实现,你采用的是哪一种?为什么?(3)若把实验要求(2)更改为两个集合内的元素是递增的,请你提出一种时间复杂度更少的算法,并说明时间复杂度是多少?《算法与数据结构》实验报告学院专业姓名学号每个实验报告的程序名为班级号_学号_姓名_题号.c++(多文件压缩为rar)实验2:串的基本操作的实现(3学时)[问题描述]串是数据类型为字符的特殊的线性表,在串的基本操作中,通常以“串的整体”作为操作对象。
所以串的基本操作和线性表有很大差别。
本实验是实现串的一些基本操作。
[实验目的](1)熟悉串的基本操作的含义。
(2)掌握串的数组存储以及在其上实现串操作的基本方法。
(3)掌握重载操作的设计和实现方法。
[实验内容及要求](1)不允许使用C++语言本身提供的串函数。
(2)利用数组存储实现串的基本操作:即赋值、求长度、连接、求子串、子串定位、替换、退出等操作。
数据结构--实验报告 线性表的基本操作
一、实验目的二、实验内容和要求三、源代码1)顺序表的代码2)单链表的代码四、测试结果1)顺序表的测试结果2)单链表的测试结果五、心得体会实验一线性表的基本操作及其应用一、实验目的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++)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<<"请选择所要取出元素的位置:";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<<"请选择所要取出元素的位置:";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);default : cout<<"输入有误,请重新输入"<<endl;break;}}}四、测试结果1)顺序表的测试结果2)单链表的测试结果五、心得体会当听到老师说写数据结构实验报告时,我有点惊讶,才学了不到一个月,就要写实验报告。
实验报告_线性表
电子科技大学实验报告课程名称:数据结构与算法学生姓名:学号:点名序号:指导教师:实验地点:基础实验大楼实验时间:4月3日2014-2015-2学期信息与软件工程学院实验报告(一)学生姓名:学号:指导教师:实验地点:基础实验大楼实验时间:4月3日一、实验室名称:软件实验室二、实验项目名称:数据结构与算法—线性表的实现三、实验学时:4四、实验原理:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
链式存储方式即可以用于表示线性结构,也可用于表示非线性结构。
一般来说,在线性表的链式存储结构中,各数据结点的存储符号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。
对于线性链表,可以从头指针开始,沿各结点的指针扫描到链表中的所有结点。
线性表的链接存储中,为了方便在表头插入和删除结点的操作,经常在表头结点(存储第一个元素的结点)的前面增加一个结点,称之为头结点或表头附加结点。
这样原来的表头指针由指向第一个元素的结点改为指向头结点,头结点的数据域为空,头结点的指针域指向第一个元素的结点。
五、实验目的:本实验通过定义单向链表的数据结构,设计创建链表、插入结点、遍历结点等基本算法,使学生掌握线性链表的基本特征和算法,并能熟练编写C 程序,培养理论联系实际和自主学习的能力,提高程序设计水平。
六、实验内容:使用数据结构typedef struct node {Elemtype data;struct node *next;} ListNode, *ListPtr;typedef struct stuInfo {char stuName[10]; /*学生姓名*/int Age /*年龄*/} ElemType实现带头结点的单向链表的创建、删除链表、插入结点等操作,并能实现年龄递增的两个单向链表合并一个链表,合并后的链表按年龄递减,可认为同名同年龄是同一个学生,每个学生在合并后的链表中仅出现一次。
数据结构实验报告(一)线性表的应用
数据结构实验报告(⼀)线性表的应⽤实验说明数据结构实验⼀ 线性表的实验——线性表的应⽤⼀、实验⽬的通过本实验使学⽣了解线性表的⼀种简单应⽤,熟悉线性表顺序存储与链式存储的特性,特别训练学⽣编程灵活控制链表的能⼒,为今后编程控制更为复杂的数据结构奠定基础。
⼆、实验内容1.⽤顺序表和链表分别分别编程实现教材中例⼦2-1与2-2。
要求:(1)只能⽤C语⾔编程实现;(2)完全保持书中算法2.1与算法2.2形式,不允许有任何变化,除⾮语法上不允许;所调⽤各函数参照书中19页的功能描述,其中函数名、参数个数及性质、函数功能必须与书中完全⼀致,不能有变化。
2.利⽤线性表表⽰⼀元多项式完成多项式的加、减、乘、求导、求值运算。
要求:(1)输⼊的⼀元多项式可以采⽤只输⼊各项的系数与指数这种简化的⽅式。
如对于多项式2x2+6x5,输⼊可为: 2,2 6,5 这样的简单形式。
(2)遇到有消项时应当处理,如2x2+6x5与3x2-6x5进⾏相加时,结果为5*x^2。
(3)当给定x的值时,能计算表达式相加或相减的结果。
(4)操作的结果放⼊⼀个新线性表中,原来的两个表达式存储表⽰不变,也可以不是产⽣新的线性表,⽽是将两上线性表合并为⼀个。
(5)要求程序功能模块划分合理(每个函数功能单⼀、可重⽤性好),使⽤空间尽可能少,算法尽可能⾼效。
实验报告1.实现功能描述使⽤线性表表⽰⼀元多项式完成多项式的加、减,乘,求导、求值运算。
2.⽅案⽐较与选择(1)因为使⽤的是线性表,所以主要⽅案有数组法和链表法。
(2)从时间复杂度来说,使⽤数组法更优;从空间复杂度来说,链表法更优。
因为数组法是指定好空间的,若式⼦⼤⼩超出设置⼤⼩,那程序必然出错;若式⼦⼤⼩⼩于设置⼤⼩,那就意味着有多余的空间被浪费了。
综合来讲,若计算式⼦较为庞⼤,使⽤链表法更佳;相反,若计算式⼦较⼩,数组法更佳。
3.设计算法描述(1)单个项式的数据存储使⽤了结构体,数组法是在⼀个结构体中定义两个⼀维数组;链表法是通过⼀个结构体作为⼀个节点,通过next指针连接起来。
数据结构与算法综合实验
04
经典问题分析与实现方法论述
最短路径问题——Dijkstra算法和Floyd算法比较
Dijkstra算法
Floyd算法
比较
适用于没有负权边的有向图,通过贪 心策略每次找到距离起点最近的顶点 ,并更新其邻居顶点的距离。时间复 杂度为O(|V|^2),其中|V|为顶点数。
队列是一种特殊的线性 表,其只允许在表的一 端进行插入操作,而在 另一端进行删除操作。 插入元素的一端称为队 尾,删除元素的一端称 为队头。
包括初始化、入队、出 队、判断队列是否为空 等。
包括表达式求值、括号 匹配、迷宫问题、CPU 任务调度等。
树和二叉树基本概念
树定义
树是一种非线性数据结构,由n( n>=0)个有限结点组成一个具有层 次关系的集合。
未来算法的发展将更加注重高效性、 稳定性和可解释性。例如,启发式算 法、近似算法等将在解决NP难问题 中发挥更大作用,通过牺牲部分精度 换取更高的计算效率。同时,随着人 工智能和机器学习的快速发展,智能 算法如神经网络、遗传算法等将在更 多领域得到应用,实现自动化决策和 优化。
要点三
比较
Prim算法适用于稠密图,而Kruskal 算法适用于稀疏图。Prim算法通过不 断扩展已选择顶点的集合来构建最小 生成树,而Kruskal算法通过不断合 并连通分量来构建最小生成树。
拓扑排序问题——Kahn算法和DFS深度优先搜索法比较
Kahn算法
DFS深度优先搜索法
比较
从入度为0的顶点开始,不断删除该 顶点和以该顶点为起点的所有有向边 ,并更新相关顶点的入度。重复此过 程直到所有顶点都被删除或者发现存 在环为止。时间复杂度为O(|V|+|E|) ,其中|V|为顶点数,|E|为边数。
数据结构线性表实验报告
数据结构实验报告(实验名称)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.总结和心得总结:顺序存储:特点:地址连续,随机/存取,顺序存储。
建立:首地址/存储空间大小(数组),表长。
方式:静态和动态。
优点:存储密度大;随机存储:快速存取表中任一位置元素。
缺点:插入删除移动大量元素;对存储空间要求高,会产生存储空间的碎片链式存储:特点:地址可以不连续建立:利用指针。
方式:动态有点:可以有效减少内存的浪费缺点:查找需要一个个查找不能像顺序表一样可以进行“索引”心得:顺序表使用的时候一定要进行初始化,否则程序虽然可以正常运行但是输出的结果不对,而且这种错误还不易找到。
实验一-线性表操作-实验报告
中国矿业大学计算机学院实验报告{cin>>y;if(y==1){cout<<"请输入插入位置和元素的值:"<<endl;cin>>m>>n;ListInsert_Sq(List,m,n);disp(List);}else if(y==2){cout<<"请输入要删除第几个元素:"<<endl;cin>>m;ListDelete_Sq(List,m,j);cout<<j<<endl;disp(List);}else{cout<<"请输入所要查找的元素:"<<endl;cin>>m;cout<<LocateElem_Sq(List,m)<<endl;}}cout<<endl;}运行结果:加强、提高题:2、编写一个求解Josephus问题的函数。
用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人。
然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作为(2)提高:#include<iostream>using namespace std;typedef struct LNode{struct LNode *next;int a;}LNode,*LinkList;class JosephouCircle //定义一个类包括三个元素{public:void SetValue();void PickOut();private:int n;int s;int m;};void JosephouCircle::SetValue() //设置初值的大小{cout<<"请输入参加游戏的总人数:"<<endl;cin>>n;cout<<"请输入开始人的位置:"<<endl;cin>>s;JosephouCircle Jo1;Jo1.SetValue();Jo1.PickOut();return 0;}运行结果:四、实验体会与总结1、对于线性链表和顺序表都属于线性表问题,但是线性链表比顺序表要灵活,方便;2、线性表在做元素寻找的操作的时候,必须从头结点开始寻找。
数据结构实验一(完整版)
数据结构实验一:线性表实验报告#include <string.h>#include <ctype.h>#include <malloc.h> // malloc()等#include <limits.h> // INT_MAX等#include <stdio.h> // EOF(=^Z或F6),NULL#include <stdlib.h> // atoi()#include <io.h> // eof()#include <math.h> // floor(),ceil(),abs()#include <process.h> // exi t()#include <iostream.h> // cout,cin// 函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSEtypedef int ElemType;#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量#define LISTINCREMENT 2 // 线性表存储空间的分配增量struct SqListElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)};/**********************************************************/ /* 顺序表示的线性表的基本操作(12个) *//**********************************************************/ Status InitList(SqList &L){ // 操作结果:构造一个空的顺序线性表---------------1L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)exit(OVERFLOW); // 存储分配失败L.length=0; // 空表长度为0L.listsize=LIST_INIT_SIZE; // 初始存储容量return OK;}Status DestroyList(SqList &L){ // 初始条件:顺序线性表L已存在。
数据结构与算法--线性表
数据结构与算法--线性表⽬录线性结构特点唯⼀头元素唯⼀尾元素除头元素外,都有⼀个直接前驱除尾元素外,都有⼀个直接后继线性表定义语⾔定义线性表是n个数据元素的有限序列。
线性表中的数据元素可以由若⼲个数据项组成。
形式定义线性表可以表⽰成n个数据元素的有限序列(a1,a2,a3……a i-1,a i,……a n)其中a1是头元素,a n是尾元素,a i是第i个元素。
a i-1是a i的直接前驱,a i是a i-1的直接后继。
当2 $\leq$ i $\leq$ n时,a i只有⼀个直接前驱当1 $\leq$ i $\leq$ n-1时,a i只有⼀个直接基本操作InitList(&L)//构造空线性表LDestroyList(&L)//销毁已存在的线性表LClearList(&L)//将L重置为空表ListEmpty(L)//判断列表是否为空ListLength(L)//获取列表长度GetElem(L,i,&e)//返回L中的第i个元素到eLocateElem(L,e,compare())//查找元素e的位置PriorElem(L,cur_e,&pre_e)//查找前驱元素NextElem(L,cur_e,&next_e)//查找后继元素ListInsert(&L,i,e)//插⼊元素ListDelete(&L,i,&e)//删除元素ListTraverse(L,visit())//遍历元素线性表的实现顺序表⽰和实现线性表的顺序表⽰是指⽤⼀组地址连续的存储单元⼀次存储线性表的数据元素,⽤物理位置相邻来表⽰逻辑关系相邻,任意数据元素都可随意存取(故⼜称随机存取结构)readme顺序表中元素下标从0开始以下顺序表的实现可以直接运⾏#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define LIST_INIT_SIZE 100//顺序表初始化长度#define LIST_INCREMENT 10 //每次不⾜时新增长度#define OVERFLOW 0 //分配空间失败#define REFREE 0 //重复释放,释放空指针#define OK 1#define ERROR 0typedef int ElemType;//需要时进⾏修改typedef int Status;template <typename ElemType>//使⽤模板⽅便更多数据类型的使⽤//结构定义class List{public:typedef struct{ElemType *elem;//存储数据元素int length;//表长,初始为0int listsize;//表存储容量,也就是实际分配的存储空间}SqList;SqList L;//线性表List();//构造函数~List();//析构函数Status List_Init();//线性表初始化函数Status List_Insert(int i,ElemType e);//线性表插⼊元素Status List_Delete(int i,ElemType &e);//线性表删除元素Status List_Traverse();//线性表遍历Status List_Destroy();//线性表销毁Status List_Clear();//线性表清空};template <typename ElemType>List<ElemType>::List(){List_Init();//含有指针变量,构造时需要分配空间,不过我们可以直接利⽤线性表的初始化函数}template <typename ElemType>List<ElemType>::~List(){if(!L.elem)//避免我们之前调⽤过线性表的销毁函数,导致重复释放指针free(L.elem);}//线性表的初始化template <typename ElemType>Status List<ElemType>::List_Init(){L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if(!L.elem)//指针为空时,说明分配失败,通常由于内存满了,但这种情况⼀般不会出现exit(OVERFLOW);L.length = 0;L.listsize = LIST_INIT_SIZE;return OK;}//插⼊元素e到顺序表i位置//可以插⼊第0个位置⼀直到第n个位置(第n个位置也就是附加在结尾)template <typename ElemType>Status List<ElemType>::List_Insert(int i, ElemType e){if(i<0||i>L.length)//插⼊位置错误return ERROR;if(L.length>=L.listsize)//空间不⾜时分配空间,相等时说明当前空间已满不能再插⼊元素了,所以也要分配空间{ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));if(!newbase)exit(OVERFLOW);L.elem = newbase;//上述重新分配时,如果后续空间充⾜则会扩展并返回原指针,否则会寻找⼤⼩适合的空间,返回新指针(并⾃动释放原内存),所以elem指针需要进⾏更改。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳工程学院学生实验报告(课程名称:数据结构与算法)实验题目:线性表班级学号姓名地点指导教师实验日期: 年月日一、实验目的1.了解线性表的逻辑结构特性,以及这种特性在计算机内的两种存储结构。
2.掌握线性表的顺序存储结构的定义及其C语言的实现。
3.掌握线性表的链式存储结构——单链表的定义及其C语言的实现。
4.掌握线性表的基本操作二、实验环境Turbo C或是Visual C++三、实验内容与要求实验1 顺序表的操作请编制C程序,利用顺序存储方式来实现下列功能:根据键盘输入数据建立一个线性表,并输出该线性表;然后根据屏幕菜单的选择,可以进行表的创建,数据的插入删除并在插入和删除数据后再输出线性表;最后在屏幕菜单中选择0,即可结束程序的运行。
分析:当我们要在顺序表的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素一次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
当要删除第i个元素时,也只需将第i个元素之后的所有元素前移一个位置。
算法描述:对每个算法,都要写出算法的中文描述。
本实验中要求分别写出在第i个(从1开始计数)结点前插入数据为x的结点、删除指定结点、创建一个线性表。
打印线性表等的算法描述。
实验2 单链表的操作请编制C程序,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。
具体地说,就是要根据键盘输入的数据建立一个单链表;然后根据屏幕菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最后在屏幕菜单中选择0,即可结束程序的运行。
算法描述:本实验要求分别写出在单链表中第i(从1开始计数)个位置之后插入元素、创建单链表、在单链表中删除第i个位置的元素、顺序输出单1链表的内容等的算法描述。
四、实验过程及结果分析实验1 顺序表的操作#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#include<stdio.h>#include<stdlib.h>#define ML 1//线性表#define TURE 1#define FALSE 0#define OK 1#define ERR 0typedef struct{int list[ML];int size;int MAXSIZE;}sqList;sqList *Init_List(sqList *L,int ms);void Disp_List(sqList *L);int LocateElem_List(sqList *L,int x);int Insert_List(sqList *L,int x,int mark);int Delete_List1(sqList *L,int item);int Delete_List2(sqList *L,int mark);sqList *Init_List(sqList *L,int ms){L=(sqList *)malloc(ms*sizeof(sqList));if(!L){printf("Memory allocation failure\n");exit(OVERFLOW);}elseL->size=0;L->MAXSIZE=ms;return L;}void Disp_List(sqList *L){int i;for(i=0;i<L->size;i++)printf("%d",L->list[i]);printf("\n");}int LocateElem_List(sqList *L,int x){ int i=0;for(i=0;i<=L->size;i++)if(L->list[i]==x)return i;if(i>L->size)return -1;}int Insert_List(sqList *L,int x,int mark){ int i=1;if(L->size>=L->MAXSIZE)return -1;if(mark>0){for(i=L->size+1;i>=mark;i--)L->list[i+1]=L->list[i];L->list[i]=x;}else if(mark<0)L->list[L->size]=x;L->size++;return FALSE;}int Delete_List1(sqList *L,int item){ int i,j;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(j=i+1;j<L->size-1;j++)L->list[j]=L->list[j+1];L->size--;return i;}return FALSE;}int Delete_List2(sqList *L,int mark){int i,item;if(mark>0){item=L->list[mark];for(i=mark+1;i<L->size-1;i++)L->list[i]=L->list[i+1];L->size--;return i;}return FALSE;}void main(){int p,n,x=0;sqList a,*b;b=Init_List(&a,ML);printf("listaddr=%d\tsize=%d\tMaxSize=%d",b->list,b->size,b->MAXSIZE);while(1){printf("\n请输入值,0为结束输入:");scanf("%d",&x);if(!x) break;printf("请输入插入位置:");scanf("%d",&p);Insert_List(b,x,p);printf("线性表为:\n");Disp_List(b);}while(1){printf("请输入查找值,输入0结束查找操作:");scanf("%d",&x);if(!x) break;n=LocateElem_List(b,x);if(n<0) printf("没找到\n");elseprintf("又符合条件的值,位置为:%d\n",n+1);}while(1){printf("请输入删除值,输入0结束查找操作:");scanf("%d",&x);if(!x) break;n=Delete_List1(b,x);if(n<0)printf("没找到\n");else{printf("删除成功,线性表为:");Disp_List(b);}}while(1){printf("请输入删除值位置,输入o结束查找操作:");scanf("%d",&p);if(!p) break;n=Delete_List2(b,p);if(p<0) printf("位置越界\n");else{printf("线性表为:");Disp_List(b);}}}实验2 单链表的操作#include <stdio.h>#include <malloc.h>#define null 0typedef int ElemType; /* 字符型数据*/struct LNode{ElemType data;struct LNode *next;};void setnull(struct LNode **p);int length (struct LNode **p);ElemType get(struct LNode **p,int i);void insert(struct LNode **p,ElemType x,int i);void dele(struct LNode **p,int i);void display(struct LNode **p);int locate(struct LNode **p,ElemType x);void main(){struct LNode *head,*q; /*定义静态变量*/int select,x1,x2,x3,x4;int i,n;int m,g;char e,y;setnull(&head); /*建设链表并设置为空表*/printf("请输入数据长度: ");scanf("%d",&n);for(i=1;i<=n;i++){printf("将数据插入到单链表中: ");scanf("%d",&y);insert(&head,y,i);} /*插入数据到链表*/display(&head); /*显示链表所有数据*/printf("select 1 求长度length()\n");printf("select 2 取结点get()\n");printf("select 3 求值查找locate()\n");printf("select 4 删除结点delete()\n");printf("select 0 退出\n");printf("input your select: ");scanf("%d",&select);while(select!=0){switch(select){case 1:{x1=length(&head);printf("输出单链表的长度%d ",x1);display(&head);}break;case 2:{printf("请输入要取得结点: ");scanf("%d",&m);x2=get(&head,m);printf("%d",x2);display(&head);}break;case 3:{printf("请输入要查找的数据: ");scanf("%d",&e);x3=locate(&head,e);printf("%d",x3);display(&head);}break;case 4:{printf("请输入要删除的结点: ");scanf("%d",&g);dele(&head,g);display(&head);}break;}printf("select 1 求长度length()\n");printf("select 2 取结点get()\n");printf("select 3 求值查找locate()\n");printf("select 4 删除结点delete()\n");printf("select 0 退出\n");printf("input your select: ");scanf("%d",&select);}}void setnull(struct LNode **p){*p=null;}int length (struct LNode **p){int n=0;struct LNode *q=*p;while (q!=null){n++;q=q->next;}return(n);}ElemType get(struct LNode **p,int i) {int j=1;struct LNode *q=*p;while (j<i&&q!=null){q=q->next;j++;}if(q!=null)return(q->data);else{printf("位置参数不正确!\n");return 0;}}int locate(struct LNode **p,ElemType x) {int n=0;struct LNode *q=*p;while (q!=null&&q->data!=x){q=q->next;n++;}if(q==null)return(-1);elsereturn(n+1);}void insert(struct LNode **p,ElemType x,int i){int j=1;struct LNode *s,*q;s=(struct LNode *)malloc(sizeof(struct LNode));s->data=x;q=*p;if(i==1){s->next=q;*p=s;}else{while(j<i-1&&q->next!=null){q=q->next;j++;}if(j==i-1){s->next=q->next;q->next=s;}elseprintf("位置参数不正确!\n");}}void dele(struct LNode **p,int i){int j=1;struct LNode *q=*p,*t;if(i==1){t=q;*p=q->next;}else{while(j<i-1&&q->next!=null){q=q->next;j++;}if(q->next!=null&&j==i-1){t=q->next;q->next=t->next;}elseprintf("位置参数不正确!\n");}if(t!=null)free(t);}void display(struct LNode **p){struct LNode *q;q=*p;printf("单链表显示: ");if(q==null)printf("链表为空!");else if (q->next==null)printf("%d\n",q->data);else{while(q->next!=null){printf("%d->",q->data);q=q->next;}printf("%d",q->data);}printf("\n");}五、成绩评定优良中及格不及格出勤内容格式创新效果总评指导教师:年月日。