线性表的链式存储实验

合集下载

实验二 链式存储线性表

实验二  链式存储线性表

实验二 链式存储线性表的基本操作一、 实验目的1. 掌握用Turbo C2.0上机调试线性表的基本方法。

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

二、 实验内容1.typedef int ElemType;typedef struct LNode { //创建结构体数据类型LNodeElemType data; //存放数值的数据域struct LNode *next; //存放后继结点地址的指针域}LNode;2. 链表的创建:创建n 个结点,利用scanf( )函数为每个结点的数据域赋值,一次将每个结点插入链表,形成一个包含n 个元素的链表。

#define NULL 0#define OVERFLOW 0#define OK 1#define ERROR -1typedef int ElemType;typedef struct LNode { //创建LNode 数据类型ElemType data;struct LNode *next;}LNode;typedef LNode *LinkList; //定义LinkList 指针型数据类型int CreateList_L(LinkList L, int n) { //创建拥有n 个元素的线性链表//int i;struct LNode *p;L->next = NULL; //线性链表初始化,见右图for (i = n; i > 0; --i) { //循环n 次在头结点和第一个结点间插入新结点,形成长度为n 的线性链表p =(LNode*)malloc(sizeof(LNode));scanf("%d",&p->data);p->next = L ->next;L->next =p;}return 1;}data next data nextl1)2)3)int VistList_L(LinkList L) { //遍历链表L中每个结点的函数struct LNode *p;p = L->next;while (p) {printf("%d ",p->data); //访问输出p结点的数据域p = p->next; } //p指针前进一位,指向后继结点printf("\n");return OK;}}lmain(){int m;LNode l;ElemType e;printf("please input the length of the linklist that you want to build");scanf("%d",&m);printf("please give the number that you want to insert");CreateList_L(&l,m); //调用创建链表函数VistList_L(&l); //调用遍历链表结点函数}3. 链表的插入算法:向链表中某个位置上插入一个结点#define NULL 0#define OVERFLOW 0#define OK 1#define ERROR -1typedef int ElemType;typedef struct LNode { //创建LNode 数据类型ElemType data;struct LNode *next;}LNode;typedef LNode *LinkList;int CreateList_L(LinkList L, int n) { //创建包含n 个元素的链表int i;struct LNode *p;L->next = NULL;for (i = n; i > 0; --i) {p =(LNode*)malloc(sizeof(LNode));scanf("%d",&p->data);p->next = L ->next;L->next =p;}return 1;}int ListInsert_L(LinkList L, int i, ElemType e) { //向链表中第i位插入数据e struct LNode *s,*p;int j;p = ; j = 0; //p指针指向线性链表的头结点while (p && j < ) //循环查找第i-1位作为数据e的插入位置{ p = ; ++j; } //p指针向前移动if (!p || j > i-1)return ERROR;s =(LNode*)malloc(sizeof(LNode)); //见下图1)if ( s == NULL) return ERROR;s-> = e; //将插入数据e的值赋值给s结点的数据域1)s->next = ; p->next = ; //旧链断开,新链产生2)3)return OK;}1)2)3)int VistList_L(LinkList L) { //遍历链表所有结点的函数struct LNode *p;p = L->next;while (p) {printf("%d",p->data);p = p->next; }return OK;}main(){int m;LNode l;ElemType e;int i;printf("please input the length of the linklist that you want to build");scanf("%d",&m);printf("please give the number that the initial list have");CreateList_L(&l,m);VistList_L(&l);printf("please input the positon and data of the insert number i&e");scanf("%d,%d",&i,&e);ListInsert_L(&l,i,e);VistList_L(&l);}附:一元多项式的相加#include<stdio.h>#include<stdlib.h>#define LEN sizeof(node)typedef struct polynode /*用单链表存储多项式的结点结构*/{int coef; /*多项式的系数*/int exp; /*指数*/struct polynode *next; /*next是struct polynode类型中的一个成员,它又指向struct polynode类型的数据,以此建立链表*/}node;/*若定为"node,*list;",意即node*与list同为结构指针类型*/node * create(void) /*指针函数,返回指针类型;用尾插法建立一元多项式的链表的函数*/ {node *h,*r,*s;int c,e;h=(node *)malloc(LEN); /*建立多项式的头结点,为头结点分配存储空间*/r=h; /*r指针始终动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/ printf("coef:");scanf("%d",&c); /*输入系数*/printf("exp: ");scanf("%d",&e); /*输入指针*/while(c!=0) /*输入系数为0时,表示多项式的输入结束*/{s=(node *)malloc(LEN); /*申请新结点*/s->coef=c; /*申请新结点后赋值*/s->exp=e; /*申请新结点后赋值*/r->next=s; /*做尾插,插入新结点*/r=s; /*r始终指向单链表的表尾*/printf("coef:");scanf("%d",&c);printf("exp: ");scanf("%d",&e);}r->next=NULL; /*将表的最后一个结点的next置NULL,以示表结束*/return(h);}void polyadd(node *polya, node *polyb)/*一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式polya中,并将多项式ployb删除*/{node *p,*q,*pre,*temp;int sum;p=polya->next;/*令p和q分别指向polya和polyb多项式链表中的第一个结点*/q=polyb->next;pre=polya; /*位置指针,指向和多项式polya*/while(p!=NULL&&q!=NULL) /*当两个多项式均未扫描结束时,执行以下操作*/{if(p->exp<q->exp) /*若p指向的多项式指数小于q指的指数*/{pre->next=p; /*将p结点加入到和多项式中*/pre=pre->next;p=p->next;}else if(p->exp==q->exp) /*若指数相等,则相应的系数相加*/{sum=p->coef+q->coef;if(sum!=0){p->coef=sum;pre->next=p;pre=pre->next;p=p->next;temp=q;q=q->next;free(temp);}else /*如果系数和为零,则删除结点p与q,并将指针指向下一个结点*/{temp=p->next;free(p);p=temp;temp=q->next;free(q);q=temp;}}else /*若p指数大于q指数*/{pre->next=q; /*p结点不动,将q结点加入到和多项式中*/pre=pre->next;q=q->next;}}if(p!=NULL) /*多项式A中还有剩余,则将剩余的结点加入到和多项式中*/ pre->next=p;else /*否则将B的结点加入到和多项式中*/pre->next=q;}void print(node * p) /*输出函数,打印出一元多项式*/{while(p->next!=NULL){p=p->next;printf(" %d*x^%d",p->coef,p->exp);}}main() /*主函数*/{node * polya,* polyb;printf("Welcome to use!\n");printf("\nPlease input the ploya include coef && exp:\n");polya=create(); /*调用建立链表函数,创建多项式A*/print(polya);printf("\nPlease input the ployb include coef && exp:\n");polyb=create(); /*同理,创建B*/print(polyb);printf("\nSum of the poly is:\n");polyadd(polya,polyb); /*调用一元多项式相加函数*/print(polya); /*调用输出函数,打印结果*/printf("\n");}。

线性表的链式存储结构实验报告

线性表的链式存储结构实验报告

实验报告课程名称:数据结构与算法分析实验名称:链表的实现与应用实验日期:班级:数媒1401 姓名:范业嘉学号一、实验目的掌握线性表的链式存储结构设计与基本操作的实现。

二、实验内容与要求⑴定义线性表的链式存储表示;⑵基于所设计的存储结构实现线性表的基本操作;⑶编写一个主程序对所实现的线性表进行测试;⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。

⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。

三、数据结构设计1.按所用指针的类型、个数、方法等的不同,又可分为:线性链表(单链表)静态链表循环链表双向链表双向循环链表2.用一组任意的存储单元存储线性表中数据元素,用指针来表示数据元素间的逻辑关系。

四、算法设计1.定义一个链表void creatlist(Linklist &L,int n){int i;Linklist p,s;L=(Linklist)malloc(sizeof(Lnode));p=L;L->next=NULL;for(i=0;i<n;i++){s=(Linklist)malloc(sizeof(Lnode));scanf("%d",&s->data);s->next=NULL;p->next=s; p=s;}}2.(1)两个链表的合并void Mergelist(Linklist &La,Linklist &Lb,Linklist &Lc) {Linklist pa,pb,pc;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;free(Lb);}(2)两个链表的并集Linklist unionlist(Linklist &La,Linklist &Lb){Linklist p1,p2,head,q,s;int flag;head=q=(Linklist)malloc(sizeof(Lnode));p1=La->next;while(p1){flag=0;p2=Lb->next;while(p2){if(p1->data==p2->data){flag=1;break;}p2=p2->next;}if(flag==0){s=(Linklist)malloc(sizeof(Lnode));s->data=p1->data;q->next=s;q=s;}p1=p1->next;}q->next=Lb->next;return head;}3.(1)一元多项式的加法List addpoly(List pa,List pb) //一元多项式的加法{int n;List pc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(struct Linklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){if(pa->expn>pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}else if(pa->expn<pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}else{n=pa->coef+pb->coef;if(n!=0){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=n;s->next=NULL;p->next=s;p=s;}pb=pb->next;pa=pa->next;}}while(pa!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}while(pb!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}return pc;}(2)一元多项式的减法List subpoly(List pa,List pb) //一元多项式的减法{int n;List pc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(struct Linklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){if(pa->expn>pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}else if(pa->expn<pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=-pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}else{n=pa->coef-pb->coef;if(n!=0){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=n;s->next=NULL;p->next=s;p=s;}pb=pb->next;pa=pa->next;}}while(pa!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}while(pb!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=-pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}return pc;}(3)一元多项式的乘法void mulpolyn(polynomail pa,polynomail pb,polynomail &pc) {LNode *p,*q,*s,*hc;p=pa->next;q=pb->next;hc=pc;while(p!=NULL){while(q!=NULL){s=(polynomail)malloc(sizeof(LNode));hc->next=s;hc=hc->next;hc->coef=q->coef*p->coef;hc->expn=q->expn+p->expn;q=q->next;}p=p->next;q=pb->next;}hc->next=NULL;}五、测试结果2.3.六、心得体会(包括对于本次实验的小结,实验过程中碰到的问题等)1.首先书上给的链表输入是倒序的,写的时候想都没想就抄上去了,结果运行时发现问题,可是上网百度依然没有把问题解决,导致最后输出链表倒序的,并且链表的合并并集依旧是倒序的。

数据结构实验二 线性表的链式存储及其操作 - 副本

数据结构实验二 线性表的链式存储及其操作 - 副本

实验二线性表的链式存储及其操作实验项目:线性表的链表实现:遍历、插入、删除、翻转实验类型: 基础性一【指导思想】用链表存储线性表,实现线性表的基本操作。

二【实验目的及要求】1、复习C语言的指针的定义、链表的使用;2、理解线性表的属性;3、实践线性表的链式实现方法以及相关的操作。

4、要求:提交实验报告,附源程序中填空的内容(10处)、打印运行结果涉及的知识点:线性表的逻辑属性、运算带表头的单链表的操作:定义、输入、输出、链表内容的翻转元素/链表的操作:元素的插入、删除三【实验内容】实现链表的输入、输出、插入、删除、翻转等功能,教师提供主要源代码,其中有10处标出需要学生填空,使得整个程序能正确运行。

问题描述:用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。

链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。

链表翻转是把数据逆序(变成降序),注意,头结点不动。

翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错。

实验步骤:读懂后面附带的源代码,在标注“填空”的位置填写适当的表达式或语句,使得程序完成指定功能。

测试要求:1、连续插入5个实数;要求:插入的元素要分别位于表头、表中、表尾,以确保该插入函数适合于各种情况;2、翻转链表,确认成功后再翻转一次,恢复元素的升序序列;3、删除3个数组元素,删除的元素要分别要位于表头、表中、表尾,以确保该删除函数适合于各种情况;4、删除一个不存在的元素,确认链表的内容没被改变。

//***************************************//////#include <stdio.h>#include "malloc.h"#define null 0struct node{float data;struct node *next;};void insert(float aa,struct node *vq){struct node *newnode,*p;newnode=(struct node *)malloc(sizeof(struct node));newnode->data=aa;p=vq;while ((p->next!=null)&&(p->next->data<aa))/* 填空1 */newnode->data=aa;newnode->next=p->next;/* 填空2 */p->next=newnode;vq->data=vq->data+1;}void dele(float aa,struct node *vq){struct node *p,*q;p=vq;while ((p->next!=null)&&(p->next->data<aa))/* 填空3 */p++;p=p->next;if ((p->next==null)||(p->next->data!=aa))printf("\n%5.1f is not in the link !",aa);else if (p->next->data==aa){q=p->next;p->next=q->next;/* 填空4 */free(q);/* 填空5 */vq->data=vq->data-1;}}void print(struct node *vq){struct node *p;printf("\nthe length of link is %4.0f",vq->data);p=vq->next;printf("\nthe link is:");while (p!=NULL) /* 填空6 */{printf("%5.1f",p->data);/* 填空7 */p=p->next;}}void reverse(struct node *vq){struct node *q,*p;p=vq->next;vq->next=p->next;/* 填空8 */while (p!=null){q=p;p=p->next;/* 填空9 */q->next=p->next /* 填空10 */;vq->next=q;}}main(){int mark=1,op;float aa;struct node *vq;vq=(struct node *)malloc(sizeof(struct node));vq->data=0;vq->next=null;while (mark==1){printf("\nWhich kind of operation will you select ? ");printf("\ninsert---1, delete---2, print---3, reverse---4, exit---0 : ");scanf("%d",&op);switch (op){case 0: mark=0;break;case 1: printf("\nPlease input the new element:");scanf("%f",&aa);insert(aa,vq);print(vq);break;case 2: if (vq->data==0)printf("\n the link is null !",aa);else{printf("\nPlease input the deleted element:");scanf("%f",&aa);dele(aa,vq);print(vq);}break;case 3: print(vq);break;case 4: reverse(vq);print(vq);break;default:printf(" input error!\n");}}}////////***************************************以下是待填空的源代码,请同学们粘贴到系统中填空、运行、测试:/* 链表操作:插入、删除、输出、翻转用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。

实验五__线性表的链式表示和实现

实验五__线性表的链式表示和实现

浙江大学城市学院实验报告课程名称数据结构基础实验项目名称实验五线性表的链式表示和实现学生姓名专业班级学号实验成绩指导老师(签名)日期一.实验目的和要求1、了解线性表的链式存储结构,学会定义线性表的链式存储结构。

2、掌握单链表、循环单链表的一些基本操作实现函数。

二.实验内容1、设线性表采用带表头附加结点的单链表存储结构,请编写线性表抽象数据类型各基本操作的实现函数,并存放在头文件LinkList.h中(注:教材上为不带表头附加结点)。

同时建立一个验证操作实现的主函数文件test5.cpp,编译并调试程序,直到正确运行。

提示:⑴单向链表的存储结构可定义如下:struct LNode { // 定义单链表节点类型ElemType data; // 存放结点中的数据信息LNode *next; // 指示下一个结点地址的指针}⑵线性表基本操作可包括如下一些:①void InitList (LNode *&H) //初始化单链表②void ClearList(LNode *&H) //清除单链表③int LengthList (LNode *H) //求单链表长度④bool EmptyList (LNode *H) //判断单链表是否为空表⑤ElemType GetList (LNode *H, int pos)//取单链表第pos 位置上的元素⑥void TraverseList(LNode *H) //遍历单链表⑦bool InsertList ( LNode *&H, ElemType item, int pos)//向单链表插入一个元素⑧bool DeleteList ( LNode *&H, ElemType &item, int pos)//从单链表中删除一个元素⑶带表头附加结点的单链表初始化操作的实现可参考如下:void InitList(LNode *&H){ //构造一个空的线性链表H,即为链表设置一个头结点,//头结点的data数据域不赋任何值,头结点的指针域next则为空H=(LNode *)malloc(sizeof(LNode)); // 产生头结点Hif (!H) exit(0); // 存储分配失败,退出系统H->next=NULL; // 指针域为空}2、选做部分:编写一个函数void MergeList(LNode *&La, LNode *&Lb, LNode *&Lc),实现将两个有序单链表La和Lb合并成一个新的有序单链表Lc,同时销毁原有单链表La和Lb。

实验一 线性表的链式存储

实验一  线性表的链式存储

实验一线性表的链式存储【实验时间】【实验地点】【实验目的和要求】1.掌握线性表的结构特点和表示方法;2.掌握线性表链式存储结构特性和基本操作算法;3.掌握用指针实现单链表的建立、输出、插入和删除的算法。

【实验类型】验证性【实验时数】2学时【实验设备】计算机【参考资料】1.数据结构题解2.C程序设计【实验内容】熟练掌握线性表的链式表示和实现方法,利用其定义具体的链表结点;利用链表的结构特点,建立单链表;利用链表结点间的指针关系,实现链表的插入和删除。

[具体要求](1) 建立单链表时,要首先输入链表长度,根据输入值来确定所建链表的结点个数;(2) 在单链表中插入新结点时,要给出结点的插入位置和数据域的值;(3) 在单链表中删除某个结点时,要给出要删结点的位置;(4) 要编写单链表的输出函数,以便能验证程序的执行结果。

【实验分析】1、实验的第一步应该建立单链表结点类型和程序所需的宏或数据类型,例如:#define NULL 0 //宏定义NULL的值为0#define LEN sizeof(struct node) //宏定义LEN,为申请结点空间时做准备typedef struct{ int a;float b;} elemtype; //定义elemtype类型,这里同学们可以根据自己的情况来自行定义。

typedef struct node{elemtype data; //data域为elemtype类型的,它应该包含两个子域:a和bstruct node *next;}NODE , *NODEPTR; //定义了单链表结点类型和单链表结点指针类型2、对单链表的四种操作进行实现。

(1) NODEPTR creatlink() 建立单链表的函数很明显这个函数的返回值时结点指针类型的,所以这个函数应该返回的时建立的单链表的头指针。

同学们可以根据自己的构思,从前往后或从后往前建立单链表。

此外,提醒同学们最好建立带有附加头结点的单链表。

实验二 线性表的链

实验二 线性表的链

成 绩评 阅 人评阅日期计算机科学与技术系实 验 报 告课程名称:_________________________实验名称:_________________________班 级:_________________________学 号:_________________________姓 名:_________________________201年月日实验二 线性表的链数据结构 计算机实验二线性表的链式存储一、实验目的1、掌握线性表的链接存储结构;2、验证单链表及其基本操作的实现;3、进一步掌握数据结构及算法的程序实现的基本方法。

二、实验内容1、用头插法或尾插法建立带头结点的单链表;2、对已建立的单链表实现插入、删除、查询等基本操作。

三、实现提示1、将单链表中结点定义为如下结构类型:template <class T>struct Node{T data;Node<T> *next;};2、定义单链表的数据类型,单链表类LinkList,包括题目要求的插入、删除、查找等基本操作,为便于查看操作结果,设计一个输出函数依次输出单链表的元素。

template <class T>class LinkList{public:LinkList( ); //建立只有头结点的空链表LinkList(T a[ ], int n); //建立有n个元素的单链表~LinkList(); //析构函数int Length(); //求单链表的长度T Get(int i); //取单链表中第i个结点的元素值int Locate(T x); //求单链表中值为x的元素序号void Insert(int i, T x); //在单链表中第i个位置插入元素值为x的结点T Delete(int i); //在单链表中删除第i个结点void PrintList( ); //遍历单链表,按序号依次输出各元素private:Node<T> *first; //单链表的头指针};四、算法描述template <class T>struct Node{T data;Node<T> *next;}单链表类的声明:template <class T>class LinkList{public:LinkList( ){first=new Node<T>; first->next=NULL;}LinkList(T a[ ], int n);~LinkList( );int Length( );T Get(int i);int Locate(T x);void Insert(int i, T x);T Delete(int i);void PrintList( );private:Node<T> *first;};单链表查找算法Get:1、工作指针p初始化;累加器j初始化;2、执行下列操作,直到p为空或p执行第i个结点2.1 工作指针p后移;2.2 累加器j加1;3、若p为空,则第i个元素不存在,抛出查找位置异常;否则查找成功,返回结点p的数据元素;单链表插入算法Insert:1、工作指针p初始化;累加器j清零2、查找第i-1个结点并使工作指针p指向该节点;3、若查找不成功,说明插入位置不合理,抛出插入位置异常;否则,3.1生成一个元素值为x新结点s;3.2将新结点s插入到结点p之后;单链表删除算法Delete:1、工作指针p初始化;累加器j清零;2、查找第i-1个结点并使工作指针p指向该结点;3、若p不存在或p的后继结点不存在,抛出位置异常;否则,3.1 暂存被删除结点和被删除元素值;3.2 摘链,将结点p的后继结点从链表上摘下;3.3 释放被删结点;3.4 返回被删元素值;五、程序清单主函数#include <iostream.h>#include "2-1source.cpp"void main( ){LinkList<int>a; //创建一个空的顺序表cout<<"执行插入操作:"<<endl;try{a.Insert(1,1);a.Insert(2,3);a.Insert(3,4);}catch(char* wrong){cout << wrong; //如失败提示失败信息}cout<<"已经插入“1,3,4”"<<endl;cout<<endl;cout<<"顺序表a的长度为:";cout<<a.Length()<<endl; //返回单链表长度cout<<endl;cout<<"按位查询第二个元素:"<<endl;cout<<"第二个元素为:";cout <<a.Get(2)<<endl; //查找顺序表中第二个元素cout<<endl;cout<<"按值查询3:"<<endl;cout<<"值为3的元素位置为:";cout<<a.Locate(3)<<endl; //查找元素3,并返回在单链表中位置cout<<endl;try{if(a.Length()){cout<<"执行删除第一个元素操作:"<<endl;cout<<endl;a.Delete(1); //删除元素1cout<<"已删除成功,顺序表a的长度为:";cout<<a.Length()<<endl;}else{cout<<"顺序表a长度为0"<<endl;}}catch(char* wrong){cout << wrong; //如失败提示失败信息}cout<<endl;cout<<"顺序表a中的元素有:"<<endl;a.PrintList(); //输出所有元素int r[]={1,2,3,4,5};LinkList <int> b(r,5); //根据数组创建顺序表cout<<"执行插入操作前顺序表b为:"<<endl;b.PrintList(); //输出顺序表所有元素cout<<"插入前顺序表b的长度为:";cout<<b.Length()<<endl;try{b.Insert(3,8);}catch(char* wrong){cout << wrong; //如失败提示失败信息}cout<<"执行插入操作后顺序表b为:"<<endl;b.PrintList(); //输出顺序表b所有元素cout<<"插入后顺序表b的长度为:";cout<<b.Length()<<endl;cout<<endl;try{if(a.Length()){cout<<"执行删除第一个元素操作:"<<endl;cout<<endl;b.Delete(1); //删除b中第一个元素 cout<<"已删除成功,顺序表b的长度为:";cout<<b.Length()<<endl;}else{cout<<"顺序表b长度为0"<<endl;}}catch(char* wrong){cout << wrong; //如失败提示失败信息}cout<<"执行插入操作后顺序表b为:"<<endl;b.PrintList(); //输出顺序表所有元素}#include "2-1-header.h"template <class T>struct Node{T data;Node<T> *next;};template <class T>LinkList<T>:: LinkList( ){length=0;}template <class T>LinkList<T>:: LinkList(T a[], int n){if (n>MaxSize) throw "参数非法";for (int i=0; i<n; i++)data[i]=a[i];length=n;}template <class T>LinkList<T>:: ~LinkList( ){}template <class T>void LinkList<T>::Insert(int i, T x){int j;if (length>=MaxSize) throw "上溢";if (i<1 || i>length+1) throw "位置";for (j=length; j>=i; j--)data[j]=data[j-1]; //注意第j个元素存在数组下标为j-1处 data[i-1]=x;length++;}template <class T>T LinkList<T>::Delete(int i){int x,j;if (length==0) throw "下溢";if (i<1 || i>length) throw "位置";x=data[i-1];for (j=i; j<length; j++)data[j-1]=data[j]; //注意此处j已经是元素所在的数组下标 length--;return x;}template <class T>int LinkList<T>::Length(){return length;}template <class T>T LinkList<T>::Get(int i){if (i<1 && i>length) throw "查找位置非法";else return data[i-1];}template <class T>int LinkList<T>::Locate(T x){for (int i=0; i<length; i++)if (data[i]==x)return i+1 ; //下标为i的元素等于x,返回其序号i+1 return 0; //退出循环,说明查找失败}template <class T>void LinkList<T>::PrintList(){for(int i=0;i<length;i++)cout<<data[i]<<endl;}头文件#ifndef LinkList_H#define LinkList_Hconst int MaxSize=100; //100只是示例性的数据,可以根据实际问题具体定义template <class T> //定义模板类SeqListclass LinkList{public:LinkList( ); //无参构造函数LinkList(T a[], int n); //有参构造函数~LinkList(); //析构函数为空int Length(); //求线性表的长度T Get(int i); //按位查找,取线性表的第i个元素int Locate(T x); //按值查找,求线性表中值为x的元素序号void Insert(int i, T x); //在线性表中第i个位置插入值为x的元素 T Delete(int i); //删除线性表的第i个元素void PrintList(); //遍历线性表,按序号依次输出各元素private:T data[MaxSize]; //存放数据元素的数组int length; //线性表的长度};#endif六、思考题:为单链表的结点设计一个结点类,重新实现单链表基本操作的验证。

链式存储实验报告

链式存储实验报告

线性表的链式存储
一、目的:
1.顺序表链式存储结构的运算;
2.顺序表空间分配好后的各个运算的执行;
3.顺序表中的打印、输入、置空表、长度、插入、删除的运算等
二、功能层次图:
三、运行结果:
主菜单:
建立链表:
打印 线性表的链式存储
输入 置空表 长度 插入 删除
打印链表:
链表查询:
四、小结:
1.线性表的线性存储是将线性表中的结点采用连接的方式存储;
2.链式存储是用任意的存储单元来存储数据的,这个单元可以使连续的也可以是不连续的,所以链表的结点的逻辑次序和物理次序不一定相同;
3.链表中每个结点的的存储地址是放在前一个前驱的next,而第一个结点无前驱则头指针是head;
4.链表在查找运算中耗时较多,在查找是链表必须从头指针开始扫描才能获得;
5.链表在进行插入和输出运算,都只用修改指针的存放地址的单元。

实验二 线性表链式存储运算的算法实现(昆工版)

实验二 线性表链式存储运算的算法实现(昆工版)

昆明理工大学信息工程与自动化学院学生实验报告( 2013 — 2014 学年第三学期 )课程名称:数据结构 开课实验室:信自楼444 2013年11月12日注:报告内容按实验须知中七点要求进行。

一、实验目的和要求1.掌握线性表链式存储结构的C 语言描述及运算算法的实现;2.分析算法的空间复杂度和插入和删除的时间复杂度;3.总结比较线性表顺序存储存储与链式存储的各自特点。

程序功能: 1.(菜单)主程序; 2.链表的建立; 3.链表的数据插入;4.链表的数据删除;5.链表的数据输出;二、实验原理及基本技术路线图(方框原理图) 三、所用仪器、材料(设备名称、型号、规格等) 联想计算机一台Microsoft Visual c++ 6.0四、程序源代码#include<stdio.h>#include<conio.h>#include<malloc.h>#include<stdlib.h>typedef int dataType;typedef struct node{dataType data;struct node *next;}linkList;linkList *createList(){int num;linkList *head,*s,*r;head=NULL;r=NULL;printf("Enter the number(0 to stop):");scanf("%d",&num);while(num!=00){s=(linkList*)malloc(sizeof(linkList));s->data=num;if(head==NULL) head=s;else r->next=s;r=s;printf("Enter the number(0 to stop):");if(r!=NULL) r->next=NULL;return head;}linkList *get(linkList *head,int i){int j;linkList *p;p=head;j=0;while((p->next!=NULL)&&(j<i)){p=p->next;j++;}if(i==j) return p;else return NULL;}linkList *locate(linkList *head,dataType key) {linkList *p;p=head->next;while(p!=NULL){if(p->data!=key)p=p->next;else break;}return p;}s=(linkList*)malloc(sizeof(linkList));s->data=x;s->next=p->next;p->next=s;}void insertBefore(linkList *p,dataType x){linkList *s;s=(linkList*)malloc(sizeof(linkList));s->data=p->data;s->next=p->next;p->next=s;p->data=x;}void insert(linkList *L,dataType x,int i){linkList *p;int j;j=i-1;p=get(L,j);if(p==NULL){printf("erro\n");getch();}else {insertAfter(p,x);printf("\nInsert Succeed");getch();} }r=p->next;p->next=r->next;free(r);}void Delete(linkList *L,int i){int j;linkList *p;j=i-1;p=get(L,j);if(p!=NULL&&p->next!=NULL){deleteAfter(p);printf("\nDelete Succeed");getch();} else{printf("error\n");getch();}}void display(linkList *head){int i=1;if(head==NULL){printf("Empty List\n");}while(head!=NULL){head=head->next;i++;}}char caiDan(){char ch;do{printf("1:Create New List\n");printf("2:Insert\n");printf("3:Delete\n");printf("4:Display\n");printf("5:Exit\n");printf("Please Choose:");}while(ch=getch(),ch!='1'&&ch!='2'&&ch!='3'&&ch!='4'&&ch!='5'); return ch;}void main(){linkList *head=NULL;char ch;int i,key;do{system("cls");ch=caiDan();printf("%c",ch);getch();switch(ch){case '1': head=createList();printf("List was created successfully");getch();break;case '2': display(head);if(head==NULL) { getch(); break; }else {printf("\nInput Key:");scanf("%d",&key);printf("Input Index u want to insert after:");scanf("%d",&i);insert(head,key,i);break; }case '3': display(head);if(head==NULL) { getch(); break; }else {printf("\nInput index you want to delete:");scanf("%d",&i);Delete(head,i-1);break; }case '4': display(head);getch();break;case '5': exit(0);}}while(ch!='5');}五、运行结果(1)创建单链表(2)插入单链表(4)删除单链表(6)插入错误(7)删除错误六、实验总结在做这个程序的时候,虽然遇到一些问题,但最后都被我解决,自信心上得到比较大的提升,这也是这次实践最大的收获。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(p!=NULL && j<pe-1)
{
p = p->next;
j++;
}
if(p==NULL)
{
printf("插入的位置超过合法范围\n");
exit(0);
}
else if(pe==1)
{
q = (Link *)malloc(sizeof(Link));
if(q==NULL)
{
printf("空间不足,节点申请失败!\n");
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
break;
case 2:
printf("1按序号查找\n2按值查找\n");
while(m=='y')
{
printf(&##34;%d",&chioce);
}
q->data = e;
q->next = p;
head->next = q;
}
else
{
q = (Link *)malloc(sizeof(Link));
if(q==NULL)
{
printf("空间不足,节点申请失败!\n");
exit(0);
}
q->data = e;
q->next = p->next;
实验报告
学号:****************年**月**日
系别
***
专业
**
班级
1班
姓名
****
课程名称
数据结构
课程类型
专业必修
学时数
2
实验名称
线性表的链式存储实验
实验目的和要求:
(1)掌握用在VC环境下上机调试单链表的基本方法
(2)掌握单链表、循环链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现
{
printf("次链表为空!请先创建链表\n");
exit(0);
}
while(p!=NULL && i<k)
{
p = p->next;
i++;
}
if(p==NULL)
{
printf("输入序号超过表长!\n");
exit(0);
}
else
printf("第%d个元素为%d\n",k,p->data);
scanf(" %c",&m);
}
break;
case 3:
printf("输入插入的数值:");
scanf("%d",&e);
printf("输入节点的位置:");
scanf("%d",&pe);
Insert_elem(head,pe,e);
break;
case 4:
printf("1按位置删除\n2按值删除\n3删除链表中所有的重复元素\n");
p->next = q;
}
printf("插入新节点后的链表为:\n");
p = head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
//删除元素
void Delete(Link *head,int chioce)
{
int k,j=1;
while(1)
{
printf("请选择要执行的操作:");
scanf("%d",&chioce);
Delete(head,chioce);
printf("\n是否继续操作(y/n):");
scanf(" %c",&c);
if(c=='n')
break;
}
break;
case 5:
printf("\n创建第一个列表\n");
exit(0);
break;
}
}while(pick!=0);
}
运算结果:
二、循环链表的基本操作
源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
int data;
struct link *next;
}Link;
//创建链表并初始化
scanf(" %c",&c);//注意吸收回车符
getchar();
while(c=='y')
{
i++;
headLb = Create_link(headLb);
printf("是否要创建新的节点(y/n):");
scanf(" %c",&c);//吸收回车符可以在scanf后加入多个空格
}
p = headLb->next;
}
else
{
printf("%d在第%d个位置且地址为%d\n",key,i,p);
}
}
//将e插入链表的第pe个位置
void Insert_elem(Link *head,int pe,int e)
{
Link *q = NULL;//q用于申请新节点
Link *p = head->next;
int j=1;
p->next = NULL;
printf("请输入该结点的数据:");
scanf("%d",&(p->data));
}
return head;
}
//在链表中按序号查找
void Insert_link(Link *head,int k)
{
int i=1;
Link *p = head->next;
if(head==NULL)
printf("是否要创建新的节点(y/n):");
scanf(" %c",&c); //注意吸收在选择时的回车符
getchar();
while(c=='y')
{
i++;
headLa = Create_link(headLa);
printf("是否要创建新的节点(y/n):");
scanf(" %c",&c);
int chioce,pick;
int e,pe;
printf("1创建链表\n2链表的查找\n3链表的插入\n4链表的删除\n5两链表的合并\n6退出操作\n");
do{
printf("\n选择:");
scanf("%d",&pick);
switch(pick)
{
case 1:
printf("是否要创建新的节点(y/n):");
Link *ptr =NULL;
while(pa && pb)
{
if(pa->data < pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else if(pa->data > pb->data)
{
pc->next = pb;
pc = pb;
pb = pb->next;
printf("共创建%d个节点\n链表为:\n",i);
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
printf("\n合并后的链表为\n");
Merge(headLa,headLb);
break;
case 0:
printf("退出操作!\n");
switch(chioce)
{
case 1:
printf("输入序号:");
scanf("%d",&k);
Insert_link(head,k,i);
break;
case 2:
printf("输入元素值:");
scanf("%d",&key);
Find_elem(head,key);
break;
}
printf("是否继续查找(输入y/n):");
if(p==NULL)
{
printf("没有足够的空间!\n");
exit(0);
}
if(head==NULL)
{
head = p;
p->next = NULL;
相关文档
最新文档