实验1 线性表及其应用实验报告

合集下载

实验1线性表及其应用实验报告

实验1线性表及其应用实验报告

实验1线性表及其应⽤实验报告暨南⼤学本科实验报告专⽤纸课程名称数据结构成绩评定实验项⽬名称线性表及其应⽤指导教师王晓明实验项⽬编号实验⼀实验项⽬类型综合性实验地点南海楼601 学⽣姓名朱芷漫学号2010051875学院信息科学技术学院系计算机专业计算机科学与技术实验时间2011年9⽉7⽇18:30午~9⽉7⽇20:30午温度℃湿度⼀、实验⽬的和要求实验⽬的:熟练掌握线性表基本操作的实现及应⽤实验要求:在上机前写出全部源程序完毕并调试完毕。

⼆、实验原理和主要内容1.建⽴4个元素的顺序表SqList={2,3,4,5},实现顺序表的基本操作;在SqList={2,3,4,5}的元素4与5之间插⼊⼀个元素9,实现顺序表插⼊的基本操作;在SqList={2,3,4,9,5}中删除指定位置(i=3)上的元素,实现顺序表删除的操作。

2.利⽤顺序表完成⼀个班级的⼀个学期的课程的管理:能够增加、删除、修改学⽣的成绩记录。

三、主要仪器设备PC机,Windows XP操作平台,Visual C++四、调试分析学⽣课程管理系统的调试过程中发现⼀些错误,主要是参数设置的问题,经过修改,错误得到排除。

五、测试结果1.顺序表2.学⽣课程管理系统附录(源程序)1.顺序表的操作#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 10 #define LISTINCREMENT 2 typedef struct shunxubiao{ElemType *list;int size;int Maxsize;}SqList;int InitList_Sq(SqList &L) {// 构造⼀个空的线性表L。

实验一 线性表的操作及应用

实验一 线性表的操作及应用
while(p&&j<i)
{
p=p->next;
++j;
}
if ( !p||j>i )
{
printf("参数 i 错或单链表不存在");
return (NULL);
} /*第i个结点不存在*/
return (p);
}
int Insert_LinkList( LinkList H, int i, DataType x)
scanf("%d%d",&n,&m);
for(j=0;j<n;j++)
{
printf("请输入要插入的第%d个元素:",j+1);
scanf("%d",&x);
y=Insert_LinkList( L,m,x);
if(y==1)
{
y=0;
printf("成功插入第%d个元素。\n",j+1);
}
}
代码:
#include <stdio.h>
#include <malloc.h>
typedef int DataType;
typedef struct node{
DataType data; /*每个元素数据信息*/
struct node *next; /*存放后继元素的地址*/
} LNode, *LinkList;
y=0;
/*(将单链表逆置,并输出逆置后单链表中的元素)*/
InvertList(L);
y=Print_LinkList(L);

实验1线性表及其应用

实验1线性表及其应用

实验1 线性表及其应用实验性质:验证性实验学时:2学时一、实验目的1.掌握线性表的顺序存储结构在计算机的表示方法及其基本操作的实现;2.掌握线性表的链式存储结构在计算机的表示方法及其基本操作的实现;3.能够利用线性表结构对实际问题进行分析建模,利用计算机求解。

二、实验预备知识1.复习C/C++语言相关知识(如:结构体的定义、typedef的使用、函数的定义、调用及参数传递方式);2.阅读并掌握顺序表与链表的类型定义及其查找、插入、删除等基本操作。

三、实验内容1.理解并分别用顺序表、链表的操作运行下列程序:#include <iostream>using namespace std;#include "Status.h"typedef int ElemType;#include "SqList.h" //用#include "LinkList.h"替换void main(){SqList L; //用LinkList L;替换,与#include "LinkList.h"配合int n,i;ElemType e;InitList(L);cout<<"\nL=";ListTraverse(L);cout<<"\n请设置将向线性表L中输入的元素个数:";cin>>n;CreateList(L,n);cout<<"\nL=";ListTraverse(L);cout<<"\nL的表长为:"<<ListLength(L)<<endl;cout<<"\n请输入想要获取的元素位序:";cin>>i;if(GetElem(L,i,e)) cout<<"\n第"<<i<<"个元素为:"<<e<<endl;else cout<<"\n第"<<i<<"个元素不存在!"<<endl;cout<<"\n请输入要查找的元素:";cin>>e;if(i=LocateElem(L,e)) cout<<"\n元素"<<e<<"的位置为:"<<i<<endl;else cout<<"\n元素"<<e<<"不存在!"<<endl;cout<<"\n请输入插入位置和所插入元素:";cin>>i>>e;if(ListInsert(L,i,e)){cout<<"\nL=";ListTraverse(L);}else cout<<"\n插入操作失败!"<<endl;cout<<"\n请输入被删元素的位置:";cin>>i;if(ListDelete(L,i,e)) cout<<"\n被删元素为:"<<e<<endl;else cout<<"\n删除操作失败!"<<endl;cout<<"\nL=";ListTraverse(L);}本题目说明:(1)头文件Status.h的内容如下:#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;(2)头文件SqList.h(内容包括顺序表的结构定义及基本操作实现)。

(完整版)数据结构线性表的应用实验报告

(完整版)数据结构线性表的应用实验报告

实验报告课程名称____数据结构上机实验__________ 实验项目______线性表的应用 ____________实验仪器________PC机___________________系别_____电子信息与通信学院___专业________ ___班级/学号______ __学生姓名______ ___________实验日期_______________________成绩_______________________指导教师_______________________实验一.线性表的应用1.实验目的:掌握线性链表的存储、运算及应用。

利用链表实现一元多项式计算。

2.实验内容:1)编写函数,实现用链表结构建立多项式;2)编写函数,实现多项式的加法运算;3)编写函数,实现多项式的显示;4)测试:编写主函数,它定义并建立两个多项式,显示两个多项式,然后将它们相加并显示结果。

变换测试用的多项式,检查程序的执行结果。

选做内容:修改程序,选择实现以下功能:5)多项式求值:编写一个函数,根据给定的x值计算并返回多项式f(x)的值。

测试该函数(从终端输入一个x的值,调用该函数并显示返回结果)。

6)多项式相减:编写一个函数,求两个多项式相减的多项式。

7)多项式相乘:编写一个函数,求两个多项式的乘积多项式。

3.算法说明:1)多项式的建立、显示和相加算法见讲义。

可修改显示函数,使输出的多项式更符合表达规范。

2)多项式减法:同次项的系数相减(缺项的系数是0)。

例如a(x)=-5x2+2x+3,b(x)= -4x3+3x,则a(x)-b(x)=4x3-5x2-x+3。

提示:a(x)-b(x) = a(x)+(-b(x))。

