实验三:线性表应用--链表

合集下载

数据结构实验报告实验总结

数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。

通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。

下面对每一部分实验进行总结。

实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。

在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。

实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。

通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。

实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。

通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。

实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。

通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。

通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。

同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。

在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。

通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。

总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。

在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。

实验三四 链表的实现和应用

实验三四 链表的实现和应用

江南大学物联网工程学院上机报告课程名称 班 级 数据结构 上机名称 姓 名 链表的实现和应 用 上机日期 学 号 2016.3.11 上机报告要求 1.上机名称 2.上机要求 3.上机环境 4.程序清单(写明运行结果) 5.上机体会1.上机名称链表的实现和应用2.上机要求⑴定义线性表的链式存储表示; ⑵基于所设计的存储结构实现线性表的基本操作; ⑶编写一个主程序对所实现的线性表进行测试; ⑷线性表的应用:①设线性表 L1和 L2分别代表集合 A 和 B,试设计算法求 A 和 B 的并集 C,并用线 性表 L3代表集合 C;②设线性表 L1和 L2中的数据元素为整数,且均已按值非递减有序排列,试 设计算法对 L1和 L2进行合并,用线性表 L3保存合并结果,要求 L3中的数据元素也按值非递减 有序排列。

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

3.上机环境Visual C++ 6.04.程序清单(写明运行结果)(1) #include<stdio.h> #include<stdlib.h> typedef int datatype; typedef struct node { datatype data; struct node *next; }LinkList; LinkList *CREATLISTF(LinkList *L,int n) { intnum,i; LinkList *head,*s,*r; head=L; r=head; head->next=NULL;printf("请输入集合中的元素(由小到大) :\n"); for(i=0;i<n;i++) { scanf("%d",&num); s=(LinkList*)malloc(sizeof(LinkList)); s->data=num; r->next=s; r=s; } r->next=NULL; return head; } LinkList *merge(LinkList *L1,LinkList *L2) { LinkList *L3,*pa,*pb1,*pb2,*pc; L3=(LinkList*)malloc(sizeof(LinkList)); L3->next=NULL; pa=L1->next; pb1=pb2=L2->next; pc=L3; while(pa && pb1) if(pa->data<pb1->data) { pc->next=pa;pc=pa; pa=pa->next; } else if(pa->data>pb1->data) { pc->next=pb1;pc=pb1; pb1=pb1->next; } else { pc->next=pa; pc=pa;pa=pa->next;pb1=pb2=pb1->next; } if(pa)pc->next=pa; else pc->next=pb1; return(L3); } void display(LinkList *L) { LinkList *head; head=L->next;do { printf("%d\t",head->data); head=head->next; }while(head!=NULL); } void main() { intan,bn; LinkList *L1,*L2,*L3; L1=(LinkList*)malloc(sizeof(LinkList)); L2=(LinkList*)malloc(sizeof(LinkList)); printf("\n 集合 A 中元素的个数:\n"); scanf("%d",&an); *L1=*CREATLISTF(L1,an); printf("集合 A 的元素为:\n"); display(L1); printf("\n 集合 B 中元素的个数:\n"); scanf("%d",&bn); *L2=*CREATLISTF(L2,bn); printf("集合 B 的元素为:\n"); display(L2); L3=merge(L1,L2); printf("\n 集合 A 与集合 B 的并集为:\n"); display(L3); }(2) #include<stdio.h> #include<stdlib.h> struct node { intexp; float coef; struct node *next; }; typedef struct node ListNode; ListNode *createpoly() { ListNode *h=NULL,*p,*q=NULL; int e; float c; printf("请输入系数和指数:"); scanf("%f,%d",&c,&e); while(e!=0||c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(h==NULL) h=p; else q->next=p; q=p; printf("请输入系数和指数:"); scanf("%f,%d",&c,&e); } return h; } void disppoly(ListNode *h) { ListNode *p; p=h; while(p!=NULL) { if(p->exp==0) printf("%.2f",p->coef); else printf("%fx^%d",p->coef,p->exp); p=p->next;if(p!=NULL) printf("+"); } printf("\n"); } ListNode *addpoly(ListNode *h1,ListNode *h2) { ListNode *p,*r=NULL,*s1,*s2,*s=NULL; float c; int e; s1=h1; s2=h2; while(s1!=NULL&&s2!=NULL) { if(s1->exp==s2->exp) { c=s1->coef+s2->coef; e=s1->exp; s1=s1->next; s2=s2->next; } else if(s1->exp>s2->exp) { c=s1->coef; e=s1->exp; s1=s1->next; } else { c=s2->coef; e=s2->exp; s2=s2->next; } if(c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(s==NULL) s=p; else r->next=p; r=p;} } while(s1!=NULL) { c=s1->coef; e=s1->exp; s1=s1->next; if(c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(s==NULL) s=p; else r->next=p; r=p; } } while(s2!=NULL) { c=s2->coef; e=s2->exp; s2=s2->next; if(c!=0) { p=(ListNode*)malloc(sizeof(ListNode)); p->coef=c; p->exp=e; p->next=NULL; if(s==NULL) s=p; else r->next=p; r=p; } } return s; } void deletepoly(ListNode *h) { ListNode *p,*r=h; while(r!=NULL){ p=r->next; free(r); r=p; } } void main() { ListNode *head1,*head2,*head; printf("第一个多项式为:\n"); head1=createpoly(); printf("第二个多项式为:\n"); head2=createpoly(); printf("将两个多项式相加后得:\n"); head=addpoly(head1,head2); disppoly(head); deletepoly(head); }5.上机体会并集的表示有两种方法,顺序结构和链式结构,首先先要搞清楚这两者的区别,然后再加以编写,改进程 序。

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

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

实验报告课程名称____数据结构上机实验__________ 实验项目______线性表的应用 ____________实验仪器________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.先创建链表,存储多项式;2.输出多项式;3.两个多项式相加;4.输出多项式。

