数据结构(邹永林版)实验报告2-顺序表与链表
- 格式:doc
- 大小:370.50 KB
- 文档页数:20
数据结构实验报告数据结构实验报告引言:数据结构是计算机科学中的重要概念,它研究如何组织和存储数据,以便更高效地进行操作和处理。
在本次实验中,我们将探索几种常见的数据结构,并通过实际操作来加深对其原理和应用的理解。
一、线性表线性表是最简单的数据结构之一,它由一系列具有相同数据类型的元素组成,这些元素按照线性的顺序排列。
我们在实验中使用了顺序表和链表两种实现方式。
1.1 顺序表顺序表是一种基于数组的实现方式,它将元素按照顺序存储在连续的内存空间中。
我们通过实验发现,顺序表在随机访问和插入删除操作方面具有较好的性能,但当元素数量超过数组容量时,需要进行扩容操作,而且插入和删除元素时需要移动其他元素,效率较低。
1.2 链表链表是一种基于指针的实现方式,它将元素存储在不连续的内存空间中,并通过指针将这些元素连接起来。
链表在插入删除操作方面具有较好的性能,但随机访问元素时需要遍历整个链表,效率较低。
我们通过实验发现,单向链表和双向链表在不同场景下有不同的应用优势。
二、栈和队列栈和队列是两种常见的线性数据结构,它们都具有特定的操作规则。
2.1 栈栈是一种后进先出(Last In First Out,LIFO)的数据结构,类似于现实生活中的弹夹。
我们通过实验发现,栈在递归、表达式求值和括号匹配等场景下有广泛的应用。
2.2 队列队列是一种先进先出(First In First Out,FIFO)的数据结构,类似于现实生活中的排队。
我们通过实验发现,队列在模拟系统、任务调度和缓冲区管理等场景下有广泛的应用。
三、树和图树和图是两种非线性的数据结构,它们通过节点和边的连接关系来表示数据之间的关系。
3.1 树树是一种层次结构的数据结构,它由根节点和若干子树组成。
我们通过实验发现,二叉树、平衡二叉树和堆在搜索、排序和优先级队列等场景下有广泛的应用。
3.2 图图是一种由节点和边组成的数据结构,它可以表示各种复杂的关系。
我们通过实验发现,图在社交网络、路径规划和最小生成树等场景下有广泛的应用。
数据结构实验报告
本次数据结构实验的任务主要包括两部分,分别是学习使用链表数据结构和掌握链表排序算法。
在此基础上,我们完成了一组关于链表基本操作和排序算法的实验。
实验一:链表基本操作
在这个实验中,我们学习了链表的插入、删除、查找等基本操作。
链表的插入和删除操作是通过一个链表节点来实现的。
链表节点包括一个数据域和一个指向下一个节点的指针域。
通过修改指针域,我们就可以实现节点的插入和删除操作。
具体来说,我们编写了一个基本的链表程序,其中包括链表头指针初始化、链表节点插入、链表节点删除、查找指定节点等操作。
通过对程序的调试和功能测试,我们验证了链表操作的正确性。
实验二:链表排序算法
在这个实验中,我们学习了链表排序算法,并编写了链表的快速排序和归并排序两种算法。
快速排序是一种分治思想的排序算法,通过选择一个基准元素,分别将小于和大于基准元素的元素分别放在它的左右两边,再递归地对左右两个子序列进行排序,最终得到有序序列。
归并排序是另一种经典的排序算法,它利用归并思想,将两个有序序列合并成一个更大的有序序列,这个过程不断重复,最终得到完整的有序序列。
通过实现这两种排序算法,并在大样本数据下进行测试,我们验证了算法的正确性和效率。
实验总结:
通过本次实验,我们深入学习了链表数据结构的相关基本操作和排序算法的实现原理。
同时,在实际编程实践中,我们也掌握了链表程序的调试、测试和优化技术。
这些都是我们今后从事软件开发工作需要掌握的重要技能,在这个方面的积累将会对我们有很大帮助。
实验报告实验目的:学生管理系统(顺序表)实验要求:1.建表2.求表长3.插入4.查找5.删除6.列表7.退出源程序:#include <stdio.h>#include <string.h>#include<stdlib.h>#define MaxSize 1000typedef struct{char xh[40];char xm[40];int cj;}DataType; //学生的结构typedef struct {DataType data[MaxSize]; //定义表的数据类型int length; //数据元素分别放置在data[0]到data[length-1]当中} SqList; //表的结构void liebiao(SqList *L) //建立表格{int k,n;char q;printf("请输入,输入学生的个数:\n");fflush(stdin);scanf("%d",&n);for(k=0;k<=n-1;k++){printf("请输入学生学号\n");scanf("%s",L->data[k].xh);printf("请输入学生名字\n");scanf("%s",L->data[k].xm);printf("请输入学生成绩\n");scanf("%d",&L->data[k].cj);}L->length=n;}void qb(SqList *L) //全部输出{int k,w;for(k=0;k<L->length;k++){w=k+1;printf("第%d位学生:",w);printf("%s %s %d\n",L->data[k].xh,L->data[k].xm,L->da ta[k].cj);}}int cr(SqList *L,DataType *xs,int i) //插入信息{int j;if(L->length==MaxSize){printf("没有!");return 0;}else if((i<0)||(i>L->length)){printf("程序溢出,不符合");return 0;}else{for(j=L->length-1;j>=i;j--){strcpy(L->data[j+1].xh,L->data[j].xh);strcpy(L->data[j+1].xm,L->data[j].xm);L->data[j+1].cj=L->data[j].cj;}strcpy(L->data[i].xh,xs->xh);strcpy(L->data[i].xm,xs->xm);L->data[i].cj=xs->cj;L->length=L->length+1;}return 0;}int cz(SqList *L) //查找信息{char xh[40];char xm[40];int cj;int i=0,u;printf(" 1、按学号查询 \n");printf(" 1、按姓名查询 \n");printf(" 1、按成绩查询 \n");printf("请选择:");fflush(stdin);scanf("%d",&u);if (u==1){printf("请输入要查找学生的学号:");scanf("%s",xh);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xh,xh)==0)return i;}}if (u==2){printf("请输入要查找学生的姓名:");scanf("%s",xm);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xm,xm)==0)return i;}}if (u==3){printf("请输入要查找学生的成绩:");scanf("%s",cj);for(i=0;i<L->length;i++){if(L->data[i].cj,&cj)return i;}}return -1;//*如果没找到,返回-1}int cz2(SqList *L) //删除查找的函数{char xh[40];char xm[40];int i=0,h;printf(" 1、按学号删除 \n");printf(" 2、按姓名删除 \n");printf("请选择:");fflush(stdin);scanf("%d",&h);if (h==1){printf("请输入要删除学生的学号:");scanf("%s",xh);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xh,xh)==0) //判断输入和已知学号一样不return i;}}else if (h==2){printf("请输入要删除学生的姓名:");scanf("%s",xm);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xm,xm)==0) //判断输入姓名和已知姓名一样不return i;}}return -1;}void sc(SqList *L) //删除函数{int i,j;printf("请先选择您要删除的学生信息的方式:\n");scanf("%d",&j);i=cz2(L);if(i==-1){printf("没有查到要删除的学生信息");return;}for(j=i;j<L->length;j++) // 要删除学生以后的学生整体上调一位{L->data[j].cj=L->data[j+1].cj; //就是后一个覆盖了前一个strcpy(L->data[j].xh,L->data[j+1].xh);strcpy(L->data[j].xm,L->data[j+1].xm);}L->length--;printf("该学生信息已被删除!\n");}int bc(SqList *L){return (L->length);}int main() //主体大函数{int i,k;SqList *L; //定义顺序表的指针DataType *xs;L=(SqList *)malloc(sizeof(SqList)*MaxSize);char q;ee:rewind(stdin);{printf(" 学生管理系统 \n"); //函数的各个结构printf(" \n");printf(" \n");printf(" \n");printf(" 建立表格请输入1 \n");printf(" 求表长请输入2 \n");printf(" 插入请输入3 \n");printf(" 查找请输入4 \n");printf(" 删除请输入5 \n");printf(" 列表请输入6 \n");printf(" 退出请按0 \n");printf(" 请输入");scanf("%c",&q);}if(q=='1'){rewind(stdin);liebiao(L);goto ee;}if(q=='2'){rewind(stdin);bc(L);printf("共%d个学生\n",L->length);goto ee;}if(q=='3'){rewind(stdin);printf(" 插入 \n");printf("\t\t 请输入要添加的学生信息: \n");xs=(DataType *)malloc(sizeof(DataType));printf("请输入学生学号\n");scanf("%s",xs->xh);printf("请输入学生名字\n");scanf("%s",xs->xm);printf("请输入学生成绩\n");scanf("%d",&xs->cj);printf("请输入要插入的位置:\n");rewind(stdin);scanf("%d",&i);cr(L,xs,i);goto ee;}if(q=='4'){rewind(stdin);printf(" 查找 \n");printf(" 查询学生信息 \n");i=cz(L);if(i!=-1){printf("%s %s %d\n",L->data[i].xh,L->data[i].x m,L->data[i].cj);}else{printf("信息不存");}goto ee;}if(q=='5'){rewind(stdin);printf(" 删除 \n"); printf(" 删除学生信息 \n");sc(L);goto ee;}if(q=='6'){rewind(stdin);printf(" 列表 \n");qb(L);goto ee;}if(q=='0') {printf("谢谢使用\n");}if(!(q=='1'||q=='2'||q=='3'||q=='4'||q=='5'||q=='5'||q=='0 ')){goto ee;}system ("pause");return 0;}建表:否是否实验目的:学生管理系统(链表)实验要求:1.建表2.删除3.列表4.退出源程序:#include<stdio.h>#include<string.h>#include<stdlib.h>struct xuesheng{char xh[7];char xm[40];int cj;struct xuesheng *next;};struct xuesheng *cha_ru(struct xuesheng *x){struct xuesheng *p,*q;int c;do{if(x==0){ x=(struct xuesheng *)malloc(sizeof(struct xuesheng));printf("input xh:"); scanf("%s",(*x).xh);printf("input xm:"); scanf("%s",(*x).xm);printf("input cj:"); scanf("%d",&(*x).cj);(*x).next=0; }else{ p=x;while((*p).next!=0){p=(*p).next;};q=(struct xuesheng *)malloc(sizeof(struct xuesheng));printf("input xh:"); scanf("%s",(*q).xh);printf("input xm:"); scanf("%s",(*q).xm);printf("input cj:"); scanf("%d",&(*q).cj);(*p).next=q;(*q).next=0; }printf("ni hai ji xu me? 1/2:");scanf("%d",&c);}while(c==1);return(x);}int link_len(struct xuesheng *x){struct xuesheng *p;int l=0;p=x;if(p!=0)do{l=l+1;p=p->next;}while(p!=0);return(l);}struct xuesheng *shan_chu(struct xuesheng *x){struct xuesheng *p,*q,*t;int k,l,i;p=x;q=x;l=link_len(x);printf("input shan chu jie dian xu hao :");scanf("%d",&k);if(k<=0||k>l)printf("error data!\n");if(k==1){ x=p->next;t=p;free(t);}if(k>1&&k<=l){ for(i=1;i<=k-2;i=i+1)p=p->next;t=p->next;for(i=1;i<=k;i=i+1)q=q->next;p->next=q;free(t); }printf("vvvvvvv shan chu wan bi ! vvvvvvv\n");return(x);}void lie_biao(struct xuesheng *x){struct xuesheng *p;int l;p=x;if(p==0) printf("gai biao wei kong!\n");else do{printf("%20s% 20s%7d\n",(*p).xh,(*p).xm,(*p).cj);p=(*p).next;}while(p!=0);l=link_len(x);printf(" l=%d\n",l);}main(){struct xuesheng *s_head;int n;s_head=0;do{printf("1:cha ru\n");printf("2:cha zhao\n");printf("3:shan chu\n");printf("4:lie biao\n");printf("5:tui chu\n");printf("input 1---5:");scanf("%d",&n);switch(n){case 1: s_head=cha_ru(s_head);break; /* case 2: cha_zhao(s_head);break;*/ case 3: s_head=shan_chu(s_head);break; case 4: lie_biao(s_head);break;}}while(n==1||n==3||n==4);printf("\n");return 0;}主函数:删除:总结:顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,一个顺序表在使用前必须指定起长度,一旦分配内存,则在使用中不可以动态的更改。
数据结构实验报告实验报告数据结构实验报告应包含以下几个部分:1. 实验目的:简要介绍实验的目的和意义。
2. 原理介绍:详细介绍本次实验所涉及的数据结构原理,包括数据结构的定义、特性以及相关算法或操作。
3. 实验内容:详细描述本次实验的具体内容,包括实验要求和实验步骤。
4. 实验结果:展示实验的结果,以适当的方式呈现实验数据和实验输出。
可以包括图表、表格、代码等。
5. 分析讨论:分析实验结果,讨论实验结果与预期结果的差异,并给出相应的解释。
6. 实验总结:对本次实验的总结和评价,包括实验的收获、不足之处以及改进的建议。
以下是一个简单的数据结构实验报告的范例:实验目的:本次实验的目的是熟悉链表数据结构的概念和基本操作,包括链表的插入、删除和查找等。
原理介绍:链表是一种常用的数据结构,它由一组节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
链表中的节点可以通过指针相互连接,从而形成一串有序的数据。
链表不同于数组,它的插入和删除操作十分高效,但查找效率较低。
实验内容:本次实验要求实现一个链表,并在链表中实现插入、删除和查找操作。
首先,定义一个节点结构,并实现节点的插入和删除操作;其次,实现查找操作,并根据查找结果返回节点位置或者相关信息。
实验结果:经过实验,我们得到了以下结果:在链表中插入节点的时间复杂度为O(1),删除节点的时间复杂度为O(1),查找节点的时间复杂度为O(n)。
分析讨论:从结果可以看出,链表的插入和删除操作的效率较高,但查找操作的效率较低。
这是因为链表中的节点没有连续的存储空间,所以需要遍历整个链表才能找到目标节点。
如果需要频繁进行查找操作,可以考虑使用其他数据结构,如二叉搜索树或哈希表。
实验总结:通过本次实验,我们深入了解了链表数据结构的原理和基本操作,并实现了一个简单的链表。
在以后的学习和实践中,我们可以根据实际需求选择合适的数据结构,以提高程序的效率和性能。
此外,本次实验也让我们更加熟悉了编程的过程和技巧。
数据结构实验报告2数据结构实验报告21、实验目的本次实验的目的是通过使用数据结构来解决一个特定的问题。
具体而言,我们将会使用某种数据结构(例如链表、堆栈、队列等)来实现一个特定功能,并对其性能进行评估。
2、实验背景在本次实验中,我们将会探索数据结构在解决实际问题中的应用。
数据结构是计算机科学的重要组成部分,它提供了一种组织和管理数据的方式,以便能够高效地访问和操作这些数据。
3、实验内容在本次实验中,我们选择了一种经典的数据结构,以实现一个特定的功能。
具体而言,我们将会使用链表来实现一个简单的联系人管理系统。
3.1 数据结构选择我们选择了链表作为联系人管理系统的数据结构。
链表是一种灵活的数据结构,它能够动态地增加或删除元素,并且支持高效的插入和删除操作。
3.2 实现功能我们的联系人管理系统将会具有以下功能:- 添加联系人:用户可以输入联系人的姓名、方式号码等信息,并将其添加到联系人列表中。
- 删除联系人:用户可以选择要删除的联系人,并从列表中删除该联系人。
- 查找联系人:用户可以根据姓名或方式号码来查找联系人,并显示相关信息。
- 显示所有联系人:系统将会将所有联系人按照姓名的字母顺序进行排序,并将其显示在屏幕上。
4、实验步骤下面是本次实验的具体步骤:4.1 初始化联系人管理系统在系统开始之前,我们需要初始化联系人管理系统。
这包括创建一个空的联系人列表,并提供用户菜单来选择相应功能。
4.2 添加联系人用户可以选择添加联系人的功能,并输入联系人的相关信息。
系统将会将联系人添加到联系人列表中。
4.3 删除联系人用户可以选择删除联系人的功能,并输入要删除联系人的姓名或方式号码。
系统将会在联系人列表中查找并删除相应联系人。
4.4 查找联系人用户可以选择查找联系人的功能,并输入要查找联系人的姓名或方式号码。
系统将会在联系人列表中查找相应联系人,并显示其相关信息。
4.5 显示所有联系人用户可以选择显示所有联系人的功能。
数据结构实验报告2一、实验目的本次数据结构实验旨在通过实际操作和编程实践,深入理解和掌握常见的数据结构,如链表、栈、队列、树等,并能够运用所学知识解决实际问题,提高编程能力和算法设计能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容(一)链表的实现与操作1、单向链表的创建首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。
然后,通过函数实现了单向链表的创建,从用户输入获取节点的数据,依次创建新节点并连接起来。
2、链表的遍历编写函数实现对单向链表的遍历,依次输出每个节点的数据。
3、链表的插入与删除实现了在指定位置插入节点和删除指定节点的功能。
插入操作时,需要找到插入位置的前一个节点,修改指针完成插入。
删除操作时,同样找到要删除节点的前一个节点,修改指针并释放删除节点的内存。
(二)栈的实现与应用1、栈的基本操作使用数组实现了栈的数据结构,包括入栈、出栈、判断栈空和获取栈顶元素等操作。
2、表达式求值利用栈来实现表达式求值的功能。
将表达式中的数字和运算符分别入栈,按照运算规则进行计算。
(三)队列的实现与应用1、队列的基本操作使用循环数组实现了队列,包括入队、出队、判断队空和队满等操作。
2、模拟银行排队系统通过创建队列来模拟银行客户的排队情况,实现客户的入队和出队操作,统计平均等待时间等。
(四)二叉树的遍历1、二叉树的创建采用递归的方式创建二叉树,用户输入节点数据,构建二叉树的结构。
2、先序、中序和后序遍历分别实现了二叉树的先序遍历、中序遍历和后序遍历,并输出遍历结果。
四、实验结果与分析(一)链表实验结果成功创建、遍历、插入和删除单向链表。
通过对链表的操作,深入理解了链表的动态存储特性和指针的运用。
在插入和删除操作中,能够正确处理指针的修改和内存的释放,避免了内存泄漏和指针错误。
(二)栈实验结果栈的基本操作运行正常,能够正确实现入栈、出栈等功能。
课程名称:数据结构任课教师:实验题目:线性表的基本操作实验环境: Visual C++ 6.0实验目的:1、掌握线性表的定义;2、掌握线性表的基本操作,如建立、查找、插入和删除等。
实验内容:定义一个包含学生信息(学号,姓名,成绩)的的顺表序和链表,使其具有如下功能:(1)根据指定学生个数,逐个输入学生信息;(2)逐个显示学生表中所有学生的相关信息;(3)根据姓名进行查找,返回此学生的学号和成绩;(4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);(5)给定一个学生信息,插入到表中指定的位置;int createStLink(struct Node *head,struct Node *stu){struct Node *p6,*p7,*p8;p7=head;p6=stu;if(head==NULL){head=p6;p6->next=NULL;}else{ //如果链表为空则在头结点创建信息while(p6->num > p7->num && p7->next!=NULL){p8=p7;p7=p7->next;}if(p6->num<=p7->num){if(head==p7)head=p6;elsep8->next=p6;p6->next=p7;}else{p7->next=p6;p6->next=NULL;}}N++;return 1;}int main(){struct Node *H,*stud;char M;int num1;H=initlist();(6)删除指定位置的学生记录;(7) 统计表中学生个数。
实验提示:学生信息的定义:typedef struct {char no[8]; //8位学号char name[20]; //姓名int price; //成绩}Student;顺序表的定义typedef struct {Student *elem; //指向数据元素的基地址int length; //线性表的当前长度}SqList;链表的定义:typedef struct LNode{Student data; //数据域struct LNode *next; //指针域}LNode,*LinkList;实验要求:(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
实验一顺序表与链表
姓名:学号:实验日期:
教师评语:
一、实验目的
1、掌握线性表中元素的前驱、后继的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。
二、实验内容和要求
1、试写一个算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,…,a n)逆置为(a n,a n-1,…,a1)。
2、假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各个不相同),现要求另开辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素也依值递增有序排列。
试用单链表编写求C的算法。
3、假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。
已知s 为指向链表中某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。
三、实验小结
1。
一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。
二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。
2)向顺序表插入元素:在顺序表的第i个位置插入元素x。
3)从顺序表删除元素:从顺序表中删除第i个位置的元素。
4)查找顺序表中的元素:在顺序表中查找元素x。
5)顺序表的逆序操作:将顺序表中的元素逆序排列。
(2)链表1)创建链表:创建一个带头结点的循环链表。
2)在链表中插入元素:在链表的第i个位置插入元素x。
3)在链表中删除元素:从链表中删除第i个位置的元素。
4)查找链表中的元素:在链表中查找元素x。
5)链表的逆序操作:将链表中的元素逆序排列。
2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。
2)入栈操作:将元素x压入栈中。
3)出栈操作:从栈中弹出元素。
4)获取栈顶元素:获取栈顶元素。
5)判断栈是否为空:判断栈是否为空。
(2)队列1)队列的初始化:创建一个队列,初始化为空。
2)入队操作:将元素x入队。
3)出队操作:从队列中出队元素。
实验二顺序表与链表【实验目的】1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。
【实验学时】2学时【实验预习】回答以下问题:1、顺序表的存储表示在顺序表中,任一数据元素的存放位置是从起始位置开始、与该数据元素的位序成正比的对应存储位置,借助LOC(ai)=LOC(a1)+(i-1)*1 确定,则顺序表是一种随机存取的存储结构。
2、单链表的存储表示线性链表也称单链表,在每一个结点中只包含一个指针,用于指示该结点的直接后继结点,整个链表通过指针相连,最后一个结点因为没有后继结点,其指针置为空(NULL)。
这样,链表中所有数据元素(结点)构成一对一的逻辑关系,实现线性表的链式存储。
【实验内容和要求】1、按照要求完成程序exp2_1.c,实现顺序表的相关操作。
以下函数均具有返回值,若操作完成,返回OK,操作失败返回ERROR。
函数需返回的其他数据,使用函数参数返回。
exp2_1.c部分代码如下:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define ERROR 0#define MAXSIZE 100#define OK 1typedef int ElemType; /*定义表元素的类型*/typedef struct slist{ElemType *list;int listsize;int length;}Sqlist;Sqlist *L;/*(1)---补充顺序表的存储分配表示,采用定长和可变长度存储均可*//*函数声明*/int InitList_sq(Sqlist *L);int CreateList_sq(Sqlist *L);int ListInsert_sq(Sqlist *L,int i,ElemType e);int PrintList_sq(Sqlist *L);int ListDelete_sq(Sqlist *L,int i,ElemType *e);int ListLocate(Sqlist *L,ElemType e,int *pos);int menu_select();/*(2)---顺序表的初始化*/int InitList_sq(Sqlist *L){L->list=(ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if(L->list==NULL)return ERROR;else{L->length=0;L->listsize=MAXSIZE;}return 0;}/*InitList*//*(3)---创建具有n个元素的顺序表*/int CreateList_sq(Sqlist *L){int a,b,c;printf("请输入输入数据的个数n:");scanf("%d",&a);printf("请输入输入的数据:");for(b=0;b<a;b++){scanf("%d",&c);L->list[b]=c;}L->length=L->length+a;return 0;}/*CreateList*//*(4)---输出顺序表中的元素*/int PrintList_sq(Sqlist *L){int a;printf("输出数据:");for(a=0;a<L->length;a++)printf("%d ",L->list[a]);return 0;}/*PrintList*//*(5)---在顺序表的第i个位置之前插入新元素e*/int ListInsert_sq(Sqlist *L,int i,ElemType e){int a=L->length-1;for(;a>=i-1;a--)L->list[a+1]=L->list[a];L->list[i-1]=e;L->length+=1;return OK;}/*ListInsert*//*(6)---在顺序表中删除第i个元素,e返回删除的元素*/int ListDelete_sq(Sqlist *L,int i,ElemType *e){int a=i-1;*e=L->list[i-1];for(;a<L->length;a++)L->list[a]=L->list[a+1];L->length-=1;return OK;}/* ListDelete_sq *//*(7)---在顺序表中查找指定值元素,pos为返回其位置序号*/int ListLocate(Sqlist *L,ElemType e,int *pos){int a,b=0;for(a=0;a<L->length;a++){if(e==L->list[a]){b=0;*pos=a+1;break;}elseb=1;}if(b==1)return 0;elsereturn OK;}/* ListLocate *//*定义菜单字符串数组*/int menu_select(){char *menu[]={"\n***************MENU******************\n"," 1. Create List\n", /*创建顺序表*/" 2. Get Element\n", /*查找顺序表中的元素*/" 3. Insert data\n", /*插入数据*/" 4. Delete data\n", /*删除数据*/" 0. Quit\n", /*退出*/"\n***************MENU******************\n"};char s[3]; /*以字符形式保存选择号*/int c,i; /*定义整形变量*/for (i=0;i<7;i++) /*输出主菜单数组*/printf("%s",menu[i]);do{printf("\nEnter you choice(0~4):"); /*在菜单窗口外显示提示信息*/scanf("%s",s); /*输入选择项*/c=atoi(s); /*将输入的字符串转化为整形数*/}while (c<0||c>4); /*选择项不在0~4之间重输*/return c; /*返回选择项,主程序根据该数调用相应的函数*/}/*主函数*/int main(){int m,k;int pos;int deldata;Sqlist sl;InitList_sq(&sl);for (;;) /*无限循环*/{switch (menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/{case 1:printf("\n1-Create Sqlist:\n");CreateList_sq(&sl);printf("\nPrint Sqlist:\n");PrintList_sq(&sl);break;case 2:printf("\n3-GetElem from Sqlist:\n");printf("please input search data:");scanf("%d",&k);if (!ListLocate(&sl,k,&pos))printf("Not found");else{printf("found the element, position is %d\n",pos);printf("\nPrint Sqlist:\n");PrintList_sq(&sl);}break;case 3:printf("\n4-Insert from Sqlist:\n");printf("\n input insert location and data:(location,data)\n");scanf("%d,%d",&m,&k);if (ListInsert_sq(&sl,m,k)){printf("\nOK\n");printf("\nPrint Sqlist:\n");PrintList_sq(&sl);}elseprintf("\nERROR!");break;case 4:printf("\n5-Delete from Sqlist:\n");printf("\nplease input delete location\n");scanf("%d",&k);if (ListDelete_sq(&sl,k,&deldata)){printf("\nOK\n");printf("\nDelete data is %d\n",deldata);printf("\nPrintSqlist:\n");PrintList_sq(&sl);}elseprintf("\nERROR!");break;case 0:exit(0); /*如菜单返回值为0程序结束*/}}return 0;}(1)创建一个顺序表(2)查找元素位置(3)插入元素(4)删除元素2、按照要求完成程序exp2_2.c,实现单链表的相关操作。
exp2_2.c部分代码如下:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define ERROR 0#define OK 1typedef int ElemType; /*定义表元素的类型*//*(1)---线性表的单链表存储表示*/typedef struct LNode{ElemType date;struct LNode *next;}LNode,*LinkList;LNode *InitList(); /*带头结点单链表初始化*/void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/int GetElem(LinkList L,int i,ElemType *e); /*查找第i位置的元素,并由e返回其值*/ int InsertElem(LinkList L,int i,ElemType e);/*在第i个位置插入元素e*/int DeleteElem(LinkList L,int i,ElemType *e);/*删除第i位置的元素,并由e返回其值*/ void DestroyLinkList(LinkList L);/*释放链表及其空间*/LinkList CreateList(int n); /*创建n个结点的单链表*/int menu_select(); /*菜单函数*//*带头结点单链表初始化*/LNode *InitList(){LinkList L;L=(LNode *)malloc(sizeof(LNode)); /*申请一个头结点*/if (!L) return ERROR; /*申请失败*/L->next=NULL; /*头结点的指针域置空*/return L;}/*(1)---输出带头结点单链表的所有元素*/void PrintList(LinkList L){LNode *p=L->next;int i=0;while(p){i++;printf("\n第%d个元素%d",i,p->date);p=p->next;}}/*PrintList*//*(2)---在单链表的第i个位置插入元素e,若插入成功返回OK,插入失败返回ERROR*/ int InsertElem(LinkList L,int i,ElemType e){LNode *p=L,*s;int j=0;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1)return ERROR;s=(LNode *)malloc(sizeof(LNode));if(!s)return ERROR;s->date=e;s->next=p->next;p->next=s;return OK;}/* InsertElem *//*(3)---查找第i位置的元素,若存在返回OK并由e返回其值,若不存在返回ERROR*/ int GetElem(LinkList L,int i,ElemType *e){LNode *p;int j=1;p=L->next;while(p&&j<i){p=p->next;j++;}if(!p||j>i)return ERROR;*e=p->date;return OK;}/*GetElem*//*(4)---删除第i位置的元素,成功返回OK,并由e返回其值,若不成功返回ERROR,注意删除的结点必须释放其所占空间*/int DeleteElem(LinkList L,int i,ElemType *e){LNode *p=L,*s;int j=0;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1)return ERROR;s=p->next;p->next=s->next;*e=s->date;free(s);return OK;}/* DeleteElem *//*(5)---创建具有n个结点的单链表,创建成功返回其头指针*/LinkList CreateList(int n){int i=1;LNode *p,*q,*L;L=InitList();p=L;while(i<=n){q=(LNode *)malloc(sizeof(LNode));printf("输入链表的结点date %d: ",i++);scanf("%d",&q->date);q->next=NULL;p->next=q;p=q;}return L;}/*CreateList*//*释放链表及其空间*/void DestroyLinkList(LinkList L){LNode *p=L,*q;while(p){q=p->next;free(p);p=q;}}/* DestroyLinkList */int menu_select(){char *menu[]={"\n***************MENU******************\n"," 1. Init LinkList\n", /*初始化链表*/" 2. Get Element\n", /*查找元素*/" 3. Insert data\n", /*插入元素*/" 4. Delete data\n", /*删除元素*/" 5. CreateLinkList\n", /*创建具有n个元素的链表*/" 0. Destroy LinkList&&Quit\n", /*释放链表所占空间&退出*/"\n***************MENU******************\n"};char s[3]; /*以字符形式保存选择号*/int c,i; /*定义整形变量*/for (i=0;i<8;i++) /*输出主菜单数组*/{printf("%s",menu[i]);}do{printf("\nEnter you choice(0~5):"); /*在菜单窗口外显示提示信息*/scanf("%s",s); /*输入选择项*/c=atoi(s); /*将输入的字符串转化为整形数*/}while (c<0||c>5); /*选择项不在0~5之间重输*/return c; /*返回选择项,主程序根据该数调用相应的函数*/}int main(){int i,n;ElemType e;LinkList L=NULL; /*定义指向单链表的指针*/for (;;) /*无限循环*/{switch (menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/{/*值不同,执行的函数不同,break 不能省略*/case 1:printf("\n1-Init LinkList:\n");L=InitList(L);if(L!=NULL)printf("\nInitLinkList OK!\n");elseprintf("\nInitLinkList Error!\n");break;case 2:printf("\n2-GetElem from LinkList:\n");printf("input pos=");scanf("%d",&i);if (L!=NULL&&GetElem(L,i,&e)){printf("No%i is %d",i,e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("Error&Not exists!");break;case 3:printf("\n3-Insert e into LinkList:\n");printf("input pos=");scanf("%d",&i);printf("input e=");scanf("%d",&e);if(L!=NULL&&InsertElem(L,i,e)){printf("\nInsert OK!\n");printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nInsert Error!\n");break;case 4:printf("\n4-Delete from LinkList:\n");printf("input pos=");scanf("%d",&i);if(L!=NULL&&DeleteElem(L,i,&e)){printf("\nOK\n");printf("\nDelete data is %d\n",e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nDelete Error!\n");break;case 5:printf("please input n:"); /*输入单链表的元素个数*/ scanf("%d",&n);if (n<0){printf("ERROR");break;}printf("\nCreate LinkList......\n");L=CreateList(n);if (L==NULL){printf("Error!\n");break;}printf("\nPrintfList:\n");PrintList(L);break;case 0:printf("\nDestroy linklist and free memory ......\n");if(L!=NULL){DestroyLinkList(L);L=NULL;}exit(0); /*如菜单返回值为0程序结束*/}}return 0;}实验结果:(1)初始化链表:(2)查找元素:(3)插入数据:(4)删除数据:(5)创建链表:(6)销毁和退出链表:3循环链表的应用(约瑟夫回环问题、)用整数序列1,2,3,…,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。