3)多项式乘法:两个多项式的相乘是“系数相乘,指数相加”。

算法思想是用一个多项式中的各项分别与另一个多项式相乘,形成多个多项式,再将它们累加在一起。

例如,a(x)=-5x2+2x+3,b(x)=-4x3+3x,则a(x)*b(x) = (-4x3)*(-5x2+2x+3)+(3x)*(-5x2+2x+3)= (20x5-8x4-12x3) + (-15x3+6x2+9x) =20x5-8x4-27x3+6x2+9x。

《数据结构》实验一 线性表及其应用

《数据结构》实验一 线性表及其应用

实验一线性表及其应用一、实验目的1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。

2.掌握线性表的顺序存储结构的定义及C语言实现。

3.掌握线性表的链式存储结构——单链表的定义及C语言实现。

4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。

5.掌握线性表在链式存储结构——单链表中的各种基本操作。

二、实验内容1.顺序线性表的建立、插入及删除。

2.链式线性表的建立、插入及删除。

三、实验步骤1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。

2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。

3.建立一个带头结点的单链表,结点的值域为整型数据。

要求将用户输入的数据按尾插入法来建立相应单链表。

四、实现提示1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。

因此,可用C语言的一维数组实现线性表的顺序存储。

在此,我们利用C语言的结构体类型定义顺序表:#define MAXSIZE 1024typedef int elemtype; /* 线性表中存放整型元素*/typedefstruct{ elemtypevec[MAXSIZE];intlen; /* 顺序表的长度*/}sequenlist;将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。

2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。

3.单链表的结点结构除数据域外,还含有一个指针域。

用C语言描述结点结构如下:typedefintelemtype;typedefstruct node{ elemtype data; //数据域struct node *next; //指针域}linklist;注意结点的建立方法及构造新结点时指针的变化。

“线性表及其应用”实验报告

“线性表及其应用”实验报告

序号73 学号2013112000 姓名张三实验 2 实验名称线性表及其应用难度等级B+一、需求分析1、问题描述设计一个一元稀疏多项式简单计算器.2、基本要求一元稀疏多项式基本功能包括:1)输入并建立多项式⏹一元n次多项式:P(x)=c m+c m-1+…+c1,其中n=e m>e m-1>…>e1≥0,c i≠0(i=1,2,m)n⏹输入(c m,e m)(c m-1,e m-1)…(c1,e1)构建一元n次m项多项式2)输出多项式:c m x^e m+c m-1x^e m-1+…+c1x^e13)多项式a和b相加,建立a+b4)多项式a和b相减,建立a-b3、测试数据1)(-3.1x11+5x8+2x)+(11x9-5x8+7)=(-3.1x11+11x8+2x+7)2)(-1.2x9+6x-3+4.4x2-x)-(7.8x15+4.4x2-6x-3)=(-7.8x15-1.2x9+12x-3-x)3)(x5+x4+x3+x2+x+1)-(-x4-x3)=(x5+x2+x+1)4)(x3+x)-(-x3-x)=05)(x100+x)+(x200+x100)=(x200+2x100+x)6)(x3+x2+x)+0=x3+x2+x7)互换上述测试数据中的前后多项式.二、概要设计ADT Polynomial{数据对象: D={a i|a i∈TermSet, i=1,2,…,m,m≥0,TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}数据对象: R1={<a i,a i-1>|a i,a i-1∈D,且a i-1中的指数值小于ai中的指数,i=2,…,m}基本操作:createPoly(&p,m,(*input)())Result: 指数由大到小输入m项的系数和指数,建立一元多项式pdestroyPoly(&p)Condition: 一元多项式p已存在Result: 销毁一元多项式ptraversePoly(p)Result: 输出一元多项式addPoly(&pa,&pb);Condition: 一元多项式pa,pb已存在Result: 完成多项式相加运算,即pa=pa+pb,并销毁一元多项式pb.subtractPoly(&pa,&pb)Condition: 一元多项式pa,pb已存在Result: 完成多项式相减运算,即pa=pa-pb,并销毁一元多项式pb.}ADT Polynomial三、详细设计1、 数据类型定义typedef struct{float coef; int expn;}ElemType;//定义存放多项式中项的系数和指数 typedef struct LNode{ElemType data;struct LNode *next; }LNode, *LNodePtr; typedef struct{LNodePtr hp; int length;}LinkList;//定义链表typedef LinkList Poly;//将链表定义为多项式类型 2、 函数原型定义Status createPoly(Poly &p, int m, Status (*input)(int, float *, int *)); Status traversePoly(Poly p, Status (*visit)(int, int, float, int)); Status destroyPoly(Poly &p);Status addPoly(Poly &pa, Poly &pb);//下面的函数可以根据需要由用户在main()函数中定义 Status input(int, float *, int *); Status visit(int, int, float, int);3、 核心算法描述⏹ createPoly()Status createPoly(Poly &p, int m, Status (*input)(int, float *, int *)){ int i,expn; float coef; LNodePtr s,hp;p.hp =(LNodePtr)malloc(sizeof(LNode)); if(!p.hp) exit(OVERFLOW); p.hp->next=NULL; p.length=0; hp=p.hp;for(i=1;i<=m;i++){(*input)(i,&coef,&expn);s=(LNodePtr)malloc(sizeof(LNode)); if(!s) exit(OVERFLOW); s->data.coef=coef; s->data.expn=expn; s->next=NULL; hp->next=s; hp=s; }p.length=m; return OK; }⏹ traversePoly()Status traversePoly(Poly p, Status (*visit)(int,int, float, int)){ int m;LNodePtr q;构建链表头结点,完成链表初始化 根据用户输入多项式的项信息构建多项式,hp 指向当前创建结点q=p.hp->next;for(m=1;m<=p.length;m++){(*visit)(p.length,m,q->data.coef,q->data.expn);q=q->next;}return OK;}⏹destroyPoly()Status destroyPoly(Poly &p){LNodePtr q;while(p.hp){q=p.hp;p.hp=q->next;free(q);}p.length=0;return OK;}⏹addPoly()Status addPoly(Poly &pa, Poly &pb){LNodePtr q,ap,bh,bp,s;float tcoef;int result;q=pa.hp; ap=q->next; bh=pb.hp; bp=bh->next;while(ap&&bp){result=ap->data.expn-bp->data.expn;if(result<0){s=bp; bp=bp->next; bh->next=bp;q->next=s; s->next=ap; q=s;pa.length++; pb.length--;}else if(result>0){q=ap; ap=ap->next;}else{tcoef=ap->data.coef+bp->data.coef;if(!tcoef){q->next=ap->next; free(ap);ap=q->next;pa.length--;}else{ap->data.coef=tcoef; q=ap;ap=ap->next;}bh->next=bp->next; free(bp);bp=bh->next; pb.length--;}//result=0}//while 根据用户定义的输出函数遍历多项式的每一项并将项和系数输出if(bp) {q->next=bp; pa.length += pb.length; bh->next=NULL; pb.length=0;}free(pb.hp);return OK;}4、函数调用关系main()首先调用createPoly(),traversePoly(),addPoly(),而createPoly()调用用户自定义input()输入多项式信息,traverPoly()调用用户自定义visit()输出多项式信息.四、运行记录测试数据预期结果实际结果分析(-3.1,11) (5,8) (2,1) -3.1x^11+5x^8+2^x -3.1x^11-3.1x^11-3.1x^11 scanf(“(%f,%d)”)(-3.1,11)(5,8)(2,1) -3.1x^11+5x^8+2^x -3.1x^11+5.0x^8+2.0x^1 剔除输入数据项括号之间的空格测试addPoly()pa:(-3.1,11)(5,8)(2,1) pb:(11,9)(-5,8)(7,0) -3.1x^11+11x^9+2x^1+7 -3.1x^11+11x^9+2x^1原因算法中忽略了对pa和pb长度的处理,另外,在将剩余元素加到pa上,忘记对pb头结点的处理即pb.hp->next=NULL五、总结这次实验的难度和复杂度高于第一次实验,第一次实验是熟悉C语言环境,本次实验要求对结构体、链表和多项式项的特点要熟练掌握。