三、程序代码#include <stdio.h>#include <stdlib.h>#include <math.h>//一元多项式链式储存的节点结构typedef struct Polynode{float coef;int exp;struct Polynode * next;} Polynode , * Polylist;//建立一元多项式的链表Polylist polycreate(){Polynode * head,* rear,* s;float c;int e;head=(Polynode* )malloc(sizeof(Polynode));rear=head;scanf("%f,%d",&c,&e);while(c!=0){s=(Polynode * )malloc(sizeof(Polynode));s->coef=c;s->exp=e;rear->next=s;rear=s;scanf("%f,%d",&c,&e);}rear->next=NULL;return(head);}//输出多项式void print(Polynode*L){Polynode*p;p=L->next;printf("a=");if(p&&p->coef!=0)printf("%.2f*x^%d",p->coef,p->exp);while(p->next!=NULL){if((p->next->coef)>0&&p)printf("+");elseprintf("-");p=p->next;printf("%.2f*x^%d",fabs(p->coef),p->exp);}}//多项式相加void polyadd(Polylist polya,Polylist polyb){Polynode*p,*q,*tail,*temp;int sum;p=polya->next;q=polyb->next;tail=polya;while (p!=NULL&&q!=NULL){if(p->exp<q->exp){tail ->next=p; tail=p;p=p->next;}else if (p->exp==q->exp);{sum=p->coef+q->coef;if(sum!=0){p->coef=sum;tail->next=p;tail=p;p=p->next;temp=q;q=q->next;free(temp);}else{temp=p;p=p->next;free(temp);temp=q;q=q->next;free(temp);}}{tail ->next=q;tail=q;q=q->next;}}if(p!=NULL)tail->next=p;elsetail->next=q;}void main(){Polynode*a,*b;printf("输入a的系数和指数:\n");a = polycreate();print(a);printf("\n");printf("输入b的系数和指数:\n");b = polycreate();print(b);printf("\n");polyadd(a,b);printf("两个多项式的和为:\n");print(a);}四、实验结果五、实验过程中遇到的问题及处理方法程序运行时,在中文状态下输入“,”回车后就不能再输入了,应在英文状态下输入“,”。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。

具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。

2、理解栈和队列的特性,并能够实现其基本操作。

3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。

4、学会使用图的数据结构,并实现图的遍历和相关算法。

二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。

三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。

实现顺序表的初始化、插入、删除和查找操作。

2、链表的实现定义链表的节点结构,包含数据域和指针域。

实现链表的创建、插入、删除和查找操作。