数据结构实验(1)线性表及其应用

数据结构实验(1)线性表及其应用

计算机系数据结构实验报告(1)实验目的:帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。

问题描述:1、构造一个空的线性表L。

2、在线性表L的第i个元素之前插入新的元素e;3、在线性表L中删除第i个元素,并用e返回其值。

实验要求:1、分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线性表的基本操作算法。

2、在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行分析。

算法分析:由于两种存储结构都用来创建线性结构的数据表,可采用相同的输出模式和整体结构类似的算法,如下:v1.0 可编辑可修改实验内容和过程:顺序存储结构线性表程序清单://顺序存储结构线性表的插入删除#include <iostream>#include <>using namespace std;# define LISTSIZE 100# define CREMENTSIZE 10typedef char ElemType; //定义数据元素类型为字符型typedef struct {ElemType *elem; //数据元素首地址int len; //当前元素个数int listsize; //当前存储最大容量}SqList;//构造一个空的线性表Lint InitList(SqList &L){=(ElemType *)malloc(LISTSIZE*sizeof(ElemType));if (! exit(-2); //分配空间失败=0;=LISTSIZE;}//在顺序线性表L中第i个位置之前插入新的元素eint ListInsert(SqList &L,int i,ElemType e){if (i<1||i>+1) return -1; //i值不合法if >={ElemType *newelem=(ElemType *)realloc,+CREMENTSIZE)*sizeof(ElemType));//存储空间已满,增加分配if(!newelem) exit (-2); //分配失败=newelem;+=CREMENTSIZE;}ElemType *q=&[i-1]) ;for (ElemType *p=&[]);p>=q;--p) *(p+1)=*p; //插入位置及其后的元素后移 *q=e; ++;return 1;}//在顺序线性表L中删除第i个元素,并用e返回其值int ListDelete(SqList &L,int i,ElemType&e){if (i<1||i> return -1; //i值不合法ElemType *p=&[i-1]);e=*p; ElemType*q=+;for (++p;p<=q+1;++p) *(p-1)=*p; //被删除元素之后的元素前移;return 1;}int main (){SqList L; char e,ch;int i,j,state;InitList(L); //构造线性表printf("请输入原始数据(字符串个数0~99):L="); //数据初始化gets;for ( j=1;[j-1]!='\0';j++) =j; //获取表长[j]='\0';printf("操作:插入(I)还是删除(D)\n"); //判断进行插入还是删除操作AGAIN:cin>>ch;if(ch=='I'){cout<<"插在第几个元素之前:"; //插入操作cin>>i; cout<<"输入要插入的新元素:";cin>>e;cout<<endl;printf("输入数据:L=(%s) ListInsert(L,%d,%c)",,i,e);state=ListInsert (L,i,e);}else if (ch=='D'){cout<<"删除第几个元素:"; //删除操作cin>>i;cout<<endl;printf("输入数据:L=(%s) DeleteList(L,%d,e)",,i);state=ListDelete(L,i,e);}else goto AGAIN; //操作指示符输入错误处理cout<<endl<<"正确结果:";if(state==-1) cout<<"ERROR,";printf("L=(%s) ",; //输出结果if(ch=='D'&&state!=-1) cout<<",e="<<e;}链式存储结构线性表程序清单:// - - - - -单链存储结构线性表的插入删除 - - - - -#include <iostream>#include <>using namespace std;#define null 0typedef char ElemType; //定义数据元素类型为字符型typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;int GetElem(LinkList L,int i,ElemType &e) //获取第i个元素的值 {LinkList p;int j;p=L->next; j=1;while(p&&j<i){p=p->next; ++j; //寻找第i个元素}if(!p||j>i) return -1; //寻找失败e=p->data;return 1;}int ListInsert(LinkList &L,int i,ElemType e){//在带头结点的单链线性表L中第i个元素之前插入元素eLinkList p,s; int j;p=L;j=0;while(p&&j<i-1) {p=p->next;++j;}if(!p||j>i-1) return -1;s=(LinkList) malloc( sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return 1;}int ListDelete(LinkList&L,int i,ElemType&e){//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值LinkList p,q; int j;p=L;j=0;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1) return -1;q=p->next;p->next=q->next;e=q->data;free(q);return 1;}int newdata(LinkList&L,char *ch){int k;printf("请输入原始数据(字符串个数0~99):L="); //数据初始化gets(ch);for (k=0;ch[k]!='\0';k++) ListInsert(L,k+1, ch[k]); //将初始化数据插入链表L中cout<<"OK"<<endl;return k; //返回链表中的元素个数}int main (){char *ch;ch=(char *)malloc(100*sizeof(char)); //定义数组用来辅助数据初始化LinkList L; //头指针LNode head; //头结点L=&head; =null;int i,k,state; char e,CH,f;k=newdata(L,ch); //调用函数使链表数据初始化=k; //将元素个数存入头结点的数据域printf("操作:插入(I)还是删除(D)\n"); //判断进行插入还是删除操作AGAIN:cin>>CH;if(CH=='I'){cout<<"插在第几个元素之前:"; //插入操作cin>>i; cout<<"输入要插入的新元素:";cin>>e;cout<<endl;printf("输入数据:L=(%s) ListInsert(L,%d,%c)",ch,i,e);state=ListInsert(L,i,e);++;}else if (CH=='D'){cout<<"删除第几个元素:"; //删除操作cin>>i;cout<<endl;printf("输入数据:L=(%s) DeleteList(L,%d,e)",ch,i);state=ListDelete(L,i,e);--;}else goto AGAIN; //操作指示符输入错误处理cout<<endl<<"正确结果:";if(state==-1) cout<<"ERROR,"; //输出结果cout<<"L=(";for(int m=1;>=m;m++) //一一输出数据{GetElem(L,m,f);cout<<f;}cout<<")";if(CH=='D'&&state!=-1) cout<<",e="<<e; //删除操作反馈e }实验结果:由于两个程序的输出模式相同,在此只列一组测试数据:L = () ListInsert (L, 1, 'k')L = (EHIKMOP) ListInsert (L, 9, 't')L = (ABCEHKNPQTU) ListInsert(L, 4, 'u') L = () ListDelete (L, 1, e)L = (DEFILMNORU) ListDelete_Sq(L, 5, e) L = (CD) ListDelete_Sq(L, 1, e)测试过程中所注意到的问题主要还是输出与输入界面的问题,通过灵活使用cout和cin函数来不断改进。