(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。

实现栈的入栈、出栈和栈顶元素获取操作。

2、队列的实现采用循环队列的方式实现队列的数据结构。

完成队列的入队、出队和队头队尾元素获取操作。

(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。

2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。

3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。

(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。

2、图的遍历实现深度优先遍历和广度优先遍历算法。

四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。

删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。

2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。

(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。

入栈和出栈操作的时间复杂度均为 O(1)。

2、队列队列的特点是先进先出,常用于排队、任务调度等场景。

数据结构线性表实验报告

数据结构线性表实验报告

数据结构线性表实验报告数据结构线性表实验报告实验目的:本次实验主要是为了学习和掌握线性表的基本操作和实现方式。

通过实验,我们可以加深对线性表的理解,并能够熟悉线性表的基本操作。

实验设备与环境:本次实验所需的设备包括计算机和编程环境。

我们选择使用C语言来实现线性表的操作,并在Visual Studio Code编程软件中进行编写和调试。

实验内容:1.线性表的定义和基本操作1.1 线性表的定义:线性表是一种有序的数据结构,其中的元素按照一定的顺序存储,可以插入、删除和访问元素。

1.2 线性表的基本操作:1.2.1 初始化线性表:创建一个空的线性表。

1.2.2 判断线性表是否为空:判断线性表是否不含有任何元素。

1.2.3 获取线性表的长度:返回线性表中元素的个数。

1.2.4 在线性表的指定位置插入元素:在线性表的第i个位置插入元素x,原第i个及其之后的元素依次后移。

1.2.5 删除线性表中指定位置的元素:删除线性表中第i个位置的元素,原第i+1个及其之后的元素依次前移。

1.2.6 获取线性表中指定位置的元素:返回线性表中第i个位置的元素的值。

1.2.7 清空线性表:将线性表中的元素全部删除,使其变为空表。

2.线性表的顺序存储结构实现2.1 线性表的顺序存储结构:使用数组来实现线性表的存储方式。

2.2 线性表的顺序存储结构的基本操作:2.2.1 初始化线性表:创建一个指定长度的数组,并将数组中的每个元素初始化为空值。

2.2.2 判断线性表是否为空:判断线性表的长度是否为0。

2.2.3 获取线性表的长度:返回线性表数组的长度。

2.2.4 在线性表的指定位置插入元素:将要插入的元素放入指定位置,并将原位置及其之后的元素依次后移。

2.2.5 删除线性表中指定位置的元素:将指定位置的元素删除,并将原位置之后的元素依次前移。

2.2.6 获取线性表中指定位置的元素:返回指定位置的元素的值。

2.2.7 清空线性表:将线性表数组中的每个元素赋空值。

《数据结构》实验3链表

《数据结构》实验3链表
二、源代码以及输入数据输出结果为:
三、源代码以及实验结果为
四、源代码以及实验结果为
五、源代码以及实验结果为
六、源代码以及实验结果为
七、附加题以及实验体会:
{
NODE *s; /*定义指向结点类型的指针*/
s=(NODE *)malloc(sizeof(NODE));
/*生成新结点*/
3
4
5
return 1;
}
/*删除P所指向的结点的后继结点*/
void DelLinkList(NODE *p)
{ NODE *q;
if(p->next!=0)
{ q=p->next; /* q指向p的后继结点*/
ch=getchar();
while(ch!='$')
{ p=(NODE *)malloc(sizeof(NODE));
p->data=ch;
1
2
ch=getchar();
}
return (head);
}
/*在链表的P指定结点之后插入值为x的结点*/
int InsLinkList(NODE *p, char x)
四、设有两个单链表A、B,其中元素递增有序,编写算法将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。
五、已知单链表表示的线性表中含有两类的数据元素(字母字符,数字字符)。试设计算法,按结点的值将单链表拆分成两个循环链表,分别只含有数字或字母。要求:利用原表中的结点空间作为这两个表的结点空间,头结点可另开辟空间。
附加题:如果换成循环单链表该如何实现?
即题目变成:已知单循环链表表示的线性表中含有两类的数据元素(字母字符,数字字符)。试设计算法,按结点的值将单链表拆分成两个循环链表,分别只含有数字或字母。

数据结构与算法实验内容

数据结构与算法实验内容

数据结构与算法实验内容数据结构与算法是计算机科学的重要基础学科,它涵盖了许多相关的知识和技能。

实验作为教学的一种重要形式,可以帮助学生更好地理解和掌握数据结构与算法的概念、原理和应用。

下面将介绍一些常见的数据结构与算法实验内容。

一、线性表实验线性表是最基本也是最常用的数据结构之一,在实验中通常会涉及到顺序存储和链式存储两种实现方式。

实验内容包括:1.顺序存储线性表的实现与应用:包括插入、删除、查找等操作的实现,并应用到具体问题中,比如统计学生的成绩排名等。

2.链式存储线性表的实现与应用:使用指针构建链表,实现插入、删除、查找等操作,并将其应用到具体问题中,比如实现一个简单的个人通讯录。

二、栈和队列实验栈和队列是常用的数据结构,它们的实现和应用在算法中有着广泛的应用。

实验内容包括:1.栈的实现与应用:使用数组或链表实现栈,实现入栈、出栈等操作,并应用到具体问题中,比如计算中缀表达式的值。

2.队列的实现与应用:使用数组或链表实现队列,实现入队、出队等操作,并将其应用到具体问题中,比如模拟排队等待。

3.实现简单的计算器:使用栈实现一个简单的计算器,可以进行加减乘除等基本运算。

三、树和图实验树和图是一种重要的非线性数据结构,其实现和应用在许多算法中扮演了重要的角色。

实验内容包括:1.二叉树的实现与应用:使用数组或链表实现二叉树,并实现遍历、查找等操作,比如实现一个简单的二叉树。

2.图的实现与应用:使用邻接矩阵或邻接表实现图,并实现深度优先、广度优先等操作,比如求解迷宫问题。

3.哈夫曼树的构造与应用:使用优先队列和贪心算法构造哈夫曼树,并将其应用于数据压缩等问题中。

四、排序和查找实验排序和查找是算法中的经典问题,涵盖的算法十分丰富,并有许多经典的算法可以进行实现和比较。

1.基本排序算法的实现与比较:包括冒泡排序、插入排序、选择排序等算法的实现和性能比较。

2.高级排序算法的实现与比较:包括快速排序、归并排序、堆排序等算法的实现和性能比较。

线性表实验报告

线性表实验报告

线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。

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

三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。

在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。

线性表有两种存储结构:顺序存储结构和链式存储结构。

顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。

其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。

链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。

其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。

四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。

1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。

实现顺序表的初始化函数,将表的长度初始化为 0。

实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。

实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。

实现顺序表的遍历函数,输出表中的所有元素。

2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。

实现链表的创建函数,创建一个空链表。

实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。

实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。

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

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

序号73 学号2013112000 姓名张三实验 2 实验名称线性表及其应用难度等级B+一、需求分析1、问题描述设计一个一元稀疏多项式简单计算器.2、基本要求一元稀疏多项式基本功能包括:1)输入并建立多项式⏹一元n次多项式:P n(x)=c m错误!未找到引用源。

+c m-1错误!未找到引用源。

+…+c1错误!未找到引用源。

,其中n=e m>e m-1>…>e1≥0,c i≠0(i=1,2,m)⏹输入(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语言环境,本次实验要求对结构体、链表和多项式项的特点要熟练掌握。

实验 线性表的应用

实验 线性表的应用

实验报告实验项目:线性表的运用实验器材: Vc++6.0编程工具系别: 电子信息工程系学号: 0632323姓名: 赵烨昕实验日期: 2008.10.17指导老师:______________________张玲_________________________________ 实验成绩:____________________________________________________________实验一线性表的应用一.实验目的:掌握线性链表的存储、运算及应用。

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

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

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

三.程序清单:#include <stdio.h>#include <malloc.h>typedef struct node{ float coef; /*序数*/int expn; /*指数*/struct node *next; /*指向下一个结点的指针*/} PolyNode;void InitList(PolyNode *&L) /*初始化多项式单链表*/{L=(PolyNode *)malloc(sizeof(PolyNode)); /*建立头结点*/L->next=NULL;}int GetLength(PolyNode *L) /*求多项式单链表的长度*/{int i=0;PolyNode *p=L->next;while (p!=NULL) /*扫描单链表L,用i累计结点个数*/{i++;p=p->next;}return i;}PolyNode *GetElem(PolyNode *L,int i) /*返回多项式单链表中第i个结点的指针*/{int j=1;PolyNode *p=L->next;if (i<1 || i>GetLength(L))return NULL;while (j<i) /*沿next域找第i个结点*/{p=p->next;j++;}return p;}PolyNode *Locate(PolyNode *L,float c,int e) /*在多项式单链表中按值查找*/ {PolyNode *p=L->next;while (p!=NULL && (p->coef!=c ||p->expn!=e))p=p->next;return p;}int InsElem(PolyNode *&L,float c,int e,int i) /*在多项式单链表中插入一个结点*/ {int j=1;PolyNode *p=L,*s;s=(PolyNode *)malloc(sizeof(PolyNode));s->coef=c;s->expn=e;s->next=NULL;if (i<1 || i>GetLength(L)+1)return 0;while (j<i) /*查找第i-1个结点*p*/{p=p->next;j++;}s->next=p->next;p->next=s;return 1;}int DelElem(PolyNode *L,int i) /*在多项式单链表中删除一个结点*/{int j=1;PolyNode *p=L,*q;if (i<1 || i>GetLength(L))return 0;while (j<i) /*在单链表中查找第i-1个结点,由p指向它*/{p=p->next;j++;}q=p->next; /*q指向被删结点*/p->next=q->next; /*删除*q结点*/free(q);return 1;}void DispList(PolyNode *L) /*输出多项式单链表的元素值*/{PolyNode *p=L->next;while (p!=NULL){printf("(%g,%d) ",p->coef,p->expn);p=p->next;}printf("\n");}void CreaPolyList(PolyNode *&L,float C[],int E[],int n){int i;InitList(L);for (i=0;i<n;i++)InsElem(L,C[i],E[i],i+1);}void SortPloy(PolyNode *&L) /*对L的多项式单链表按expn域递增排序*/ {PolyNode *p=L->next,*q,*pre;L->next=NULL;while (p!=NULL){if (L->next==NULL) /*处理第1个结点*/{L->next=p;p=p->next;L->next->next=NULL;}else /*处理其余结点*/{pre=L;q=pre->next;while (q!=NULL && p->expn>q->expn) /*找q->expn刚大于或等于p->expn的结点*q的前驱结点*pre*/{pre=q;q=q->next;}q=p->next; /*在*pre结点之后插入*p*/p->next=pre->next;pre->next=p;p=q;}}}PolyNode *AddPoly(PolyNode *pa,PolyNode *pb){PolyNode *pc,*p1=pa->next,*p2=pb->next,*p,*tc,*s;pc=(PolyNode *)malloc(sizeof(PolyNode)); /*新建头结点*pc*/ pc->next=NULL; /*pc为新建单链表的头结点*/tc=pc; /*tc始终指向新建单链表的最后结点*/while (p1!=NULL && p2!=NULL){if (p1->expn<p2->expn) /*将*p1结点复制到*s并链到pc尾*/{s=(PolyNode *)malloc(sizeof(PolyNode));s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;tc->next=s;tc=s;p1=p1->next;}else if (p1->expn>p2->expn) /*将*p2结点复制到*s并链到pc尾*/{s=(PolyNode *)malloc(sizeof(PolyNode));s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;tc->next=s;tc=s;p2=p2->next;}else /*p1->expn=p2->expn的情况*/{if (p1->coef+p2->coef!=0) /*序数相加不为0时新建结点*s并链到pc尾*/{s=(PolyNode *)malloc(sizeof(PolyNode));s->coef=p1->coef+p2->coef;s->expn=p1->expn;s->next=NULL;tc->next=s;tc=s;}p1=p1->next;p2=p2->next;}}if (p1!=NULL) p=p1; /*将尚未扫描完的余下结点复制并链接到pc单链表之后*/else p=p2;while (p!=NULL){s=(PolyNode *)malloc(sizeof(PolyNode));s->coef=p->coef;s->expn=p->expn;s->next=NULL;tc->next=s;tc=s;p=p->next;}tc->next=NULL; /*新建单链表最后结点的next域置空*/return pc;}void main(){PolyNode *L1,*L2,*L3;float C1[]={3,6,5,7},C2[]={-9,8,11};int E1[]={2,0,15,4},E2[]={9,1,6};InitList(L1);InitList(L2);InitList(L3);CreaPolyList(L1,C1,E1,4);CreaPolyList(L2,C2,E2,3);printf("两多项式相加运算\n");printf(" 原多项式A:");DispList(L1);printf(" 原多项式B:");DispList(L2);SortPloy(L1);SortPloy(L2);printf("排序后的多项式A:");DispList(L1);printf("排序后的多项式B:");DispList(L2);L3=AddPoly(L1,L2);printf("多项式相加结果:");DispList(L3);}实验结果如下:选作题:从终端输入多项式实现多项式相加。

数据结构线性表操作实验报告

数据结构线性表操作实验报告

《数据结构》实验报告实验题目:线性表的操作实验目的:1.掌握上机调试线性表的基本方法;2.掌握线性表的一些基本操作;实验内容:将两个有序链表合并为一个有序链表一、需求分析1.实验程序中先创建两个有序链表,演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入两个链表中的相应数据。

2.将两个链表合并时可按数据从大到小或从小到大合并,用户根据提示可选择一种排序方式。

3.程序执行命令包括:(1)构造链表;(2)输入数据;(3)合并两个链表,根据用户需求选择一种排序方式;(4)将合并结果输出;(5)结束4.测试数据:链表1数据为:2,4,6,7,10链表2数据为:1,3,5,6,7,12按从小到达合并为:1,2,3,4,5,6,6,7,7,10,12;按从大到小合并为:12,10,7,7,6,6,5,4,3,2,1;二、概要设计1.基本操作Linklist creat ()操作结果:构造一个链表,并输入数据,返回头节点指针。

void print(Linklist head)初始条件:链表已存在;操作结果:将链表输出。

void MergeList_1(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从小到大的顺序合并。

void MergeList_2(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从大到小的顺序合并。

2.本程序包括四个模块:(1)主程序模块;(2)链表数据输入模块;(3)链表合并模块;(4)链表输出模块;三、详细设计1.元素类型,节点类型,指针类型主程序模块 数据输入 按从小到大合并两链表 按从大到小合并两链表 将新链表输出 将新链表输出typedef struct LNode //定义节点{int data;struct LNode *next;}LNode,* Linklist;2.每个模块的分析(1)主函数模块int main(){Linklist head1,head2;int i;printf("请输入链表1数据(由小到大,输入0表示输入结束):\n");head1=creat(); //创建链表1,将头结点指针返回为head1printf("请输入链表2数据(由小到大,输入0表示输入结束):\n");head2=creat();printf("请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):");scanf("%d",&i); //创建链表2,将头结点指针返回为head2if(i==1) //选择两种排序方式,如果输入1,则合并后按从小到大输出;输入其它数,合成链表按从大到小输出{printf("按小到大将两表合并得:\n");MergeList1(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}else{ printf("按从大到小将两表合并得:\n");MergeList2(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}return 0;}(2)数据输入创建链表模块Linklist creat() //创建链表函数,并将创建链表的头结点指针返回{Linklist head,p,s;int z=1,x;head=(LNode *) malloc(sizeof(LNode));p=head;while(z){scanf("%d",&x);if(x!=0) //输入0表示链表数据输入结束{s=(LNode *)malloc(sizeof(LNode));s->data=x;p->next=s;s->next=NULL;p=s;}elsez=0;}return(head);}(3)合并链表模块,两个函数分别表示两种排序方式,将链表合并后直接在函数中调用链表输出函数void print(Linklist head)将链表输出void MergeList_1(Linklist La,Linklist Lb)//已知链表La和Lb元素都按从小到大排列,将La和Lb合并成新链表,其中元素也按从小到大排列{Linklist pa,pb,pc,Lc;pa = La->next; pb = Lb->next;Lc = pc = La; //把La的头节点作为新建链表Lc的头结点while (pa && pb){if (pa->data <= pb->data){pc->next = pa;pc = pa;pa = pa->next;}else{pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb; //插入剩余段print(Lc); //将链表Lc输出}void MergeList_2(Linklist La,Linklist Lb)//已知链表La和Lb的元素都按从小到大排列,合并La和Lb得到新链表,其中元素按照从大到小的顺序排列{Linklist pa,qa,pb,qb,Lc; //设指针qa,qb,分别作为pa,pb的前驱的指针pa=La->next;pb=Lb->next;Lc=La;Lc->next=NULL;while(pa&&pb){if(pa->data<=pb->data){qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}else{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}}while(pa) //如果pa不为空,则将La链的剩余段倒叙插入到头节点的后面{qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}while(pb) //如果pb不为空,则将Lb链的剩余段倒叙插入到头结点的后面{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}print(Lc); //将新合成的链表Lc输出}(4)链表输出模块,实现最终链表的输出void print(Linklist head) //链表输出函数,将链表输出{LNode *p;p=head->next;if(head!=NULL)do{printf("%d ",p->data);p=p->next;} while (p);printf("\n");四、程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.0;(2)进入演示程序后显示提示信息:请输入链表1数据(由小到大,输入0表示输入结束):按要求输入数据请输入链表2数据(由小到大,输入0表示输入结束):按要求输入数据请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):输入数据选择合并方式2.测试结果对链表1输入数据2,4,6,7,10,0对链表2输入数据1,3,5,6,7,12,0输入数据选择排序方式:如果输入:1 输出结果为:1,2,3,4,5,6,6,7,7,10,12如果输入:3(整数非1)输出结果为:12,10,7,7,6,6,5,4,3,2,13.调试中遇到的错误分析第一次运行时有问题,看以看出它的排序方式是对的,但是输出是多出前面一个很大的数,可能是输出函数void print(Linklist head)有问题,检查程序:此处逻辑出错,直接将p指针指向head,然后就将p->data输出,因此第一个数是头指针head所对应节点的值,所以可将p=head;改为p=head->next;这样p就指向第一个节点。

线性表 链表实验报告-链表线性表

线性表 链表实验报告-链表线性表

[线性表链表实验报告]链表线性表实验一:线性表运算的实现班级姓名学号一、实验预备知识1复习C++中编写函数的相关内容。

2复习如何用主函数将多个函数连在一起构成一个C++完整程序。

二、实验目的1掌握线性表的顺序和链式存储结构2熟练运用线性表在顺序存储方式下的初始化、创建、输出、插入和删除运算3熟练运用线性表在链式存储方式下的创建、输出、插入和删除运算三、实验要求1编写初始化并创建线性表和输出线性表的算法。

2编写对线性表插入和删除运算算法,要判断位置的合法性和溢出问题。

3编写一个主函数,将上面函数连在一起,构成一个完整的程序。

4将实验源程序调试并运行,写出输入、输出结果,并对结果进行分析。

四、实验步骤◇顺序表实验内容:1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。

2.初始化并建立顺序表。

3.编写顺序表输出算法。

(内存中开辟的单元数为8)4.依次插入3,21,15三个数,分别插入在第4,6和2位置,每插入一次都要输出一次顺序表。

5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次顺序表。

◇单链表实验内容:1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。

2.建立一个带表头结点的单链表(前插入法和尾插入法都可以)。

3.编写单链表输出算法。

4.依次插入3,21,15三个数,分别插入在第4,6和12位置,每插入一次都要输出一次单链表。

5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次单链表。

五、实验程序◇顺序表实验//LinkList.h#defineMAXSIZE8typedefintDataType;typedefstruct{DataTypedata[MAXSIZE];intlast;}Seqlist;voidcreat_seqlist(Seqlists);voiddisplay_seqlist(Seqlists);intinsert_seqlist(Seqlists,inti,DataTypex);intdelet_seqlist(Seqlists,inti);//LinkList.cpp#include#include”Seqlist.h”voidcreat_seqlist(Seqlists){intx,i=0;coutcinx;while(x!=-1){s.data[i]=x;cinx;i++;}st=i-1;}voiddisplay_seqlist(Seqlists){inti;coutfor(i=0;icoutcout}intinsert_seqlist(Seqlists,inti,DataTypex){intj;if(st==MAXSIZE-1){}st+2){cout=i-1;j--)s.data[j+1]=s.data[j];s.data[i-1]=x;st ++;return1;intdelet_seqlist(Seqlists,inti){intj;if(st+1){coutreturn-1;}for(j=i;js.data[j-1]=s.data[j];st--;return1;}//main.cpp#include#include”Seqlist.h”intmain(){intx,d,s;Seqlists_list;creat_seqlist(s_list);coutd;coutx;s=insert_seqlist(s_list,d,x);if(s==1){coutd;s=delet_seqli st(s_list,d);}if(s==1){cout运行结果:请输入数据(以输入-1结束)12257421938-1顺序表为:12257421938插入操作请输入插入的位置:4请输入要插入的数据:3插入后的顺序表为:122573421938请输入插入的位置:6请输入要插入的数据:21插入后的顺序表为:12257342211938请输入插入的位置:2请输入要插入的数据:15表满!删除操作请输入删除元素的位置:5删除后的顺序表为:122573211938请输入删除元素的位置:3删除后的顺序表为:12253211938请输入删除元素的位置:12不存在该元素!Pressanykeytocontinue◇单链表实验//LinkList.htypedefintDataType;typedefstructNode{DataTypedata;structNode*next;}LNode,*LinkList;voidCreat_LinkList(LinkListL);//创建链表voidShow_LinkList(LinkListL);//显示数据LNode*Get_LinkList(LinkListL,inti);//获得第i个结点的地址intInsert_linklist(LinkListL,inti,DataTypex);//插入结点intDelete_LinkList(LinkListL,inti);//删除结点//LinkList.cpp#include#include”LinkList.h”voidCreat_LinkList(LinkListL){LNode*s;L=NULL;s=newLNode;s-next=L;L=s;intx;}//头插法创建带头结点的链表coutx;while(x!=-1){s=newLNode;s-next=L;L-data=x;L=s;cinx;} voidShow_LinkList(LinkListL){LNode*p;p=L-next;while(p!=NULL){coutdatap=p-next;//显示数据}cout}LNode*Get_LinkList(LinkListL,inti){intj=1;LNode*q;q=L-next;while(q!=NULLjq=q-next;j++;}returnq;}//获得第i个结点的地址intInsert_LinkList(LinkListL,inti,DataTypex)//插入结点{ LNode*p,*s;p=Get_LinkList(L,i-1);if(p==NULL){}coutdata=x;s-next=p-next;p-next=s;return1;}intDelete_LinkList(LinkListL,inti){LNode*p,*s;p=Get_LinkList(L,i-1);if(p==NULL){//删除结点coutnext==NULL){coutreturn0;}else{s=p-next;p-next=s-next;deletes;return1;}}//main.cpp#include#include”LinkList.h”intmain(){intx,d,s;LinkListH;Creat_LinkList(H);Show_LinkList(H);}coutd;coutx;s=Insert_LinkList(H,d,x);if(s==1){coutd;s=Delete_Lin kList(H,d);if(s==1){cout运行结果:请输入数据(以输入-1结束)12257421938-1单链表为:38194272512插入操作请输入插入的位置:4请输入要插入的数据:3插入后的单链表为:381942372512请输入插入的位置:6请输入要插入的数据:21插入后的单链表为: 38194237212512请输入插入的位置:12请输入要插入的数据:15插入位置错误!删除操作请输入删除元素的位置:5删除后的单链表为:3819423212512请输入删除元素的位置:3删除后的单链表为:38193212512 请输入删除元素的位置:12插入位置的前驱结点不存在!。

数据结构线性表单链表实验报告

数据结构线性表单链表实验报告

数据结构实验报告班级姓名同组者/ 成绩日期2020.3.25指导教师实验名称线性表及其应用一、实验目的:1、深刻理解线性表的逻辑特性及其顺序、链式存储方式的特点。

2、熟练掌握线性表的常用操作(建立、插入、删除、遍历等)在顺序、链式存储上的实现。

3、加深对C/C++、Java等编程语言的相关知识点的理解(如结构体/类、指针/引用、函数/方法、引用参数等)。

二、实验内容:1、题目根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作:①查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。

②删除:输入一个欲删除的整数e,若存在则在单链表中删除第一个值为e的元素。

③插入:输入一个欲插入位置i和欲插入元素e,将e插入到第i个整数之前(注意i的合法性)。

源码#include<stdio.h>#include<stdlib.h>typedef int Elemtype;typedef int Status;typedef struct node// 定义存储节点{int data;// 数据域struct node *next;// 结构体指针} *linklist,node;//结构体变量,结构体名称linklist creat (int n)//创建单链表{linklist head,r,p;// 定义头指针r,p,指针int x,i;head=(node *)malloc(sizeof(node));// 生成头结点r=head;//r指向头结点printf(" 输入数字:\n");for(i=n;i>0;i--)//for循环用于生成第一个节点并读入数据{scanf("%d",&x);p=(node *)malloc(sizeof(node));p->data=x;//读入第一个节点的数据r->next=p;//把第一个节点连在头结点的后面r=p;//循环以便于生成第二个节点}r->next=0;//生成链表后的断开符return head;// 返回头指针}void output (linklist head) //输出链表{linklist p;p=head->next;do{printf("%3d",p->data);p=p->next;}while(p);printf("\n");}Status insert ( linklist &l,int i, Elemtype e)// 插入操作{int j=0;linklist p = l,s;while(j<i-1 && p){p=p->next;++j;}if(!p || j>i-1)return -1;else{s=(node *)malloc(sizeof(node));s->data=e;s->next=p->next;p->next=s;return 1;}}Status delect ( linklist &l,int i, Elemtype &e) //删除操作{int j=0;linklist p=l,q;while(j<i-1 && p->next){p=p->next;++j;}if(!p->next || j>i-1)return -1;else{q=p->next;p->next=q->next;e=q->data;free(q);return 1;}}void combine(linklist la,linklist lb)//合并单链表{node *pa,*pb,*pc;linklist lc;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);}Status GetElem(linklist l,int i,Elemtype &e )//查找操作{linklist p;int j;p=l->next;j=1;while(p && j<i){p=p->next;++j;}if(!p || j>i)return -2;e=p->data;return e;}void main(){linklist la,lb;int n;int i,j;Elemtype e;printf(" 请输入第一个链表:\n");printf(" 输入链表元素的个数:\n");scanf("%d",&n);la=creat(n);printf(" 输出链表:\n");output(la);printf(" 请输入要查找元素的位置:\n");scanf("%d",&i);j=GetElem(la,i,e);printf(" 所要查找的元素是%d\n",j);printf(" 请输入插入位置和元素:\n");scanf("%d%d",&i,&e);insert(la,i,e);printf(" 插入后的链表:\n");output(la);printf(" 请输入要删除的位置:\n");scanf("%d",&i);delect(la,i,e);printf(" 删除的那个元素是:%d\n",e);printf(" 输出删除后的顺序表:\n");output(la);printf(" 请输入第一个非递减链表:\n");printf(" 输入链表元素的个数:\n");scanf("%d",&n);la=creat(n);printf(" 输出链表:\n");output(la);printf(" 请输入第二个非递减链表:\n");printf(" 输入链表元素个数:\n");scanf("%d",&n);lb=creat(n);printf(" 输出链表:\n");output(lb);combine(la,lb);printf(" 输出合并后的链表:\n");output(la);}运行结果:2、题目分别创建两个有序的顺序表(每个表的元素个数及每个元素的值在运行时由键盘输入),现将两个有序表合并,并保证新表依然为有序的顺序表。

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

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

线性表的链式存储结构实验报告文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)实验报告课程名称:数据结构与算法分析实验名称:链表的实现与应用实验日期:班级:数媒1401 姓名:范业嘉学号 08一、实验目的掌握线性表的链式存储结构设计与基本操作的实现。

二、实验内容与要求⑴定义线性表的链式存储表示;⑵基于所设计的存储结构实现线性表的基本操作;⑶编写一个主程序对所实现的线性表进行测试;⑷线性表的应用:①设线性表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=papa: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)3.六、心得体会(包括对于本次实验的小结,实验过程中碰到的问题等)1.首先书上给的链表输入是倒序的,写的时候想都没想就抄上去了,结果运行时发现问题,可是上网百度依然没有把问题解决,导致最后输出链表倒序的,并且链表的合并并集依旧是倒序的。

西安邮电大学计算机学院数据结构课内实验报告(线性表的应用)

西安邮电大学计算机学院数据结构课内实验报告(线性表的应用)

西安邮电大学(计算机学院)数据结构课内实验报告实验名称:线性表的应用专业名称:电子商务班级:学生姓名:学号(8位):指导教师:实验日期:2014年10 月15 日一. 实验目的及实验环境1.实验目的熟悉并掌握线性表如何构建,并学会线性表的基本应用和两种存储结构的实现2.实验环境VC++6.0二. 实验内容约瑟夫问题:编号为1、2、3…..,按顺时针坐在一张圆桌周围,每人持有一个密码,一个人选任意正整数为报数上限m,从第一个人开始报数报到m时停止报数,这个人出列,直到所有的人都出列,游戏结束。

用线性表的内容来实现这个程序。

三.方案设计第一步:建立n个节点的无头循环链表。

第二步:从链表的第一个节点开始计数,直到寻找到第m个节点第三步:输出该节点的id值,并将其password值,作为新的m值第四步:根据新的m值,继续删除节点,直到循环链表为空,程序结束四.测试数据及运行结果1.正常测试数据(3组)及运行结果;第一组:测试数据:9、5、2、3、4、1运行结果截图为:第二组:测试数据:5、2、6、1、2、3、4运行结果截图:运行结果截图:2.非正常测试数据(2组)及运行结果。

第一组:测试数据:1、0、2、0运行结果截图为:第二组:测试数据:0、0、0、0、0运行结果截图为:五.总结六.附录:源代码(电子版)#include<stdio.h>#include<stdlib.h>typedef struct node{int id;int password;struct node *next;}lnode,*list;list creat2(){lnode *head,*p,*q;int m,n=2;head=(lnode *)malloc(sizeof(lnode));head->next=NULL;q=head;printf("please input the initial password:");scanf("%d",&m);head->password=m;head->id=1;printf("please input(password):");scanf("%d",&m);while(m!=-1){p=(list)malloc(sizeof(lnode));p->password=m;p->id=n;q->next=p;q=p;printf("please input(password):");scanf("%d",&m);n++;}p->next=head;return head;}void print(lnode *q){lnode *p;printf("%4d,%4d\n",q->id,q->password);p=q->next;while(p!=q){printf("%4d,%4d\n",p->id,p->password);p=p->next;}printf("\n");}list front(list q){list p;p=q->next;while(p->next!=q)p=p->next;return p;}void deletee(list q){list p,r;int i,m=q->password;p=q;while(p->next!=p){i=1;while(i!=m){p=p->next;i++;}printf("%4d,%4d\n",p->id,p->password);p=front(p);r=p->next;p->next=r->next;m=r->password;free(r);p=p->next;}printf("%4d,%4d\n",p->id,p->password);}void main(){list head;head=creat2();printf("========打印队列原有情况==========\n");print(head);printf("==========打印出队情况==========\n");deletee(head);}西安邮电大学(计算机学院)数据结构课内实验报告实验名称:栈和队列的应用专业名称:电子商务班级:学生姓名:学号(8位):指导教师:衡霞实验日期:2014年11 月10 日一. 实验目的及实验环境1、实验目的掌握栈和队列的基本操作,实现栈或队列的基本应用2、实验环境VC++6.0二. 实验内容判断输入的一个字符串是否为回文三.方案设计第一步:建立一个顺序栈第二步:输入字符串的时候入栈第三步:出栈时也保存到一个数组中第四步:比较两个数组是否完全相同四.测试数据及运行结果1.正常测试数据(3组)及运行结果;第一组:测试数据:1、2、3运行结果:第二组:测试数据:a、b、c运行结果:第三组:测试数据:1、2、a、2、1运行结果:2.非正常测试数据(2组)及运行结果。

数据结构实验报告链表

数据结构实验报告链表

数据结构实验报告链表
《数据结构实验报告:链表》
在计算机科学领域,数据结构是一门重要的课程,它对于计算机程序的设计和性能有着至关重要的作用。

其中,链表是一种常见的数据结构,它在实际应用中有着广泛的用途。

在本次实验中,我们将深入研究链表这一数据结构,并通过实验来验证其性能和应用。

首先,我们需要了解链表的基本概念。

链表是由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。

相比于数组,链表具有动态的内存分配和插入/删除操作的优势,但在访问元素时性能稍逊色。

因此,链表适用于需要频繁插入/删除操作的场景。

在本次实验中,我们将实现一个简单的链表数据结构,并进行一系列的操作。

首先,我们将实现链表的创建、插入、删除和遍历等基本操作,并通过实验验证其正确性和性能。

其次,我们将对比链表和数组在不同场景下的性能差异,以便更好地理解链表的适用场景和特点。

通过本次实验,我们将深入了解链表这一数据结构的原理和应用,掌握其基本操作和性能特点,为今后的程序设计和优化提供重要的参考。

同时,我们也将通过实验数据和分析来验证链表的优势和不足,为选择合适的数据结构提供依据。

希望本次实验能够为大家对数据结构和算法有更深入的理解和掌握提供帮助。

通过本次实验,我们对链表这一数据结构有了更深入的了解,并通过实验验证了其性能和应用。

链表作为一种常见的数据结构,在实际应用中有着广泛的用途,掌握其原理和操作对于程序设计和性能优化至关重要。

希望本次实验能够
为大家对数据结构和算法有更深入的理解和掌握提供帮助。

数据结构线性表实验报告

数据结构线性表实验报告

数据结构线性表实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中线性表的基本概念、存储结构和操作算法,并通过实际编程实现来提高对线性表的应用能力和编程技能。

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

三、实验内容(一)线性表的顺序存储结构顺序表是用一组地址连续的存储单元依次存储线性表的数据元素。

其特点是逻辑上相邻的元素在物理位置上也相邻,便于随机存取,但插入和删除操作需要移动大量元素,效率较低。

(二)线性表的链式存储结构链表是通过指针将一组零散的存储单元链接成一个线性序列。

常见的链表有单链表、双向链表和循环链表。

链表的插入和删除操作只需修改指针,无需移动元素,但随机存取效率较低。

(三)线性表的基本操作实现1、初始化线性表2、销毁线性表3、清空线性表4、判断线性表是否为空5、获取线性表的长度6、获取指定位置的元素7、查找指定元素在线性表中的位置8、在线性表指定位置插入元素9、删除线性表指定位置的元素四、实验步骤(一)顺序表的实现1、定义顺序表的结构体,包括数据存储数组和表的长度。

2、实现顺序表的初始化函数,分配初始存储空间并设置表长度为0。

3、销毁顺序表函数,释放存储空间。

4、清空顺序表函数,将表长度置为 0。

5、判断顺序表是否为空,根据表长度判断。

6、获取顺序表长度,直接返回表长度。

7、获取指定位置元素,检查位置合法性后返回对应元素。

8、查找指定元素位置,遍历表进行比较。

9、插入元素函数,检查插入位置合法性,若合法则移动后续元素,插入新元素并更新表长度。

10、删除元素函数,检查删除位置合法性,若合法则移动后续元素,更新表长度。

(二)链表的实现1、定义链表节点结构体,包含数据域和指针域。

2、实现链表的初始化函数,创建头节点。

3、销毁链表函数,遍历链表释放节点内存。

4、清空链表函数,遍历链表删除节点但保留头节点。

5、判断链表是否为空,检查头节点的指针域是否为空。

实验三:线性表应用--链表

实验三:线性表应用--链表

上海建桥学院本科《数据结构》实验报告(三)课程名称:数据结构实验类型:综合实验室名称:机房开课学院:信息技术学院学生姓名:赵婧玥专业:计算机科学与技术1班学号:10B01010109赵正德指导老师:实验三:线性表应用——链表实验日期:年月日评阅成绩:实验目的及要求1. 熟练掌握线性表的基本操作在链式存储上的实现;2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3. 掌握线性表的链式存储结构的定义和基本操作的实现;4. 通过本实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用)。

实验内容已知程序文件linklist.cpp已给出学生身高信息链表的类型定义和基本运算函数定义。

(1)链表类型定义typedef struct {int xh; /*学号*/float sg; /*身高*/int sex; /*性别,0为男生,1为女生*/} datatype;typedef struct node{datatype data; /*数据域*/struct node *next; /*指针域*/} LinkNode, *LinkList;(2)带头结点的单链表的基本运算函数原型LinkList initList();/*置一个空表(带头结点)*/void createList_1(LinkList head);/*建一个单链表,头部插入*/void createList_2(LinkList head);/*建一个单链表,尾部插入*/void sort_xh(LinkList head);/*单链表按学号升序排序*/void reverse(LinkList head);/*对单链表进行结点倒置*/void Error(char *s);/*自定义错误处理函数*/void pntList(LinkList head);/*打印单链表*/void save(LinkList head,char strname[]);/*保存单链表到文件*/任务一阅读程序linklist.cpp(见电子文档),理解LinkList类型和基本运算函数。

实验3线性表的链式存储

实验3线性表的链式存储

实验报告三线性表的链式存储班级: 2010251 姓名:李鑫学号: 20103277 专业:信息安全一、实验目的:(1)掌握单链表的基本操作的实现方法。

(2)掌握循环单链表的基本操作实现。

(3)掌握两有序链表的归并操作算法。

二、实验内容:(请采用模板类及模板函数实现)1、线性表链式存储结构及基本操作算法实现[实现提示] (同时可参见教材p64-p73页的ADT描述及算法实现及ppt)函数、类名称等可自定义,部分变量请加上学号后3位。

也可自行对类中所定义的操作进行扩展。

所加载的库函数或常量定义:(1)单链表存储结构类的定义://文件包含在LinList.h中template <class datatype>class LinkList;template <class datatype>class Node{friend class LinkList<datatype>;private:Node<datatype> *next;datatype data;};template <class datatype>class LinkList{public:LinkList();//建立只有头结点的空链表LinkList(datatype a[],int n);//建立有n个元素的单链表~LinkList(){};//析构函数,释放整个链表空间int Length();//求单链表的长度datatype Get(int i);//取单链表中第i个结点的元素值int Location(datatype x);//求单链表中值为x的元素序号void Insert(int i,datatype x);//在单链表中第i个位置插入元素值为x的结点datatype Delete(int i);//在单链表中删除第i个结点void PrintList();//遍历单链表,按序号依次输出各元素bool IsEmpty();//是否为空,空返回1,否则返回0void DeleteAll();//删除所有的元素private:Node<datatype> *head;//单链表的头指针};(2)初始化带头结点空单链表构造函数实现输入:无前置条件:无动作:初始化一个带头结点的空链表输出:无后置条件:头指针指向头结点。

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

上海建桥学院本科《数据结构》实验报告(三)课程名称:数据结构实验类型:综合实验室名称:机房开课学院:信息技术学院学生姓名:赵婧玥专业:计算机科学与技术1班学号:10B01010109赵正德指导老师:实验三:线性表应用——链表实验日期:年月日评阅成绩:实验目的及要求1. 熟练掌握线性表的基本操作在链式存储上的实现;2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3. 掌握线性表的链式存储结构的定义和基本操作的实现;4. 通过本实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用)。

实验内容已知程序文件linklist.cpp已给出学生身高信息链表的类型定义和基本运算函数定义。

(1)链表类型定义typedef struct {int xh; /*学号*/float sg; /*身高*/int sex; /*性别,0为男生,1为女生*/} datatype;typedef struct node{datatype data; /*数据域*/struct node *next; /*指针域*/} LinkNode, *LinkList;(2)带头结点的单链表的基本运算函数原型LinkList initList();/*置一个空表(带头结点)*/void createList_1(LinkList head);/*建一个单链表,头部插入*/void createList_2(LinkList head);/*建一个单链表,尾部插入*/void sort_xh(LinkList head);/*单链表按学号升序排序*/void reverse(LinkList head);/*对单链表进行结点倒置*/void Error(char *s);/*自定义错误处理函数*/void pntList(LinkList head);/*打印单链表*/void save(LinkList head,char strname[]);/*保存单链表到文件*/任务一阅读程序linklist.cpp(见电子文档),理解LinkList类型和基本运算函数。

任务二1.题目要求创建一个新的程序文件sy3.cpp,请调用linklist.cpp提供的功能函数(以#include “linklist.cpp”方式导入函数库)及自定义的函数完成以下操作:●从数据文件records.txt中读取学生信息,建立与源数据同序的学生链表并打印在屏幕上;●统计学生链表中身高达标人数(男女生的身高达标值由键盘输入),并打印结果;●对上述学生链表按学号进行排序,然后将一位学生的相关信息插入到已按学号排序的学生链表中后仍然保持学号的有序性,将结果链表打印在屏幕上;●对上述操作后的学生链表进行倒置,结果输出到数据文件result.txt中;●删除链表中身高为指定值的所有学生结点并打印;●将当前的学生链表拆分为男生链表和女生链表(没有新结点生成),分别打印到屏幕上。

在程序文件sy3.cpp需再定义以下四个功能函数:(1)int count(LinkList head,float sg_fm,float sg_m)功能:已知女生达标身高为sg_fm,男生达标身高为sg_m,统计head为头指针的学生链表中身高达标人数并返回;(2)void insertX(LinkList head, datatype x)功能:在学号从小到大排序的学生链表中插入值为x的学生仍保持学号的有序性(3)int delete(LinkList head,float sg)功能:删除head为头指针的学生链表中指定身高的所有学生结点,删除成功返回1,否则返回0;(4)void split(LinkList head, LinkList hm, LinkList hfm)功能:将head为头指针的学生链表拆分成男生身高链表hm与女生链表hfm2.sy3.cpp源程序清单(含必要的注释)#include "linklist.cpp"int count(LinkList head,float sg_fm,float sg_m);/*统计head为头指针的学生链表中身高达标人数并返回*/void insertX(LinkList head, datatype x);/*在学号从小到大排序的学生链表中插入值为x 的学生仍保持学号的有序性*/int dele(LinkList head,float sg);/*删除head为头指针的学生链表中指定身高的所有学生结点,删除成功返回1,否则返回0*/void split(LinkList head, LinkList hm, LinkList hfm);/*将head为头指针的学生链表拆分成男生身高链表hm与女生链表hfm*/void main(){ LinkList head,hm,hfm;int c,flag;float sg,sg_fm,sg_m;datatype x;/*建立与源数据文件同序的学生链表并输出;*/head=initList();createList_2(head);printf("\n与数据文件同序的学生链表:\n");pntList(head);getchar();/*统计学生链表中身高达标人数(男女生的身高达标值由键盘输入),并打印结果;*/printf("\n输入达标的女生、男生身高值:");scanf("%f%f",&sg_fm,&sg_m);c=count(head,sg_fm,sg_m);printf("\n达标学生人数为:%d",c);getchar();/*对学生链表按学号进行排序*/sort_xh(head);/*在学生链表中插入指定的学生元素后使链表仍按学号有序*/x.xh=3;x.sg=1.67;x.sex=0;insertX(head,x);printf("\n new list after insert:\n");pntList(head);getchar();/*对学生链表进行倒置,结果输出到文件result.txt中;*/reverse(head);save(head,"result.txt");getchar();/*删除链表中身高为指定值的所有学生结点;*/sg=1.67;flag=dele(head,sg);if(flag)printf("\ndelete succeed!\n");elseprintf("\ndelete failed\n");printf("\n new list after delete:\n");pntList(head);getchar();/*将学生链表拆分为男生链表和女生链表,分别打印在屏幕上*/hm=initList();hfm=initList();split(head,hm,hfm);printf("\nmale list:\n");pntList(hm);printf("\nfemale list:\n");pntList(hfm);}int count(LinkList head,float sg_fm,float sg_m) {int n=0;LinkList p;p=head->next;while(p!=NULL){ if(p->data.sex==1)/*sex:1 女生*/{ if(p->data.sg>=sg_fm)n++;}else{ if(p->data.sg>=sg_m)n++;}p=p->next;}return n;}void insertX(LinkList head, datatype x){LinkList p,u;p=(LinkList)malloc(sizeof(LinkNode));p->data.xh=x.xh;p->data.sg=x.sg;p->data.sex=x.sex;u=head;while(u->next!=NULL ){if(u->next->data.xh>x.xh)break;u=u->next;}p->next=u->next;u->next=p;}int dele(LinkList head,float sg){LinkList p,q,v;int flag=0;q=head;p=head->next;while(p!=NULL){ if(p->data.sg==sg){ v=p;p=p->next;q->next=p;free(v);flag=1;}else{ q=p;p=p->next;}}return flag;}void split(LinkList head, LinkList hm, LinkList hfm) {LinkList q,p,rm,rfm;p=head->next;rm=hm;/*链表尾指针*/rfm=hfm;while(p!=NULL){ /*取结点q插入到男生链表或女生链表*/q=p;p=p->next ;if(q->data.sex==1)/*sex:1 女生*/{ q->next =rfm->next ; /*尾部插入新链表*/rfm->next=q;rfm=q;}else{ q->next =rm->next ;rm->next=q;rm=q;}}}3.程序运行结果的屏幕拷贝及数据文件result.txt内容实验总结分析程序调试中出现的问题及解决方法,心得体会等通过了本次实验,我觉得我求解题目的过程中仍有进步的空间,在纠错的过程中还可以再仔细迅速。

我觉得自己在子函数的编译这方面的知识点还需要巩固和扎实,这也是我做本次实验的薄弱环节。

我很感谢这次实验给了我磨练的机会,让我更深一步了解自己的学习情况,使自己可以不断进步。

相关文档
最新文档