线性表及其应用实验报告

线性表及其应用实验报告

数据结构实验报告实验名称:线性表及其应用班级:12级电气本2学号:2012081227姓名:赵雪磊指导教师:梁海丽日期:2013年9月9日数学与信息技术学院一、实验目的1、掌握线性表的概念,理解线性表的顺序、链式存储。

2、掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算。

二、实验要求1、建立顺序存储的线性表,并对之进行插入、删除操作。

2、建立链式存储的线性表,并对之进行插入、删除操作。

;三、算法描述#include <cstdlib>#include <iostream>#include "myList.h"using namespace std;template <class T> class Link {public:T data; // 用于保存结点元素的内容Link * next; // 指向后继结点的指针Link(const T info, Link* nextValue = NULL) { // 具有两个参数的Link构造函数data = info;next = nextValue;}Link(Link* nextValue = NULL) { // 具有一个参数的Link构造函数next = nextValue;}}// 【代码2.7】单链表的类型定义template <class T>class lnkList : public List<T> {protected:Link<T>* head, tail; // 单链表的头、尾指针public:lnkList(); // 构造函数~lnkList(); // 析构函数bool isEmpty(); // 判断链表是否为空void clear(); // 将链表存储的内容清除,成为空表int length(); // 返回此顺序表的当前实际长度bool append(T value); // 在表尾添加一个元素value,表的长度增1 bool insert(int p, T value); // 在位置p上插入一个元素value,表的长度增1 bool delete(int p); // 删除位置p上的元素,表的长度减 1int getPos(const T value); // 查找值为value的元素,并返回第1次出现的位置Link<T> setPos(int p); // 返回线性表指向第p个元素的指针值}template <class T>class lnkList:: lnkList() {head = tail = new Link<T>;}template <class T>class lnkList:: ~lnkList() {Link tmp;while (head != NULL) {tmp = head;head = head->next;delete tmp;}}template <class T> // 假定线性表的元素类型为TLink lnkList :: setPos(int i) {int count = 0;Link *p;if (i == -1) // i为-1则定位到"虚"头结点return head;p = head->next; // 若i为0则定位到第一个结点while (p != NULL && count < i) {p = p-> next;count++;};return p; // 指向第 i 结点,i=0,1,…,当链表中结点数小于i时返回NULL }template <class T> // 假定线性表的元素类型为Tbool lnkList :: insert (int i, T value) {Link *p, *q;q = new Link<T>;p = setPos(i-1); // p是第i个结点的前驱if (p == NULL ) {cout << " the inserted point is illegal"<<endl;return false;}q->next = p->next;q->data = value;p->next = q;if (q->next == NULL ) // 插入点在链尾,插入结点成为新的链尾tail = q;return true;}// delete a node from singly linked listtemplate <class T> // 假定线性表的元素类型为Tbool lnkList :: delete(int i) {Link *p, *q;p = setPos(i-1); // p是第i个结点的前驱if (p == NULL ) {cout << " the deletion point is illegal"<<endl;return false;}q = p->next; // q是真正待删结点if (q == tail) // 待删结点为尾结点,则修改尾指针tail = p;if (q != NULL) { // 删除结点q 并修改链指针p->next = q->next;delete q;}return true;}template <class T> // 假定顺序表的元素类型为Tvoid lnkList<T> :: print() {while (head != NULL) {cout << head->data;cout << endl; // 从位置p开始每个元素左移直到curLen, tmp = head;head = head->next;}}四、程序清单#include <iostream.h>#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #defineOVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 10 #define LISTINCREMENT 2typedef struct shunxubiao{ ElemType *list;int size;int Maxsize; }SqList;int InitList_Sq(SqList &L) {// 构造一个空的线性表L。

实验一 线性表的建立与应用

实验一 线性表的建立与应用

实验一线性表的建立与应用一实验目的:通过实验,了解并掌握线性表逻辑特性和物理特性,了解并掌握队列和栈的运算方法,培养结合理论知识进行实际应用的实践能力。

二实验内容:队列示意图队列也是一种运算受限制的线性表,它的运算包括:初始化队、入队、退队、读取队首和队尾的数据。

当队列为空时不允许退队,当队列未满的时候不允许入队。

在实际应用中,通常使用循环队列循环队列示意图初始化循环队列四、实验步骤1 进入Turbo C 2.0,新建一个文件。

2 输入程序,程序要求使用子函数进行组织。

3 将源程序保存到指定文件夹“D:\学生姓名”。

4 按F9调试,纠正语法错误。

5按Ctrl+F9运行,调试逻辑错误。

6 按Alt+F5查看结果。

五、实验中应注意的问题与思考题:五、实验中应注意的问题与思考题:1 在对栈和队列的运算过程中保证数据结构的逻辑完整性。

2 栈和循环队列元素的打印。

在打印过程中应该正确分析循环队列的具体情况,做到正确打印。

3 栈与队列均不允许在中间插入数据,保证运算的正确性;线性队列不能重复使用,不符合流程化要求,应采取循环队列。

4 当栈满,而此时要进行退队入栈运算时应进行怎样的处理才能避免数据的丢失?退队入栈时,判断栈是否为满:若为满,则把数据存到其他地方。

5 当队列满,而此时要进行退栈入队运算时应进行怎样的处理才能避免数据的丢失?退栈入队时,判断队列是否为满:若为满,则把数据存到其他地方。

6 应用程序要求循环执行,每次运算结束后要求打印栈和队列中的元素,以查看结果。

7 对各个功能模块采用独立编制子函数,增强程序的可执行性、可移植性和可读性。

增加情报信息量,对实际应用中可能发生的情况考虑周全,对非法情形要提出适当的处理方案。

六、源程序#include "stdlib.h"#include "stdio.h"void push(s,m,top,x) /*******入栈************/int s[],x; int m,*top;{if(*top==m) {printf("栈上溢\n");return;}*top=*top+1;s[*top-1]=x;return;}void pop(s,m,top,y) /************退栈************/int s[],*y; int m,*top;{if(*top==0) {printf("栈下溢\n");return;}*y=s[*top-1];*top=*top-1;return;}out_s(s,m,top) /************输出栈内元素******************/int s[],m,*top;{int *q;q=s+*top-1;printf("输出栈内元素: ");if(q>=s)while(q>=s){ printf("%d ",*(q--)); }else printf("没有元素!!!");printf("\n"\n ");return;}void addcq(q,m,rear,front,s,x) /**************入队******************/int q[],x; int m,*rear,*front,*s;{if((*s==1)&&(*rear==*front)){printf("队列上溢\n");return;}*rear=*rear+1;if(*rear==m+1) *rear=1;q[*rear-1]=x;*s=1;return;}void delcq(q,m,rear,front,s,y) /**************退队*****************/int q[],*y; int m,*rear,*front,*s;{if(*s==0) {printf("队列下溢\n");return;}*front=*front+1;if(*front==m+1) *front=1;*y=q[*front-1];if(*front==*rear) *s=0;return;}out_q(q,m,front,rear,s) /******************输出队内元素******/ int q[],m,*front,*rear,*s;{int k;k=(*front)%m;*front=(*front)%m;*rear=(*rear)%m;printf("输出队列内元素: ");if(*s==1){if(*front<*rear)while(k<*rear){ printf("%d ",q[k]);k++;}else{while(k<=m-1){ printf("%d ",q[k]);k++;}k=0;while(k<*rear){ printf("%d ",q[k]);k++;}}}else { printf("没有元素!!!"); }printf("\n\n ");}main(){int x,y,z,m,n,*s,*q,top,rear,front,l,i,k,j;l=0;m=5;n=5;s=malloc(m*sizeof(int));q=malloc(n*sizeof(int));top=0;rear=n;front=n;printf("输入0, 退出\n");printf("输入1, 压栈\n");printf("输入2, 入队\n");printf("输入3, 弹栈\n");printf("输入4, 退队\n");printf("输入5, 弹栈入队\n");printf("输入6, 退队压栈\n");printf("输入0-6:");scanf("%d",&y);for(;y!=0;){switch(y){case 1:{printf("输入压栈元素\n");scanf("%d",&x);push(s,m,&top,x);out_s(s,m,&top);out_q(q,n,&front,&rear,&l);break;}case 2: {printf("输入入队元素");scanf("%d",&y);addcq(q,n,&rear,&front,&l,y);out_s(s,m,&top);out_q(q,n,&front,&rear,&l);break;}case 3:{pop(s,m,&top,&i);out_s(s,m,&top) ;out_q(q,n,&front,&rear,&l);break;}case 4: {delcq(q,n,&rear,&front,&l,&k);out_s(s,m,&top);out_q(q,n,&front,&rear,&l);break;}case 5:{if(top==0){ pop(s,m,&top,&i);out_s(s,m,&top);out_q(q,n,&front,&rear,&l);break;}pop(s,m,&top,&i);addcq(q,n,&rear,&front,&l,i);out_s(s,m,&top);out_q(q,n,&front,&rear,&l);break;}case 6:{if(l==0){ delcq(q,n,&rear,&front,&l,&k);out_s(s,m,&top);out_q(q,n,&front,&rear,&l);break;}delcq(q,n,&rear,&front,&l,&k);push(s,m,&top,k);out_s(s,m,&top);out_q(q,n,&front,&rear,&l);break;}default:break;}printf("输入0, 退出\n");printf("输入1, 压栈\n");printf("输入2, 入队\n");printf("输入3, 弹栈\n");printf("输入4, 退队\n");printf("输入5, 弹栈入队\n");printf("输入6, 退队压栈\n");printf("输入0-6:");scanf("%d",&y);}free(q);free(s);}七、实验总结通过实验,了解并掌握了线性表逻辑特性和物理特性,了解并掌握了队列和栈的运算方法,培养了结合理论知识进行实际应用的实践能力,受益匪浅。

实验一 线性表及其应用

实验一   线性表及其应用

华北水利水电大学数据结构实验报告2014~2015学年第一学期2012级计算机科学与技术专业实验一线性表及其应用一、实验目的:1.掌握用C语言调试程序的基本方法。

2.掌握线性表的基本运算,如插入、删除等。

二、实验内容:1.编写程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char),并在此基础上完成如下功能:(1)初始化顺序表L;(2)采用尾插法依次插入元素a、b、c、d、e;(3)输出顺序表L;(4)输出顺序表L的长度;(5)判断顺序表L是否为空;(6)输出顺序表L中的第3个元素;(7)输出元素a的位置;(8)在的4个元素的位置上插入元素f;(9)输出顺序表L;(10)删除L中的第3个元素;(11)输出顺序表L;(12)释放顺序表L。

2.设带头结点的单链表ha和hb中结点数据域值按从小到大顺序排列,且各自链表内无重复的结点,要求:(1)建立两个单链表ha和hb,要求ha和hb都是递增有序的。

(2)将单链表ha合并到单链表hb中,且归并后的hb链表内无重复的结点,结点值仍保持从小到大顺序排列。

(3)输出合并后单链表hb中每个结点的数据域值。

三、程序设计过程及源代码:1. #include <stdio.h>#include <stdlib.h>#define Maxsize 100typedef struct{char data[Maxsize];int Length;}SqList;void InitList(SqList * &L){ //建表并初始化L=(SqList *)malloc(sizeof(SqList));L->Length=0;}void ListInsert1(SqList * &L,char a[],char n) {//顺序表赋值int i;L=(SqList *)malloc(sizeof(SqList));for(i=0;i<n;i++)L->data[i]=a[i];L->Length=n;}bool ListInsert2(SqList * &L,int i,char e) {//在第i的位置上插入元素eint j;if(i<1||i>L->Length+1)return false;i--;for(j=L->Length;j>i;j--)L->data[j]=L->data[j-1];L->data[i]=e;L->Length++;return true;}void Display(SqList *L){ //输出顺序表int i;for(i=0;i<L->Length;i++)printf("%c",L->data[i]);printf("\n");}void ListLength(SqList *L){//输出顺序表长度printf("%d",L->Length);printf("\n");}bool ListEmpty(SqList *L){//判断表L是否为空return(L->Length==0);}void Show(SqList *L,int i){//显示出第i个元素printf("%c",L->data[i-1]);printf("\n");}int Location(SqList *L,char e){//查找并输元素e出位置int i=0;while(i<L->Length && L->data[i]!=e)i++;if(i>L->Length)return 0;elseprintf("%d",i+1);printf("\n");return i+1;}bool Delete(SqList * &L,int i,char e){//删除第i个元素(字符)eint j;if(i<1 || i>L->Length)return false;i--;e=L->data[i];for(j=i;j<L->Length-1;j++)L->data[j]=L->data[j+1];L->Length--;return true;}void Free(SqList * &L){//释放顺序表free(L);}void main(){SqList *L;char s[]={'a','b','c','d','e'};printf("初始化顺序表\n");InitList(L);ListInsert1(L,s,5);printf("赋值后的顺序表为:\n");Display(L);printf("顺序表长度为:");ListLength(L);if(ListEmpty(L))printf("顺序表为空\n");else printf("顺序表不为空\n");printf("顺序表第三个元素为:");Show(L,3);printf("顺序表中a的位置为:");Location(L,'a');printf("在的4个元素的位置上插入新元素f之后顺序表为:\n"); ListInsert2(L,4,'f');Display(L);printf("删除第3个元素后顺序表为:\n"); Delete(L,3,'c');Display(L);Free(L);printf("顺序表已释放\n");}运行结果:2、#include <stdio.h>#include <malloc.h>typedef struct LNode{int data;struct LNode * next;}LinkList;void CreateList(LinkList *&L,int a[],int n) {//尾插法LinkList *s,*r;L=(LinkList *)malloc(sizeof(LinkList)); r=L;for(int i=0;i<n;i++){s=(LinkList *)malloc(sizeof(LinkList));s->data=a[i];r->next=s;r=s;}r->next=NULL;}void Sort(LinkList * &L ){//使插入的数据有序化(从小到大)LinkList *p,*pre,*q;p=L->next->next;L->next->next=NULL;while(p!=NULL){q=p->next;pre=L;while(pre->next!=NULL&& pre->next->data < p->data)pre=pre->next;p->next=pre->next;pre->next=p;p=q;}}void UnionList(LinkList * &L1,LinkList * &L2){//合并两个单链表LinkList * pa=L1->next, *pb=L2->next,*r,*s;L2->next=NULL;r=L2;while(pa!=NULL&&pb!=NULL){if(pa->data ==pb->data )pa=pa->next ;else if(pa->data<pb->data){s=(LinkList *)malloc(sizeof(LinkList));s->data=pa->data;r->next=s;r=s;pa=pa->next;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=pb->data;r->next=s;r=s;pb=pb->next;}}while(pa!=NULL){s=(LinkList *)malloc(sizeof(LinkList));s->data=pa->data;r->next=s;r=s;pa=pa->next;}while(pb!=NULL){s=(LinkList *)malloc(sizeof(LinkList));s->data=pb->data;r->next=s;r=s;pb=pb->next;}r->next=NULL;}void Display(LinkList *L){LinkList *p=L->next;while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}void main(){LinkList *ha,*hb;int a[]={4,6,5,8,7,1,9,0,20},b[]={1,6,15,14,18,17,10,3,4};CreateList(ha,a,9);Sort( ha );printf("单链表ha赋值并排序后为:\n");Display(ha);CreateList(hb,b,9);Sort( hb );printf("单链表hb赋值并排序后为:\n");Display(hb);UnionList(ha,hb);printf("将单链表ha,hb合并后为:\n");Display(hb);}运行结果:四、小结经过这次实验,我对顺序表以及链表的相关操作的编译代码的应用有了更进一步的熟悉与应用,这次的实验让我意识到了,再编程这一方面:不管你多么清楚原理,那终究是纸上谈兵,没有经过实际的操作,你永远也不知道编程里需要注意的事项,尤其是一些细节问题。

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

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

实验一_线性表操作_实验报告实验一:线性表操作一、实验目的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;}}}四、测试结果顺序表的测试结果单链表的测试结果五、心得体会当听到老师说写数据结构实验报告时, 我有点惊讶, 才学了不到一个月, 就要写实验报告。

数据结构线性表实验报告五篇

数据结构线性表实验报告五篇

数据结构线性表实验报告五篇第一篇:数据结构线性表实验报告实验报告课程名:数据结构实验名:线性表及其操作姓名:班级:学号:撰写时间:2014.09.24一实验目的与要求1.掌握线性表的实现2.掌握线性表的基本操作的实现二实验内容• 分别完成线性表的顺序表示及链式表示• 在两种表示上, 分别实现一些线性表的操作, 至少应该包括–在第i个位置插入一个元素–删除第i个元素–返回线性表长–返回第i个元素的值三实验结果与分析#include #include //---------线性表链式表示-----------struct V//声明一个结构体类型struct V { int value;struct V * next;//定义结构体变量};void PrintLink(struct V*p)//定义一个结构体指针{ while(p!=NULL)//只要指针指向的变量不为NULL;就会一直循环链表指向下一个结构体{printf(“%d, ”,(*p).value);p=(*p).next;//指针指向下一个结构体} printf(“n”);} void Link(){struct V*head;head=(struct V*)malloc(sizeof(struct V));//开辟一个长度为size的内存(*head).value=-100;//表头为-100(*head).next=NULL;printf(“------------线性表链式表示------------n”);int i,n=10;struct V*p=head;printf(“10个数据:n”);for(i=0;i(*p).next=(struct V*)malloc(sizeof(struct V));p=(*p).next;(*p).value=2*i;(*p).next=NULL;} PrintLink(head);//调用PrintLink函数printf(“删除第四个数据:n”);int k=4;p=head;for(i=1;ip=(*p).next;} struct V*temp=(*p).next;//k表示插入和删除的位置(*p).next=(*temp).next;free(temp);PrintLink(head);printf(“插入第十个数据:n”);k=10;p=head;for(i=1;ip=(*p).next;} temp=(*p).next;(*p).next=(struct V*)malloc(sizeof(struct V));(*(*p).next).value=-99;(*(*p).next).next=temp;PrintLink(head);}//---------线性表顺序表示-----------void seq1(){ int i,n=10,k=4;int a[10];//---------输出数组元素------------printf(“-------------线性表顺序表示---------n”);for(i=0;ia[i]=i;} printf(“数组元素为:n”);for(i=0;iprintf(“%3d”,a[i]);} printf(“n”);//--------插入一个数组元素---------int m=n+1,j=12;//插入元素12 int b[20];for(i=0;i if(i{b[i]=a[i];}else if(i==k){b[i]=j;}else{b[i]=a[i-1];} } printf(“输出插入一个元素的数组:n”);for(i=0;i{if(i{c[i]=a[i];}else{c[i]=a[i+1];} } printf(“输出删除一个元素的数组:n”);for(i=0;i printf(“数组元素为:n”);for(i=1;i<=a[0];i++){a[i]=i;} for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-----在k 位置插入一个元素------------for(i=a[0];i>=k;i--){a[i+1]=a[i];} a[k]=-100;++a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-------在k---------------for(i=0;i>k;i++){a[i]=a[i+1];} a[k]=-1;a[0]=n;--a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);} int main(int argc,char *argv[]){ seq1();seq2();Link();return 0;} 图1:实验结果截图实验分析:已在程序中按规定格式标注。

第一次实验 线性表的实现及其应用

第一次实验 线性表的实现及其应用
#define MAXNUM 100 typedef int DateType;
typedef Struct
{ DataType data[MAXNUM];
int
last; //存放线性表中最后一个元素在数组data[ ]中的下标 注意:顺序表的类型定义 可存储在seqlist.h中。
} SeqList;
二、关键技术分析
2.顺序表的空间申请
在教材第6页中的“臵空表”的程序有错, 缺少了申请存储空间的语句,故完整程 序应该为:
Void SeqLSetNull(SeqList *l) { l=(SeqList*) malloc(sizeof(SeqList)); l->last= -1; }
注意:教材第6页至第8页中的算法 ①~⑧给出了线性表在顺序表存储 结构下的所有基本操作的实现算法, 可存储在seqlist.cpp中。
数据结构实验(C语言版)
第一次实验 线性表的实现及其应用
一、实验内容
1.用C语言实现线性表的存储结构 (顺序表或链表,任选其中之一); 2.实现线性表所有基本操作的有关 算法; 3.利用线性表解决某一实际问题(实 现学生成绩管理系统;实现集合的 交运算和并运算)。
二、关键技术分析
1.顺序表的类型定义
二、关键技术分析
6.实现学生成绩管理系统
用一个带头结点的杂,导致对单链 表的输入、删除、插入等操作较为复杂,不能直接使 用教材2.1节中实现的单链表来表示线性表。必须重 新设计线性表的结点node(类型名为LinkList,教材第 19页),并针对该线性表设计所需的全部操作(如建 立、插入、删除、输出及主函数模块)的算法。
二、关键技术分析
6.实现学生成绩管理系统

实验一__线性表及其应用[1]pp

实验一__线性表及其应用[1]pp

集美大学数据结构课程实验报告课程名称:数据结构班级:实验成绩:指导教师:吴晓晖姓名:实验项目名称:实验1--线性表及其应用学号:上机实践日期:一、目的理解线性表数据结构及其应用;二、实验内容1.线性表的抽象数据类型的定义2.线性表存储映像---顺序表类定义(包括方法实现)及测试(要求:main中要测试每个方法)测试如下:定义一个顺序表,最大50,存储以下数据元素(1,-9,6,10,400,30,60),输出之。

查找的测试如下:元素30存在否,测试元素67存在否。

插入测试如下:在表的第5个位置插入元素值为12,在第10个元素后插入元素值为18。

删除测试:……。

.3.线性表存储映像—链表的类定义(包括方法实现)及测试(要求:main中要测试每个方法)4.使用顺序表实现有序集合的合并,并分析其时间与空间复杂度。

测试LA('a,e,g,h,x,y )与LB(c,d,e,r)的合并并输出。

5.使用链表实现一元多项式运算,并测试以下两个一元多项的加法,输出实现加法后的结果表示。

并分析其时间与空间复杂度pa=1+10x3-2x100+1000x1300,pb=-1+13x15+2x100-10x10106.设计一个循环链表类,完成约瑟夫问题的解决。

测试共10个人围成一圈,每个人都有一个表示其身份的号牌,从第1个人开始报数,报到3的人出列,求出列的号牌顺序。

可简化用1….10分别表示第1个人至第10个人的号牌。

三、实验使用环境VC++ 6.0控制台程序附:文件—新建---项目(选项卡)--选择console application,给项目名四、实验关键代码与结果展示(部分截图)查找测试:五、附录(代码)。

实验1 线性表及其应用 实验报告

实验1 线性表及其应用 实验报告

实验1 线性表及其应用一、实验目的和要求:1.加深对线性表的结构特性的理解,熟练掌握单链表类的描述方法及其C++实现;2.掌握线性表的链式存储结构的应用;3.加强对算法的设计能力和程序调试能力的培养。

二、实验时间:2010-3-26三、实验内容:约瑟夫(Joseph)环问题1.问题描述:编号为1,2,…,n的n个人按顺时针方向围坐一圈,从1起报到k则出圈,下一个人再从1报起,如此下去直到圈中只有一人为止。

求最后剩下的人的编号。

2.数据结构设计:(包括类型设计和类的设计)编号为1,2,…,n的n个人可用线性表结构表示,因是围坐一圈,故可采用循环链表(不带表头结点)结构存储。

(1)结点结构定义template<class T>struct Node //定义链表结点结构{T data;Node<T>*link;Node(T e=-1,Node<T>*next=NULL):data(e),link(next){ }};(2)单循环链类设计template<class T>class LinkList //不带表头结点的单循环链类{ private:Node<T> *current,*front; //链表指针,front指向current的前驱结点public:LinkList(int mSize); //构造函数~LinkList(); //析构函数int RemoveCurrent(); //删除current所指结点void movenext(int n); //current后移n次T CurrentData(){return current->data;}bool toLocatioin(T &t); //将current指向元素为t的结点 void Output() const ; //输出链表}; // Class LinkList(3)Joseph类定义template<class T>class Joseph{ private:int numOfBoy;int startPosition;int Interval;public:Joseph(int boys=10,int start=1,int m=3): numOfBoy(boys), startPosition(start), Interval(m){ }int GetWinner();};// Joseph类3.算法设计:(主要包括算法原理、算法流程图、实现等)(1)单循环链类的算法(2)约瑟夫报数出圈算法:设计一个循环链表和一个报数器k,从current所指结点开始报数。

数据结构实验-线性表及其应用

数据结构实验-线性表及其应用

实验1 线性表及其应用实验性质:验证性实验学时:2学时一、实验目的1.掌握线性表的顺序存储结构在计算机的表示方法及其基本操作的实现;2.掌握线性表的链式存储结构在计算机的表示方法及其基本操作的实现;3.能够利用线性表结构对实际问题进行分析建模,利用计算机求解。

二、实验预备知识1.复习C/C++语言相关知识(如:结构体的定义、typedef的使用、函数的定义、调用及参数传递方式);2.阅读并掌握顺序表与链表的类型定义及其查找、插入、删除等基本操作。

三、实验内容1.理解并分别用顺序表、链表的操作运行下列程序:#include <iostream>using namespace std;#include "Status.h"typedef int ElemType;#include "SqList.h" //用#include "LinkList.h"替换void main(){SqList L; //用LinkList L;替换,与#include "LinkList.h"配合int n,i;ElemType e;InitList(L);cout<<"\nL=";ListTraverse(L);cout<<"\n请设置将向线性表L中输入的元素个数:";cin>>n;CreateList(L,n);cout<<"\nL=";ListTraverse(L);cout<<"\nL的表长为:"<<ListLength(L)<<endl;cout<<"\n请输入想要获取的元素位序:";cin>>i;if(GetElem(L,i,e)) cout<<"\n第"<<i<<"个元素为:"<<e<<endl;else cout<<"\n第"<<i<<"个元素不存在!"<<endl;cout<<"\n请输入要查找的元素:";cin>>e;if(i=LocateElem(L,e)) cout<<"\n元素"<<e<<"的位置为:"<<i<<endl;else cout<<"\n元素"<<e<<"不存在!"<<endl;cout<<"\n请输入插入位置和所插入元素:";cin>>i>>e;if(ListInsert(L,i,e)){cout<<"\nL=";ListTraverse(L);}else cout<<"\n插入操作失败!"<<endl;cout<<"\n请输入被删元素的位置:";cin>>i;if(ListDelete(L,i,e)) cout<<"\n被删元素为:"<<e<<endl;else cout<<"\n删除操作失败!"<<endl;cout<<"\nL=";ListTraverse(L);}本题目说明:(1)头文件Status.h的内容如下:#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;(2)头文件SqList.h(内容包括顺序表的结构定义及基本操作实现)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} // InitList_Sq
int InsertList_Sq(SqList &L, int i, ElemType e)
{
ElemType *p,*q;
if (i < 1 || i > L.Maxsize+1) return ERROR;
q = &(L.list[i-1]); // q指示插入位置
void ListDelete(int i);
void ListRewrite(student e);
void ListPrint(int i);
void ListPrintAll();
void copy(student *a,student *b);
};
StuCourse::StuCourse()
typedef int ElemType;
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2
typedef struct shunxubiao{
ElemType *list;
int size;
int Maxsize;
}SqList;
int InitList_Sq(SqList &L)
bool flag=true;
if(e.StuNum<1)cout<<"插入位置错误"<<endl;
else
{
for(t=0;t<length&&(L+t)->StuNum<e.StuNum;t++);
if((L+t)->StuNum==e.StuNum)cout<<"此学号已存在"<<endl;
else
{
if(length==listsize)
{
p=new student[listsize+LISTINCREMENT];
if(!p)
{
cout<<"内存不足"<<endl;flag=false;
}
else
{
for(i=0;i<length;i++)copy(p+i,L+i);
delete L;L=p;listsize+=LISTINCREMENT;
一、实验目的和要求
实验目的:熟练掌握线性表基本操作的实现及应用
实验要求:在上机前写出全部源程序完毕并调试完毕。
二、实验原理和主要内容
1.建立4个元素的顺序表SqList={2,3,4,5},实现顺序表的基本操作;在SqList={2,3,4,5}的元素4与5之间插入一个元素9,实现顺序表插入的基本操作;在SqList={2,3,4,9,5}中删除指定位置(i=3)上的元素,实现顺序表删除的操作。
cout<<"C.添加记录\t\tD.删除记录"<<endl;
cout<<"E.修改记录\t\tQ.退出"<<endl;
c=getch();
switch(c)
{
case 'a':
case 'A':ClassA.ListPrintAll();getch();break;
case 'b':
case 'B':
*(p-1) = *p; //被删除元素之后的元素左移
--L.size; //表长减1
return OK;
} // ListDelete_Sq
void Create_Sq(SqList &L)
{
cout<<"创建顺序表"<<endl;
cout<<"请输入元素个数:";
int count;
cin>>count;
//在顺序表中查询数据元素e,若存在,则返回它的位序,否则返回0
int i = 1; // i的初值为第1元素的位序
ElemType *p = L.list; // p的初值为第1元素的存储位置
while (i <= L.size && *p!=e)
{
++i;
++p;
}பைடு நூலகம்
if (i <= L.size) return i;
for (p=&(L.list[L.Maxsize-1]); p >= q; --p)
*(p+1) = *p;
//插入位置及之后的元素右移
*q = e; //插入e
++L.size; //表长增1
return OK;
} // ListInsert_Sq
int LocateElem_Sq(SqList L, ElemType e) {
if(t==length)cout<<"此记录不存在"<<endl;
else
{
while(t<length)copy(L+t,L+t+1);t++;
length--;
}
}
void StuCourse::ListRewrite(student e)
{
int t;
for(t=0;t<length&&(L+t)->StuNum!=e.StuNum;t++);
cin>>e>>f;
if(!InsertList_Sq(myList,e,f,g))
cout<<"插入的位置不对!"<<endl;
cout<<"删除一个元素,请输入要删除的位序:"<<endl;
int wx;
cin>>wx;
if(!ListDelete_Sq(myList,wx,sc))
cout<<"删除元素失败!"<<endl;
暨南大学本科实验报告专用纸
课程名称数据结构成绩评定
实验项目名称线性表及其应用指导教师王晓明
实验项目编号实验一实验项目类型综合性实验地点南海楼601学生姓名朱芷漫学号2010051875
学院信息科学技术学院系计算机专业计算机科学与技术
实验时间2011年9月7日18:30午~9月7日20:30午温度℃湿度
struct student
{
int StuNum;
int CouNum;
int Score;
char *name;
};
class StuCourse
{
student *L;
int length;
int listsize;
public:
StuCourse();
void ListAdd(student e);
Print_Sq(myList);
}
2.学生课程管理系统
#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;
const int LIST_INIT_SIZE=3;
const int LISTINCREMENT=5;
}
}
if(flag==true)
{
if(t<length)
for(n=length;n>t;n--)copy(L+n,L+n-1);
copy(L+t,&e);length++;
}
}
}
}
void StuCourse::ListDelete(int i)
{
int t;
for(t=0;t<length&&(L+t)->StuNum!=i;t++);
return OK;
}
else return ERROR;
}
int GetList_Sq(SqList L,int i)
{
if(i>0 && i<=L.size)
{
return L.list[i];
}
else
return ERROR;
}
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
}
void main()
{
SqList myList;
ElemType e,f,g,sc;
InitList_Sq(myList);
Create_Sq(myList);
cout<<"请输入要插入顺序表的元素:"<<endl;
cin>>g;
cout<<"请输入新插入元素在顺序表中哪两个元素之间:"<<endl;
{
a->StuNum=b->StuNum;
a->CouNum=b->CouNum;
a->Score=b->Score;
a->name=b->name;
}
void write(int a,char *p,int b,int c,student &d)
相关文档
最新文档