数据结构(Java版)-线性表的实现与应用完整版
- 格式:doc
- 大小:3.19 MB
- 文档页数:68
实验日期2010.4.19 教师签字成绩实验报告【实验名称】第二章线性表的基本操作及应用【实验目的】(1)熟练掌握线性表的基本操作的实现;(2)以线性表的各种操作(建立、插入、删除等)的实现为重点;(3)通过本次实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。
【实验内容】1.顺序表的基本操作(顺序表的插入、访问、删除操作)#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1typedef int ElemType;typedef int Status;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{ElemType *elem;int length;int listsize;}SqList;Status InitList_Sq(SqList *L){int i,n;L->elem = (ElemType * )malloc(LIST_INIT_SIZE*sizeof(ElemType));if (! L->elem) exit (OVERFLOW);printf("您希望您的顺序表有几个元素: ");scanf("%d",&n);printf("\n");printf("输入您的%d个元素,以构建顺序表: \n",n);for(i=1;i<=n;i++)scanf("%d",&L->elem[i-1]);L->length = n;L->listsize = LIST_INIT_SIZE;return OK;}//InitList_SqStatus PrintList_Sq(SqList L){int i;printf("顺序表中的元素为:");for (i=1;i<=L.length;i++)printf("%d ",L.elem[i-1]);printf("\n");return OK;}//PrintList_Sqint ListInsert_Sq(SqList* L,int i,ElemType x) //对顺序表进行插入操作{int j;if (L->length==L->listsize){printf("\t\t\t顺序表已满");return 0;}else{if (i<1||i>L->length){printf("\t\t\t位置不合法");return 0;}else{for(j=L->length-1;j>=i-1;--j)L->elem[j+1]=L->elem[j];L->elem[i-1]=x;L->length++;return 1;}}}int ListDelete_Sq(SqList* L,int i) //对顺序表进行删除操作{int j;if (i<1||i>L->length){printf("\t\t\t不存在第i个元素");return 0;}else{for (j=i-1;j<L->length;j++){L->elem[j]=L->elem[j+1];}L->length--;return 1;}}int LocateElem(SqList *L, int i) {if(i<1||i>L->length)return ERROR;else return L->elem[i-1];}int scan(){int choose;printf("选择要执行的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");printf("输入其他值退出程序……\n");scanf("%d",&choose);return(choose);}void main(){SqList L;ElemType e;int i;int quit=0;if (InitList_Sq(&L)==OVERFLOW)printf("分配失败,退出程序!");printf("输出程序中的元素\n");PrintList_Sq(L);while(!quit)switch(scan()){case 1:printf("\n请输入你所需要插入的位置和你要插入的元素:");printf("\n请输入i和e的值:");scanf("%d%d",&i,&e);if (ListInsert_Sq(&L,i,e)==OK) PrintList_Sq(L);break;case 2:printf("\n请输入你所需要删除元素的位置:");scanf("%d",&i);if(ListDelete_Sq(&L,i)==OK) PrintList_Sq(L);break;case 3:printf("请输入所要查找元素的位置:\n");scanf("%d",&i);if(LocateElem(&L,i))printf("该位置元素的值为:%d!\n",LocateElem(&L,i));else printf("该位置的元素不存在!\n");break;default:quit=1;printf("操作结束!");printf("\n");}}2.单向链表的基本操作(单向链表的插入、删除、查找以及并表操作)#include<stdio.h>#include<malloc.h>typedef int ElemType;#define OK 1#define ERROR 0#define flag 0typedef struct LNode{ElemType data;struct LNode *next;} LNode,*LinkList;LinkList InitLinkList(){LinkList L;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;return L;}LinkList LocateLinkList(LinkList L,int i){LinkList p;int j;p=L->next;j=1;while(p!=NULL&&j<i){p=p->next; j++;}if (j==i)return p;else return NULL;}void LinkListInsert(LinkList L, int i, ElemType e)//插入元素{LinkList p,s;int j;j=1;p=L;while(p&&j<i){p=p->next;j++;}if(p==NULL||j>i)printf("插入位置不正确\n");else {s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;printf("%d已插入到链表中\n",e);}}void LinkListDelete(LinkList L,int i) //删除元素{LinkList p,q;int j;j=1;p=L;while(p->next&&j<i){p=p->next;j++;}if(p->next==NULL)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;free(q);printf("第%d个元素已从链表中删除\n",i);}}LinkList CreatLinkList( )//建立单向链表{LinkList L=InitLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);while (e!=flag){p=(LinkList)malloc(sizeof(LNode));p->data=e;r->next=p;r=p;scanf("%d",&e);}r->next=NULL;return L;}int LinkListLength(LinkList L){LinkList p;int j;p=L->next;j=0;while(p!=NULL){j++;p=p->next;}return j;}void LinkListPrint(LinkList L){LinkList p;p=L->next;if(p==NULL) printf("单链表为空表\n");else{printf("链表中的元素为:\n");while(p!=NULL){printf("%d ",p->data);p=p->next;}}printf("\n");}void Mergelist_L(LinkList La,LinkList Lb,LinkList Lc) {LNode *pa,*pb,*pc,*p;pa=La->next;pb=Lb->next;Lc=La;pc=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;p=Lc->next;printf("合并结果:");while(p) {printf("%4d",p->data);p=p->next;}free(Lb);}int scan(){int d;printf("请选择你所要执行的单向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素;4.两个单向链表的合并.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){ LinkList La,Lb,Lc;int quit=0;int i,locate;ElemType e;LinkList L,p;L=CreatLinkList();while(!quit)switch(scan()){case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);LinkListInsert(L,i,e);LinkListPrint(L);break;case 2:if(LinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);LinkListDelete(L,i);}LinkListPrint(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;case 4:La=CreatLinkList();Lb=CreatLinkList();Mergelist_L( La, Lb, Lc);printf("\n");break;default:quit=1;printf("操作结束!");printf("\n");}}3.单向循环链表的基本操作(单向链表的插入、删除、查找操作)#include<stdio.h>#include<malloc.h>typedef int ElemType;#define OK 1#define ERROR 0#define flag 0typedef struct LNode{ElemType data;struct LNode *next;} LNode,*LinkList;LinkList InitLinkList(){LinkList L;L=(LinkList)malloc(sizeof(LNode));L->next=L;return L;}LinkList LocateLinkList(LinkList L,int i){LinkList p;int j;p=L->next;j=1;while(p!=L&&j<i){p=p->next; j++;}if (j==i)return p;else return NULL;}void LinkListInsert(LinkList L, int i, ElemType e)//插入元素{LinkList p,s;int j;j=1;p=L;while(p->next!=L&&j<i){p=p->next;j++;}if(p==L||j>i)printf("插入位置不正确\n");else {s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;printf("%d已插入到链表中\n",e);}}void LinkListDelete(LinkList L,int i) //删除元素{LinkList p,q;int j;j=1;p=L;while(p->next!=L&&j<i){p=p->next;j++;}if(p->next==L)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;free(q);printf("第%d个元素已从链表中删除\n",i);}}LinkList CreatLinkList( )//建立单向链表{LinkList L=InitLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);while (e!=flag){p=(LinkList)malloc(sizeof(LNode));p->data=e;r->next=p;r=p;scanf("%d",&e);}r->next=L;return L;}int LinkListLength(LinkList L){LinkList p;int j;p=L->next;j=0;while(p!=L){j++;p=p->next;}return j;}void LinkListPrint(LinkList L){LinkList p;p=L->next;printf("链表中的元素为:\n");while(p!=L){printf("%d ",p->data);p=p->next;}printf("\n");}int scan(){int d;printf("请选择你所要执行的单向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){int quit=0;int i;ElemType e;LinkList L,p;L=CreatLinkList();while(!quit)switch(scan()){case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);LinkListInsert(L,i,e);LinkListPrint(L);break;case 2:if(LinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);LinkListDelete(L,i);}LinkListPrint(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;default:quit=1;printf("操作结束!");printf("\n");}}4.双向链表的基本操作(双向链表的插入、删除、查找以及并表操作)#include<stdio.h>#include<malloc.h>#define flag 0typedef int status;typedef int ElemType;typedef struct DuLNode{ElemType data;struct DuLNode *prior;struct DuLNode *next;}DuLNode,*DuLinkList;DuLinkList InitDuLinkList(){DuLinkList L;L=(DuLinkList)malloc(sizeof(DuLNode));L->next=L->prior=NULL;return L;}DuLinkList CreatDuLinkList(){DuLinkList L=InitDuLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n");scanf("%d",&e);while (e!=flag){p=(DuLinkList)malloc(sizeof(DuLNode));p->data=e;r->next=p;p->prior=r->next;r=p;scanf("%d",&e);}r->next=NULL;return L;}void ListInsert_DuL(DuLinkList L, int i, ElemType e){ DuLinkList p,s;int j;j=1;p=L;while(p&&j<i){p=p->next;j++;}if(p==NULL||j>i)printf("插入位置不正确\n");else {s=(DuLinkList)malloc(sizeof(DuLNode));s->data=e;s->next=p->next; p->next->prior=s;s->prior=p; p->next=s;printf("%d已插入到双向链表中\n",e); }}void ListDelete_DuL(DuLinkList L,int i) //删除元素{DuLinkList p,q;int j;j=1;p=L;while(p->next&&j<i){p=p->next;j++;}if(p->next==NULL)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;q->next->prior=p;free(q);printf("第%d个元素已从链表中删除\n",i); }}void LinkListPrint_DuL(DuLinkList L){DuLinkList p;p=L->next;if(p==NULL) printf("双链表为空表\n");else{printf("链表中的元素为:\n");while(p!=NULL){printf("%d ",p->data);p=p->next;}}printf("\n");}int DuLinkListLength(DuLinkList L){DuLinkList p;int j;p=L->next;j=0;while(p!=NULL){j++;p=p->next;}return j;}DuLinkList LocateDuLinkList(DuLinkList L,int i) {DuLinkList p;int j;p=L->next;j=1;while(p!=NULL&&j<i)p=p->next; j++;}if (j==i)return p;else return NULL;}void Mergelist_L(DuLinkList La,DuLinkList Lb,DuLinkList Lc){DuLNode *pa,*pb,*pc,*p;pa=La->next;pb=Lb->next;Lc=La;pc=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;p=Lc->next;printf("合并结果:");while(p) {printf("%4d",p->data);p=p->next;}free(Lb);}int scan(){int d;printf("请选择你所要执行的双向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素;4.两个双向链表的合并.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){int quit=0;int i;ElemType e;DuLinkList L,p;DuLinkList La,Lb,Lc;L=CreatDuLinkList();while(!quit){switch(scan())case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);ListInsert_DuL(L,i,e);LinkListPrint_DuL(L);break;case 2:if(DuLinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);ListDelete_DuL(L,i);}LinkListPrint_DuL(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateDuLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;case 4:La=CreatDuLinkList();Lb=CreatDuLinkList();Mergelist_L( La, Lb, Lc);printf("\n");break;default:quit=1;printf("操作结束!");printf("\n");}}5.双向循环链表的基本操作(双向循环链表的插入、删除以及访问操作)#include<stdio.h>#include<malloc.h>#define flag 0typedef int status;typedef int ElemType;typedef struct DuLNode{ElemType data;struct DuLNode *prior;struct DuLNode *next;}DuLNode,*DuLinkList;DuLinkList InitDuLinkList(){DuLinkList L;L=(DuLinkList)malloc(sizeof(DuLNode));L->next=L; L->prior=L;return L;}DuLinkList CreatDuLinkList(){DuLinkList L=InitDuLinkList(),p,r;ElemType e;r=L;printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);while (e!=flag){p=(DuLinkList)malloc(sizeof(DuLNode));p->data=e;r->next=p;p->prior=r->next;r=p;scanf("%d",&e);}r->next=L; L->prior=r;return L;}void ListInsert_DuL(DuLinkList L, int i, ElemType e){ DuLinkList p,s;int j;j=1;p=L;while(j<i){p=p->next;j++;}if(j>i)printf("插入位置不正确\n");else {s=(DuLinkList)malloc(sizeof(DuLNode));s->data=e;s->next=p->next; p->next->prior=s;s->prior=p; p->next=s;printf("%d已插入到双向循环链表中\n",e); }}void ListDelete_DuL(DuLinkList L,int i) //删除元素{DuLinkList p,q;int j;j=1;p=L;while(p->next!=L&&j<i){p=p->next;j++;}if(p->next==L)printf("删除位置不正确\n");else{q=p->next;p->next=q->next;q->next->prior=p;free(q);printf("第%d个元素已从双向循环链表中删除\n",i); }}void LinkListPrint_DuL(DuLinkList L){DuLinkList p;p=L->next;if(p->next==L) printf("双链表为空表\n");else{printf("链表中的元素为:\n");while(p!=L){printf("%d ",p->data);p=p->next;}}printf("\n");}int DuLinkListLength(DuLinkList L){DuLinkList p;int j;p=L->next;j=0;while(p->next!=L){j++;p=p->next;}return j;}DuLinkList LocateDuLinkList(DuLinkList L,int i){DuLinkList p;int j=1;p=L->next;while(p->next!=L&&j<i){p=p->next; j++;}if (j==i)return p;else return NULL;}int scan(){int d;printf("请选择你所要执行的双向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");printf("其他键退出程序……");printf("\n");scanf("%d",&d);return(d);}void main(){ int quit=0;int i,locate;ElemType e;DuLinkList L,p;L=CreatDuLinkList();while(!quit)switch(scan()){case 1:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");scanf("%d%d",&i,&e);ListInsert_DuL(L,i,e);LinkListPrint_DuL(L);break;case 2:if(DuLinkListLength(L)==0)printf("链表已经为空,不能删除\n\n");else{printf("请输入待删除元素的位置:\n");scanf("%d",&i);ListDelete_DuL(L,i);}LinkListPrint_DuL(L);break;case 3:printf("请输入待查询元素在链表中的位置:");scanf("%d",&i);p=LocateDuLinkList(L,i);if(p)printf("链表中第%d个元素的值为:%d\n",i,p->data);elseprintf("查询位置不正确\n\n");break;default:quit=1;printf("操作结束!");printf("\n");}}【小结讨论】1.通过实验,我加深了对C的工作环境及其基本操作,进一步掌握了基本函数的调用以及使用方法。
第1讲线性表本章主要掌握如下内容:线性表的定义和基本操作,线性表的实现,线性表的顺序存储结构及链式存储结构,线性表的应用。
知识点分析(一)线性表的定义和基本操作1.线性表基本概念1)定义:是由相同类型的结点组成的有限序列。
如:由n个结点组成的线性表(a1, a2, …, a n)a1是最前结点,a n是最后结点。
结点也称为数据元素或者记录。
2)线性表的长度:线性表中结点的个数称为其长度。
长度为0的线性表称为空表。
3)结点之间的关系:设线性表记为(a1,a2,…a i-1 , a i, a i+1 ,…a n),称a i-1是a i的直接前驱结点....(简称前驱),a i+1是a i的直接后继结点....(简称后继)。
4)线性表的性质:①线性表结点间的相对位置是固定..的,结点间的关系由结点在表中的位置确定。
②如果两个线性表有相同的数据结点,但它们的结点顺序不一致,该两个线性表也是不相等的。
注意:线性表中结点的类型可以是任何数据(包括简单类型和复杂类型),即结点可以有多个成分,其中能唯一标识表元的成分称为关键字(key),或简称键。
以后的讨论都只考虑键,而忽略其它成分,这样有利于把握主要问题,便于理解。
『经典例题解析』线性表的特点是每个元素都有一个前驱和一个后继。
( )【答案】错误。
【解析】线性表的第一个数据元素没有前驱,最后一个元素没有后继。
其余的所有元素都有一个前驱和后继。
2.线性表的抽象数据类型线性表是一个相当灵活的数据结构,其长度可以根据需要增加或减少。
从操作上讲,用户不仅可以对线性表的数据元素进行访问操作,还可以进行插入、删除、定位等操作。
1)线性表的基本操作假设线性表L有数据对象 D={ai | ai∈ElemSet,i=1,2,3,…,n,n>=0},数据元素之间的关系R={<ai-1,ai>|ai-1,ai∈D,i=1,2,…,n},则线性表L的基本操作如下所示:●InitList(&L):其作用是构造一个长度为0的线性表(空线性表);●DestoryList(&L):其作用是销毁当前的线性表L;●ClearList(&L):清空线性表L,使之成为空表;●ListLength(L):返回线性表L的长度,即线性表中数据元素的个数;●ListEmpty(L) :判断线性表L是否为空表,是则返回True,否则返回False;●GetElem(L,i,&e):将线性表L中第i个数据元素的值返回到变量e中;●LocateELem(L,e,compare( )) :判断线性表L中是否存在与e满足compare()条件的数据元素,有则返回第一个数据元素;●PriorElem(L,cur_e,&pri_e):返回线性表L中数据元素cur_e的前驱结点;●NextElem(L,cur_e,&next_e):返回线性表L中数据元素cur_e的后继结点;●ListInsert(&L,i,e):向线性表L的第i个位置之前插入一个数据元素,其值为e;●ListDelete(&L,i,&e):删除线性表L的第i个数据元素,并将该数据元素的值返回到e中;●ListTraverse(L,visit()):遍历线性表中的每个数据元素。
《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。
2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。
二、实验内容√ 1、单链表的表示与操作实现 ( * )2、约瑟夫环问题3、Dr.Kong的艺术品三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、单链表的结点类型定义/* 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;2、初始化单链表LinkedList LinkedListInit( ){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 }3、清空单链表void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数}4、检查单链表是否为空int LinkedListEmpty(LinkedList L){ …. }5、遍历单链表void LinkedListTraverse(LinkedList L){….}6、求单链表的长度int LinkedListLength(LinkedList L){ …. }7、从单链表表中查找元素LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 }8、从单链表表中查找与给定元素值相同的元素在链表中的位置LinkedList LinkedListLocate(LinkedList L, DataType x){ …… }9、向单链表中插入元素void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法// 在链表中第i 个结点之前插入新的元素 x}10、从单链表中删除元素void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 }11、用尾插法建立单链表LinkedList LinkedListCreat( ){ …… }㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结五、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。
package com.zhy.sqlist;class Sqlist{int[] datas ;int length ;}public class SqlListOp{private static Sqlist sqlist ;static{sqlist = new Sqlist();sqlist.datas = new int[]{123,234,345,456,678,908,123,999};sqlist.length = sqlist.datas.length ;}/*** 删除数组中指定元素方法1* @author Administrator**/public void del_key_01(Sqlist sqlist, int key ){int k = 0 ;for(int i = 0 ; i< sqlist.length ; i++){if(sqlist.datas[i] != key){sqlist.datas[k++] = sqlist.datas[i] ;}}sqlist.length = k ;}/*** 删除数组中指定元素方法2* @author Administrator**/public void del_key_02(Sqlist sqlist, int key ){int k = 0 ;for(int i = 0 ; i< sqlist.length ; i++){if(sqlist.datas[i] == key){k++ ;}else{sqlist.datas[i-k] = sqlist.datas[i] ;}}sqlist.length -= k ;}/*** 输出所有元素* @param sqlist*/public void print(Sqlist sqlist){System.out.println("sqlist长度为:" + sqlist.length);for(int i = 0 ; i < sqlist.length ; i++){System.out.print(sqlist.datas[i]+" ");}}/*** 反转整个数组*/public void reverse(Sqlist sqlist ){int tmp ;for( int i = 0 ; i < sqlist.length/2; i++) //注意sqlist.length/2 {tmp = sqlist.datas[i] ;sqlist.datas[i] = sqlist.datas[sqlist.datas.length - i - 1] ;sqlist.datas[sqlist.datas.length - i -1 ] = tmp ;}}/*** 反转指定下标范围 [start , end )* @param sqlist* @param start* @param end*/public void reverse(Sqlist sqlist , int start , int end ){int tmp ;for( int i = start ; i < (start + end)/2 ; i++){tmp = sqlist.datas[i] ;sqlist.datas[i] = sqlist.datas[start + end - i - 1] ;sqlist.datas[start + end - i -1 ] = tmp ;}}/*** 数组循环左移k为* abcdefg 循环左移3位--> defgabc* 1、先反转得到gfedcba* 2、再分别反转前 length - k 位和后k位*/public void cleft(Sqlist sqlist , int k ){k = k % sqlist.length ;reverse(sqlist);reverse(sqlist , 0 , sqlist.length - k );reverse(sqlist , sqlist.length - k , sqlist.length );}public static void main(String[] args){SqlListOp listOp = new SqlListOp() ;listOp.print(sqlist);//listOp.del_key_02(sqlist, 123) ;//listOp.reverse(sqlist);listOp.cleft(sqlist, 9);//listOp.reverse(sqlist, 2, 6);System.out.println();listOp.print(sqlist);}}。
数据结构线性表一、引言数据结构是计算机存储、组织数据的方式,它决定了数据访问的效率和灵活性。
在数据结构中,线性表是一种最基本、最常用的数据结构。
线性表是由零个或多个数据元素组成的有限序列,其中数据元素之间的关系是一对一的关系。
本文将对线性表的概念、分类、基本操作及其应用进行详细阐述。
二、线性表的概念1.数据元素之间具有一对一的关系,即除了第一个和一个数据元素外,其他数据元素都是首尾相连的。
2.线性表具有唯一的第一个元素和一个元素,分别称为表头和表尾。
3.线性表的长度是指表中数据元素的个数,长度为零的线性表称为空表。
三、线性表的分类根据线性表的存储方式,可以将线性表分为顺序存储结构和链式存储结构两大类。
1.顺序存储结构:顺序存储结构是将线性表中的数据元素按照逻辑顺序依次存放在一组地质连续的存储单元中。
顺序存储结构具有随机访问的特点,可以通过下标快速访问表中的任意一个元素。
顺序存储结构的线性表又可以分为静态顺序表和动态顺序表两种。
2.链式存储结构:链式存储结构是通过指针将线性表中的数据元素连接起来,形成一个链表。
链表中的每个节点包含一个数据元素和一个或多个指针,指向下一个或前一个节点。
链式存储结构具有动态性,可以根据需要动态地分配和释放节点空间。
链式存储结构的线性表又可以分为单向链表、双向链表和循环链表等。
四、线性表的基本操作线性表作为一种数据结构,具有一系列基本操作,包括:1.初始化:创建一个空的线性表。
2.插入:在线性表的指定位置插入一个数据元素。
3.删除:删除线性表中指定位置的数据元素。
4.查找:在线性表中查找具有给定关键字的数据元素。
5.更新:更新线性表中指定位置的数据元素。
6.销毁:释放线性表所占用的空间。
7.遍历:遍历线性表中的所有数据元素,进行相应的操作。
8.排序:对线性表中的数据元素进行排序。
9.合并:将两个线性表合并为一个线性表。
五、线性表的应用1.程序语言中的数组:数组是一种典型的顺序存储结构的线性表,常用于存储具有相同类型的数据元素。
数据结构线性表应用在计算机科学领域中,数据结构是一门至关重要的学科,它为我们提供了高效组织和管理数据的方法。
其中,线性表作为一种基本的数据结构,具有广泛的应用场景。
线性表是由零个或多个数据元素组成的有限序列。
这些数据元素在逻辑上是线性排列的,也就是说,它们之间存在着一种顺序关系。
常见的线性表实现方式有顺序表和链表。
顺序表是一种采用连续存储空间来存储数据元素的线性表。
它的优点是可以随机访问元素,时间复杂度为 O(1)。
这意味着,如果我们知道元素在顺序表中的位置,就能够快速地获取到该元素。
想象一下,我们有一个学生成绩的顺序表,要查找第 10 个学生的成绩,直接根据索引就能迅速找到。
顺序表在需要频繁进行随机访问的场景中表现出色,比如在数据库中存储数据时。
然而,顺序表也有它的局限性。
当需要插入或删除元素时,如果插入或删除的位置不是在表尾,就需要移动大量的元素,时间复杂度为O(n)。
这在数据量较大时,可能会导致性能下降。
相比之下,链表则在插入和删除操作上具有优势。
链表中的每个节点包含数据元素和指向下一个节点的指针。
当进行插入或删除操作时,只需要修改相关节点的指针即可,时间复杂度为 O(1)。
比如,在一个购物车的链表中,添加或删除商品时,不需要移动其他商品的位置,操作效率很高。
线性表在日常生活中的应用比比皆是。
以我们常见的排队为例,排队的人群可以看作是一个线性表。
每个人按照先后顺序排列,新加入的人排在队尾,离开的人从队首离开。
这种先入先出的特性,与线性表中的队列结构相似。
在计算机程序中,线性表也有广泛的应用。
比如,在文本编辑软件中,我们输入的字符序列可以看作是一个线性表。
当我们进行插入、删除字符的操作时,就是对这个线性表进行修改。
再比如,在操作系统的进程管理中,进程可以按照它们的创建顺序或者优先级排列成一个线性表。
操作系统在调度进程时,需要根据线性表中的信息来决定哪个进程先执行,哪个进程后执行。
在软件开发中,线性表也常用于实现栈这种数据结构。
数据结构--实验报告线性表的基本操作数据结构--实验报告线性表的基本操作一、引言本实验报告旨在通过实际操作,掌握线性表的基本操作,包括初始化、插入、删除、查找等。
线性表是最基本的数据结构之一,对于理解和应用其他数据结构具有重要的作用。
二、实验目的1·了解线性表的定义和基本特性。
2·掌握线性表的初始化操作。
3·掌握线性表的插入和删除操作。
4·掌握线性表的查找操作。
5·通过实验巩固和加深对线性表的理解。
三、线性表的基本操作1·初始化线性表线性表的初始化是将一个线性表变量设置为空表的过程。
具体步骤如下:(1)创建一个线性表的数据结构,包括表头指针和数据元素的存储空间。
(2)将表头指针指向一个空的数据元素。
2·插入元素插入元素是向线性表中指定位置插入一个元素的操作。
具体步骤如下:(1)判断线性表是否已满,如果已满则无法插入元素。
(2)判断插入位置是否合法,如果不合法则无法插入元素。
(3)将插入位置及其后面的元素都向后移动一个位置。
(4)将待插入的元素放入插入位置。
3·删除元素删除元素是从线性表中删除指定位置的元素的操作。
具体步骤如下:(1)判断线性表是否为空,如果为空则无法删除元素。
(2)判断删除位置是否合法,如果不合法则无法删除元素。
(3)将删除位置后面的元素都向前移动一个位置。
(4)删除最后一个元素。
4·查找元素查找元素是在线性表中查找指定元素值的操作。
具体步骤如下:(1)从线性表的第一个元素开始,逐个比较每个元素的值,直到找到目标元素或遍历完整个线性表。
(2)如果找到目标元素,则返回该元素的位置。
(3)如果未找到目标元素,则返回找不到的信息。
四、实验步骤1·初始化线性表(1)定义线性表的数据结构,包括表头指针和数据元素的存储空间。
(2)将表头指针指向一个空的数据元素。
2·插入元素(1)判断线性表是否已满。
数据结构实验报告线性表数据结构实验报告:线性表引言:数据结构是计算机科学中的重要概念,它涉及到如何组织和存储数据,以及如何有效地操作和管理这些数据。
线性表是数据结构中最基本的一种,它是一种有序的数据元素集合,其中的元素之间存在着一对一的关系。
一、线性表的定义和特点线性表是由n个数据元素组成的有限序列,其中n为表的长度。
这些数据元素可以是相同类型的,也可以是不同类型的。
线性表中的数据元素按照一定的顺序排列,并且每个数据元素都有唯一的前驱和后继。
线性表的特点有以下几个方面:1. 数据元素之间是一对一的关系,即每个数据元素只有一个直接前驱和一个直接后继。
2. 线性表中的元素是有序的,每个元素都有一个确定的位置。
3. 线性表的长度是有限的,它的长度可以是0,也可以是任意正整数。
二、线性表的实现方式线性表可以使用不同的数据结构来实现,常见的实现方式有数组和链表。
1. 数组实现线性表:数组是一种连续存储的数据结构,它可以用来存储线性表中的元素。
数组的优点是可以快速访问任意位置的元素,但是插入和删除操作需要移动其他元素,效率较低。
2. 链表实现线性表:链表是一种非连续存储的数据结构,它通过指针将线性表中的元素链接起来。
链表的优点是插入和删除操作简单高效,但是访问任意位置的元素需要遍历链表,效率较低。
三、线性表的基本操作线性表的基本操作包括插入、删除、查找和修改等。
1. 插入操作:插入操作用于向线性表中插入一个新元素。
具体步骤是先将插入位置后面的元素依次后移,然后将新元素插入到指定位置。
2. 删除操作:删除操作用于从线性表中删除一个元素。
具体步骤是先将删除位置后面的元素依次前移,然后将最后一个元素删除。
3. 查找操作:查找操作用于在线性表中查找指定元素。
具体步骤是从线性表的第一个元素开始逐个比较,直到找到匹配的元素或者到达线性表的末尾。
4. 修改操作:修改操作用于修改线性表中的某个元素的值。
具体步骤是先查找到要修改的元素,然后将其值更新为新值。
实验报告二线性表华南农业大学信息(软件)学院《数据结构(JA V A)》综合性、设计性实验成绩单开设时间:2017学年第二学期一,实验目的:(1)理解线性表的逻辑结构、两种存储结构和数据操作,熟练运用JAVA语言实现线性表的基本操作,分析各种操作算法特点和时间复杂度。
(2)掌握单链表的遍历、插入和删除等操作算法,实现多项式相加。
二,实验内容:1、设计一个有序顺序表(元素已排序,递增或递减),实现插入、删除等操作,元素插入位置由其值决定。
实现:(1)升序排序顺序表类名为:SortedSeqList,存成文件;(2)另外编写文件来演示调用排序顺序表public class SortedSeqList {private int MAX_SIZE = 10;private int[] ary = new int[MAX_SIZE];private int length = 0;public SortedSeqList(int[] array) {if (array == null || == 0) {= 0;} else {ary = array;length = ;}}public void clear() {length = 0;}public boolean isEmpty() {return length == 0;}public void delete(int index) throws Exception {if (length == 0) {throw new Exception("No elment to delete");}int newAry[] = new int[ - 1];for (int i = 0, j = 0; i < ; i++) {if (i == index) {continue;} else {newAry[j++] = ary[i];}}ary = newAry;length--;}public int insert(int value) throws Exception {if (length == MAX_SIZE) {throw new Exception("List is full, can't insert more");}int[] newAry = new int[length + 1];int i = 0, j = 0;for (; i < ; i++, j++) {if (ary[i] >= value) {newAry[j] = value;break;} else {newAry[j] = ary[i];}}while (i < {newAry[++j] = ary[i];i++;}ary = newAry;length++;return value;}public void display() {"\nList now is: ");for (int i = 0; i < ; i++) {+ "\t");}}}(2)文件来演示调用排序顺序表public class SortedSeqList_ex {public static void main(String[] args) throws Exception {int[] ary = {1, 2, 3, 5, 7};SortedSeqList list = new SortedSeqList(ary);();(4);();(2);();}}(3)实验结果2、在SinglyLinkedList类中增加下列成员方法。
数据结构实验报告(⼀)线性表的应⽤实验说明数据结构实验⼀ 线性表的实验——线性表的应⽤⼀、实验⽬的通过本实验使学⽣了解线性表的⼀种简单应⽤,熟悉线性表顺序存储与链式存储的特性,特别训练学⽣编程灵活控制链表的能⼒,为今后编程控制更为复杂的数据结构奠定基础。
⼆、实验内容1.⽤顺序表和链表分别分别编程实现教材中例⼦2-1与2-2。
要求:(1)只能⽤C语⾔编程实现;(2)完全保持书中算法2.1与算法2.2形式,不允许有任何变化,除⾮语法上不允许;所调⽤各函数参照书中19页的功能描述,其中函数名、参数个数及性质、函数功能必须与书中完全⼀致,不能有变化。
2.利⽤线性表表⽰⼀元多项式完成多项式的加、减、乘、求导、求值运算。
要求:(1)输⼊的⼀元多项式可以采⽤只输⼊各项的系数与指数这种简化的⽅式。
如对于多项式2x2+6x5,输⼊可为: 2,2 6,5 这样的简单形式。
(2)遇到有消项时应当处理,如2x2+6x5与3x2-6x5进⾏相加时,结果为5*x^2。
(3)当给定x的值时,能计算表达式相加或相减的结果。
(4)操作的结果放⼊⼀个新线性表中,原来的两个表达式存储表⽰不变,也可以不是产⽣新的线性表,⽽是将两上线性表合并为⼀个。
(5)要求程序功能模块划分合理(每个函数功能单⼀、可重⽤性好),使⽤空间尽可能少,算法尽可能⾼效。
实验报告1.实现功能描述使⽤线性表表⽰⼀元多项式完成多项式的加、减,乘,求导、求值运算。
2.⽅案⽐较与选择(1)因为使⽤的是线性表,所以主要⽅案有数组法和链表法。
(2)从时间复杂度来说,使⽤数组法更优;从空间复杂度来说,链表法更优。
因为数组法是指定好空间的,若式⼦⼤⼩超出设置⼤⼩,那程序必然出错;若式⼦⼤⼩⼩于设置⼤⼩,那就意味着有多余的空间被浪费了。
综合来讲,若计算式⼦较为庞⼤,使⽤链表法更佳;相反,若计算式⼦较⼩,数组法更佳。
3.设计算法描述(1)单个项式的数据存储使⽤了结构体,数组法是在⼀个结构体中定义两个⼀维数组;链表法是通过⼀个结构体作为⼀个节点,通过next指针连接起来。
《数据结构》课程实验指导《数据结构》实验教学大纲课程代码:0806523006 开课学期:3 开课专业:信息管理与信息系统总学时/实验学时:64/16 总学分/实验学分:3.5/0.5一、课程简介数据结构是计算机各专业的重要技术基础课。
在计算机科学中,数据结构不仅是一般程序设计的基础,而且是编译原理、操作系统、数据库系统及其它系统程序和大型应用程序开发的重要基础。
数据结构课程主要讨论各种主要数据结构的特点、计算机内的表示方法、处理数据的算法以及对算法性能的分析。
通过对本课程的系统学习使学生掌握各种数据结构的特点、存储表示、运算的原理和方法,学会从问题入手,分析研究计算机加工的数据结构的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储机构及其相应的操作算法,并初步掌握时间和空间分析技术。
另一方面,本课程的学习过程也是进行复杂程序设计的训练过程,通过对本课程算法设计和上机实践的训练,还应培养学生的数据抽象能力和程序设计的能力。
二、实验的地位、作用和目的数据结构是一门实践性较强的基础课程,本课程实验主要是着眼于原理和应用的结合,通过实验,一方面能使学生学会把书上学到的知识用于解决实际问题,加强培养学生如何根据计算机所处理对象的特点来组织数据存储和编写性能好的操作算法的能力,为以后相关课程的学习和大型软件的开发打下扎实的基础。
另一方面使书上的知识变活,起到深化理解和灵活掌握教学内容的目的。
三、实验方式与基本要求实验方式是上机编写完成实验项目指定功能的程序,并调试、运行,最终得出正确结果。
具体实验要求如下:1.问题分析充分地分析和理解问题本身,弄清要求,包括功能要求、性能要求、设计要求和约束,以及基本数据特性、数据间联系等等。
2.数据结构设计针对要解决的问题,考虑各种可能的数据结构,并且力求从中选出最佳方案(必须连同算法实现一起考虑),确定主要的数据结构和全程变量。
对引入的每种数据结构和全程变量要详细说明其功用、初值和操作的特点。
数据结构( Java 版) 习题解答与实验指导目录第1 章绪论11.1 数据结构的基本概念11.2 算法2第2 章线性表32.1 线性表抽象数据类型32.2 线性表的顺序存储和实现42.2.1 线性表的顺序存储结构42.2.2 顺序表52.2.3 排序顺序表72.3 线性表的链式存储和实现92.3.1 单链表9【习题2-8】单链表结点类问题讨论。
9【习2.1 ]使用单链表求解Josephu环问题。
12【习2.2】集合并运算,单链表深拷贝的应用。
142.3.2 双链表16【习2.3] 循环双链表的迭代方法。
19【习2.4] 循环双链表合并连接。
19第3 章串213.1 串抽象数据类型213.2 串的存储和实现223.2.1 串的存储结构223.2.2 常量字符串类22【习3.1 ] C/C++语言,str in g.h 中的strcpy()和strcat()函数存在下标越界错误。
22【思考题3-1】逆转String串,分析算法效率。
24【实验题3-1】MyString 类,比较串大小,忽略字母大小写。
25【例3.2思考题3-2] Mylnteger整数类,返回value的radix进制原码字符串。
26【实验题3-9] 浮点数类。
273.2.3 变量字符串类30【实验题3-11]删除变量串中的所有空格。
4-样卷303.3 串的模式匹配313.3.1 Brute-Force模式匹配算法313.3.2 模式匹配应用32【思考题3-4,实验题3-13 ] MyString 类,replaceAII(pattern,s)改错。
323.3.3 KMP模式匹配算法33第4 章栈和队列364.1 栈364.2 队列384.3 递归41【习4.1 】打印数字塔。
41第5 章数组和广义表435.1 数组435.2 特殊矩阵的压缩存储445.2.1 三角矩阵、对称矩阵和对角矩阵的压缩存储445.2.2 稀疏矩阵的压缩存储465.3 广义表48第6 章树和二叉树496.2 二叉树496.3 线索二叉树566.4 Huffman 树616.5 树的表示和实现62第7 章图637.1 图及其抽象数据类型637.2 图的表示和实现647.3 图的遍历657.4最小生成树677.5最短路径69 第8章查找728.1查找的基本概念728.2二分法查找738.4散列748.5二叉排序树7676【实验8-1】判断一棵二叉树是否为二叉排序树,改错。
数据结构线性表实验报告五篇第一篇:数据结构线性表实验报告实验报告课程名:数据结构实验名:线性表及其操作姓名:班级:学号:撰写时间: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:实验结果截图实验分析:已在程序中按规定格式标注。
二章线性表线性表是最简单、最基本、也是最常用的一种线性结构。
它有两种存储方法:顺序存储和链式存储,它的主要基本操作是插入、删除和检索等。
2.1 线性表的逻辑结构2.1.1 线性表的定义线性表是一种线性结构。
线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。
在一个线性表中数据元素的类型是相同的,或者说线性表是由同一类型的数据元素构成的线性结构。
在实际问题中线性表的例子是很多的,如学生情况信息表是一个线性表:表中数据元素的类型为学生类型; 一个字符串也是一个线性表:表中数据元素的类型为字符型,等等。
综上所述,线性表定义如下:线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,通常记为:(a1,a2,… a i-1,a i,a i+1,…a n)其中n为表长,n=0 时称为空表。
表中相邻元素之间存在着顺序关系。
将a i-1 称为a i 的直接前趋,a i+1 称为a i 的直接后继。
就是说:对于a i,当i=2,...,n 时,有且仅有一个直接前趋a i-1.,当i=1,2,...,n-1 时,有且仅有一个直接后继a i+1,而a1 是表中第一个元素,它没有前趋,a n 是最后一个元素无后继。
需要说明的是:a i为序号为i 的数据元素(i=1,2,…,n),通常我们将它的数据类型抽象为datatype,datatype根据具体问题而定,如在学生情况信息表中,它是用户自定义的学生类型; 在字符串中,它是字符型; 等等。
2.1.2 线性表的基本操作在第一章中提到,数据结构的运算是定义在逻辑结构层次上的,而运算的具体实现是建立在存储结构上的,因此下面定义的线性表的基本运算作为逻辑结构的一部分,每一个操作的具体实现只有在确定了线性表的存储结构之后才能完成。
线性表上的基本操作有:⑴线性表初始化:Init_List(L)初始条件:表L不存在操作结果:构造一个空的线性表⑵求线性表的长度:Length_List(L)初始条件:表L存在操作结果:返回线性表中的所含元素的个数⑶取表元:Get_List(L,i)初始条件:表L存在且1<=i<=Length_List(L)操作结果:返回线性表L中的第i个元素的值或地址⑷按值查找:Locate_List(L,x),x是给定的一个数据元素。
实验报告
课程名称数据结构
实验项目线性表的实现及应用
实验仪器PC机一台
学院_____ 专业
班级/学号
姓名
实验日期
成绩
指导教师
北京信息科技大学
信息管理学院
(数据结构课程上机)实验报告
3.
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模
版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
数据结构实验二线性表数据结构实验二线性表1. 实验目的1.1 理解线性表的概念和特性1.2 学习线性表的顺序存储结构和链式存储结构1.3 掌握线性表的基本操作:初始化、插入、删除、查找、修改、遍历等1.4 熟悉线性表的应用场景2. 实验内容2.1 线性表的顺序存储结构实现2.1.1 定义线性表结构体2.1.2 初始化线性表2.1.3 插入元素2.1.4 删除元素2.1.5 查找元素2.1.6 修改元素2.1.7 遍历线性表2.2 线性表的链式存储结构实现2.2.1 定义链表节点结构体2.2.2 初始化链表2.2.3 插入元素2.2.4 删除元素2.2.5 查找元素2.2.6 修改元素2.2.7 遍历链表3. 实验步骤3.1 实现顺序存储结构的线性表3.2 实现链式存储结构的线性表3.3 编写测试程序,验证线性表的各种操作是否正确3.4 进行性能测试,比较两种存储结构的效率差异4. 实验结果与分析4.1 执行测试程序,检查线性表的操作结果是否正确4.2 对比顺序存储结构和链式存储结构的性能差异4.3 分析线性表的应用场景,总结线性表的优缺点5. 实验总结5.1 总结线性表的定义和基本操作5.2 回顾实验中遇到的问题和解决方法5.3 提出对线性表实现的改进方向和思考附件:请参考附件中的源代码和实验报告模板。
法律名词及注释:1. 版权:指对某一作品享有的法律上的权利,包括复制权、发行权、改编权等。
2. 法律责任:指违反法律或合同规定所承担的责任。
3. 保密义务:指个人或组织根据法律、法规、合同等规定需要承担的保密责任。
4.知识产权:指人们在社会实践中所创造的智力劳动成果所享有的权利,包括专利权、著作权、商标权等。
数据结构(Java版)-线性表的实现与应用完整版实验报告课程名称数据结构实验项目线性表的实现及应用实验仪器PC机一台学院_____ 专业班级/学号姓名实验日期成绩指导教师北京信息科技大学信息管理学院(数据结构课程上机)实验报告专业: 班级: 学号: 姓名: 成绩:实验名称线性表的实现及应用实验地点实验时间1.实验目的:(1)理解用顺序表实现线性表的特点;熟练掌握顺序表的基本操作;学会利用顺序表解决实际应用问题。
(2)熟练掌握单链表的使用;理解用链表实现线性表的特点;了解链表的多种形式;学会利用单链表解决实际应用问题。
2.实验要求:(1)学时为8学时;(2)能在机器上正确、调试运行程序;(3)本实验需提交实验报告;(4)实验报告文件命名方法:数据结构实验_信管16xx_学号_姓名.doc。
3.实验内容和步骤:第一部分顺序表的实现与应用(1)基于顺序表实现线性表的以下基本操作:public interface LList<T>{ //线性表接口,泛型参数T表示数据元素的数据类型boolean isEmpty(); //判断线性表是否空int size(); //返回线性表长度T get(int i); //返回第i(i≥0)个元素void set(int i, T x); //设置第i个元素值为xvoid insert(int i, T x); //插入x作为第i个元素void insert(T x); //在线性表最后插入x元素T remove(int i); //删除第i个元素并返回被删除对象int search(T key); //查找,返回首次出现的关键字为key的元素的位序void removeAll(); //删除线性表所有元素public String toString();//返回顺序表所有元素的描述字符串,形式为“(,)”}要求:实现后应编写代码段对每个基本操作做测试。
(2)顺序表的简单应用a)运用基本操作编写算法删除第i个开始的k个元素。
b)编写高效算法删除第i个开始的k个元素。
c)将两个顺序表合并为一个顺序表(表中元素有序);d)若两个元素按值递增有序排列的顺序表A和B,且同一表中的元素值各不相同。
试构造一个顺序表C,其元素为A和B中元素的交集,且表C中的元素也按值递增有序排列;(3)利用顺序表解决约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
要求:输出出列次序。
第二部分单链表的实现与应用(4)基于单链表实现线性表的以下基本操作(不需要建立接口,直接建立带头结点的单链表类):ADT List<T>{ boolean isEmpty(); //判断线性表是否空int size(); //返回线性表长度T get(int i); //返回第i(i≥0)个元素void set(int i, T x); //设置第i个元素值为xNode<T> insert(int i, T x); //插入x作为第i个元素Node<T> insert(T x); //在线性表最后插入x元素T remove(int i); //删除第i个元素并返回被删除对象void removeAll(); //删除线性表所有元素Node<T> search(T key); //查找,返回首次出现的关键字为key元素public String toString(); //返回顺序表所有元素的描述字符串,形式为“(,)”}要求:实现后应编写代码段对每个基本操作做测试。
(5)实现单链表的子类排序单链表,覆盖单链表如下方法:void set(int i, T x); //设置第i个元素值为xNode<T> insert(int i, T x); //插入x作为第i个元素Node<T> insert(T x); //在线性表最后插入x元素Node<T> search(T key); //查找,返回首次出现的关键字为key元素(6)基于排序单链表实现线性表的以下综合应用:e)删除第i个开始的k个元素。
f)删除递增有序单链表中所有值大于mink且小于maxk的元素。
g)将两个单链表合并为一个单链表,保持有序。
h)若两个元素按值递增有序排列的单链表A和B,且同一表中的元素值各不相同。
试构造一个单链表C,其元素为A和B中元素的交集,且表C中的元素也按值递增有序排列。
要求利用原有链表中的元素。
(7)一元多项式的基本运算用排序单链表表示一元多项式,并实现以下基本运算:●一元多项式的建立●一元多项式的减法运算(要求:在运算过程中不能创建新结点即A=A-B)(8)备份自己程序4.实验准备:复习教材第2章线性表的知识点熟悉Java编程环境提前熟悉实验内容,设计相关算法5.实验过程:第一部分:(1)package ex1;public interface LList<T>{ //线性表接口,泛型参数T表示数据元素的数据类型boolean isEmpty(); //判断线性表是否空int length(); //返回线性表长度T get(int i); //返回第i(i≥0)个元素void set(int i, T x); //设置第i个元素值为xint insert(int i, T x); //插入x作为第i个元素int append(T x); //在线性表最后插入x元素T remove(int i); //删除第i个元素并返回被删除对象void removeAll(); //删除线性表所有元素int search(T key); //查找,返回首次出现的关键字为key的元素的位序}类名:public class SeqList<T>implements LList<T> {protected Object[] element;protected int n;public SeqList(int length) //构造容量为length的空表{this.element = newObject[length]; //申请数组的存储空间,元素为null。
//若length<0,Java抛出负数组长度异常ng.NegativeArraySizeExceptionthis.n = 0;}public SeqList() //创建默认容量的空表,构造方法重载{this(64); //调用本类已声明的指定参数列表的构造方法}public SeqList(T [] values) //构造顺序表,由values数组提供元素,忽略其中空对象{this(values.length*2); //创建2倍values数组容量的空表//若values==null,用空对象调用方法,Java抛出空对象异常NullPointerExceptionfor (int i=0;i<values.length; i++)//复制非空的数组元素。
O(n)if (values[i]!=null)this.element[this.n++] = values[i]; //对象引用赋值}public boolean isEmpty() //判断线性表是否空{return this.n==0;}public intlength(){ //返回线性表长度return this.n;}public T get(inti){ //返回第i(i≥0)个元素i f (i>=0 && i<this.n)return(T)this.element[i]; //返回数组元素引用的对象,传递对象引用// return this.element[i]; //编译错,Object对象不能返回T对象return null;}public void set(int i, Tx){ //设置第i个元素值为xi f (x==null)throw new NullPointerException("x==null"); //抛出空对象异常if (i>=0 && i<this.n)this.element[i] = x;else throw newng.IndexOutOfBoundsException(i+"");//抛出序号越界异常}public int insert(int i, Tx){ //插入x作为第i个元素if (x==null)throw new NullPointerException("x==null"); //抛出空对象异常if (i<0) i=0; //插入位置i容错,插入在最前if (i>this.n) i=this.n; //插入在最后Object[] source =this.element; //数组变量引用赋值,source也引用element数组if(this.n==element.length) //若数组满,则扩充顺序表的数组容量{this.element = newObject[source.length*2]; //重新申请一个容量更大的数组for (int j=0; j<i; j++) //复制当前数组前i-1个元素this.element[j] = source[j];}for (int j=this.n-1; j>=i;j--) //从i开始至表尾的元素向后移动,次序从后向前this.element[j+1] = source[j];this.element[i] = x;this.n++;return i; //返回x序号}public int append(Tx){ //在线性表最后插入x元素return this.insert(this.n, x);}public T remove(int i){//删除第i个元素并返回被删除对象if (this.n>0 && i>=0 &&i<this.n){T old =(T)this.element[i]; //old中存储被删除元素for (int j=i;j<this.n-1; j++)this.element[j] = this.element[j+1]; //元素前移一个位置this.element[this.n-1]=null; //设置数组元素对象为空,释放原引用实例this.n--;return old; //返回old局部变量引用的对象,传递对象引用 }return null;}public void removeAll(){//删除线性表所有元素this.n=0;}public int search(Tkey){ //查找,返回首次出现的关键字为key的元素的位System.out.print(this.getClass().g etName()+".indexOf("+key+"),");for(int i=0; i<this.n; i++) {if(key.equals(this.element[i])) //执行T类的equals(Object)方法,运行时多态return i;}return -1;}public String toString(){Stringstr=this.getClass().getName()+"("; //返回类名if (this.n>0)str +=this.element[0].toString(); //执行T类的toString()方法,运行时多态for (int i=1; i<this.n; i++) str += ","+this.element[i].toString(); //执行T类的toString()方法,运行时多态return str+") ";}public static void main (String args[]){SeqList<Integer> list=new SeqList<Integer>(20);Integervalues[]={10,1,2,3,4,5,6,7,8,9};SeqList<Integer> list1=new SeqList<Integer>(values);System.out.print("输出顺序表:");System.out.println(list1.toString( ));System.out.println("顺序表List是否为空"+list.isEmpty()+",List1是否为空"+list1.isEmpty());System.out.println("list的长度"+list.length()+",list1的长度"+list1.length());System.out.println("返回list1的第7个元素是:"+list1.get(6));System.out.println("重新设置第5个元素为19:");list1.set(4, 19);list1.insert(2, 100);list1.append(20);System.out.println("删除8:"+list1.remove(8));System.out.print("修改后的顺序表:");System.out.println(list1.toString( ));list1.removeAll();System.out.println("删除后的顺序表:"+list1.toString()); //为空System.out.println("寻找元素50:"+list1.search(50));}}(2)a)package ex1;public class Del {public Del(int i,int k){Stringvalues[]={"A","b","C","d","e","f", "g","h"};int n =values.length;for(int j=0;j<n;j++){System.out.print(values[j]+" ");}System.out.println();for(int j=i+k;j<n;j++){values[j-k]=values[j];}n=n-k;for(int j=0;j<n;j++){System.out.print(values[j]+ " " );}System.out.println();}public static void main(String args[]){new Del(2,3);}}b)package ex1;public class Del2 {public Del2(int i,int k){S tringvalues[]={"A","x","y","y","b","c", "h"};SeqList<String> list=new SeqList<String>(values);System.out.println(list.toString() );for(int j=1;j<=k;j++){ list.remove(i);}System.out.println(list.toString() );}public static void main(String args[]){n ew Del2(2,3);}}c)package ex1;public class Merge {public Merge(){Integer values1[]={1,3,5,11};SeqList<Integer> list1=new SeqList<Integer>(values1);Integervalues2[]={2,4,5,22,23};SeqList<Integer> list2=new SeqList<Integer>(values2);SeqList<Integer> list3=new SeqList<Integer>();int i=0,j=0;while(i<list1.length()&&j<list2.le ngth()){if(list1.get(i)<list2.get(j)){list3.append(list1.get(i));i++;}else{list3.append(list2.get(j));j++;}}while(i<list1.length()){list3.append(list1.get(i));i++;}while(j<list2.length()){list3.append(list2.get(j)) ;j++;}System.out.println(list1.toString( ));System.out.println(list2.toString( ));System.out.println(list3.toString( ));}public static void main(String args[]){new Merge();}}d)package test;import ex1.SeqList;public class Intersection {public Intersection(){Integervalues1[]={1,3,5,11,12,13,22,23,50 };SeqList<Integer> list1=new SeqList<Integer>(values1);Integervalues2[]={2,4,5,12,19,20,22,23,};SeqList<Integer> list2=new SeqList<Integer>(values2);SeqList<Integer> list3=new SeqList<Integer>();int i=0,j=0;while(i<list1.length()&&j<list2.le ngth()){if(list1.get(i)<list2.get(j)){i++;}elseif(list1.get(i)>list2.get(j)){j++;}else{ list3.append(list1.get(i));i++;j++;}}System.out.println(list1.toString( ));System.out.println(list2.toString( ));System.out.println(list3.toString( ));}public static voidmain(String args[]){new Intersection();}}3.(1)package ex1;public class Josephus {public Josephus(int n, int k, int m){System.out.println("Josephus("+n+" ,"+k+","+m+"),");SeqList<String> list = new SeqList<String>(n);//创建顺序表实例,元素类型是数字字符,只能排到n=9,否则达不到效果for (int i=0; i<n; i++)list.append((char)('1'+i)+""); //顺序表尾插入,O(1)//System.out.println(list.toString()); //输出顺序表的描述字符串,O(n)int i = k; //计数起始位置while (list.length()>1) //多于一个元素时循环,计数O(1){i = (i+m-1) %list.length(); //按循环方式对顺序表进行遍历,圆桌循环System.out.print("出列"+list.remove(i).toString()+",");//删除i位置对象,O(n)//System.out.println(list.toString() );}System.out.println("出列"+list.get(0).toString());//get(0)获得元素,O(1)}public static void main(String args[]){new Josephus(9,1,3);}}(2)package test;import ex1.SeqList;public class JosephusA {public JosephusA(int n, int k, int m){System.out.println("Josephus("+n+" ,"+k+","+m+"),");SeqList<Integer> list = new SeqList<Integer>(n);//创建顺序表实例,元素类型是数字字符,只能排到n=9,否则达不到效果for (int i=0; i<n; i++)list.append(i); //顺序表尾插入,O(1)//System.out.println(list.toString()); //输出顺序表的描述字符串,O(n)int i = k; //计数起始位置while (list.length()>1) //多于一个元素时循环,计数O(1){i = (i+m-1) %list.length(); //按循环方式对顺序表进行遍历,圆桌循环System.out.print("出列"+list.remove(i).toString()+",");//删除i位置对象,O(n)//System.out.println(list.toString());}System.out.println("出列"+list.get(0).toString());//get(0)获得元素,O(1)}public static voidmain(String args[]){new JosephusA(15,2,9);}}第二部分:(4)、package ex2;public class Node<T> {public T data; //数据域public Node<T> next; //地址域,后继结点//构造结点public Node(T data,Node<T> next){this.data =data;this.next=next;}//构造空结点public Node(){this(null,null);}//描述字符串public String toString(){return this.data.toString();}}package ex2;public class SinglyList<T> {public Node<T>head;//构造空单链表public SinglyList(){head=new Node<T>();}//构造单链表,由values数组数组提供元素public SinglyList(T[] values){this();Node<T>rear=this.head;for(int i=0;i<values.length ;i++){rear.next=newNode<T>(values[i],null);rear=rear.next;}}public boolean isEmpty() //判断线性表是否空{return this.head.next ==null;}public T get(int i) //返回第i(i≥0)个元素{N ode<T>p=head.next ;f or(int j=0;p!=null&&j<i;j++)p=p.next;r eturn (p!=null&&i>=0) ?p.data:null;}public void set(int i, T x) //设置第i个元素值为x{i f(x==null)throw newNullPointerException("x==null"); //抛出空对象异常N ode<T>p=this.head.next; //0f or(int j=0;p!=null&&j<i;j++)//遍历寻找第i个结点(p指向)p=p.next;i f(i>0&&p!=null)p.data=x;}public int size() //返回线性表长度{int i=0;for(Node<T>p=this.head.next;p!=null;p=p.next)i++;r eturn i;}public Node<T> insert(int i, T x) //插入x作为第i个元素{i f(x==null)throw newNullPointerException("x=null");N ode<T>front=this.head ; //指定头结点f or(intj=0;front.next!=null&&j<i;j++)front=front.next; //以此循环找i-1f ront.next=newNode<T>(x,front.next );r eturn front.next;}public Node<T> insert(T x){ if (x==null)throw newNullPointerException("x==null");//抛出空对象异常Node<T> front=this.head; //front指向头结点for (; front.next!=null;) //寻找第i-1个或最后一个结点(front指向)front = front.next;front.next = new Node<T>(x,front.next); //在front之后插入值为x结点,包括头插入、中间/尾插入return front.next;}public T remove(int i) //删除第i个元素并返回被删除对象{N ode<T>p=this.head; //让p指向头结点f or(int j=0;j<i&&p.next!=null;j++)p=p.next;if(p.next!=null){T old=p.next.data ;p.next=p.next.next;return old;}r eturn null;}public void removeAll() //删除线性表所有元素{this.head.next=null; //让头结点直接为空}public Node<T> search(T key) //查找,返回首次出现的关键字为key元素{f or(Node<T> p=this.head;p.next!=null;p=p.next)if( key.equals(p.data))return p;r eturn null;}public String toString() //返回顺序表所有元素的描述字符串,形式为“(,)”{Stringstr=this.getClass().getName()+"("; //返回类名for (Node<T> p=this.head.next;p!=null; p=p.next)//p遍历单链表{ str += p.data.toString();if (p.next!=null)str += ",";//不是最后一个结点时,加分隔符}return str+")";}}(5)、package ex2;public class SortedSinglyList<T extends Comparable <? super T>> extends SinglyList<T>{//构造空排序单链表public SortedSinglyList(){super(); //默认调用父类构造方法SinglyList()}publicSortedSinglyList(SinglyList<T> list){super(); //构造空单链表for (Node<T> p=list.head.next; p!=null; p=p.next)//直接插入排序,每趟插入1个元素this.insert(p.data); //排序单链表按值插入}//构造,将values数组中的所有对象按值插入public SortedSinglyList(T values[]) {super();for(int i=0;i<values.length;i++)this.insert(values[i]);}public void set(int i, T x) //设置第i个元素值为x{throw new UnsupportedOperationException("set(int i, T x)"); //不支持父类方法,覆盖并抛出异常}public Node<T> insert(int i, T x) //插入x作为第i个元素{throw new UnsupportedOperationException("set(int i, T x)"); //不支持父类方法,覆盖并抛出异常}public Node<T> insert(T x)//在线性表最后插入x元素{Node<T>p=this.head;for(;p.next!=null&&pareTo(x)>0;)p=p.next;p.next = new Node<T>(x, p.next);return p.next;}public Node<T> search(T key)//查找,返回首次出现的关键字为key元素{for (Node<T>p=this.head;p.next!=null&&pareT o(p.data)<=0;p=p.next)if(pareTo(p.next.data)==0) return p;return null;}(6)、e、package ex2;public class Del1 {public Del1(int i,int k){Integer[] values={1,5,6,10,13};SinglyList<Integer> list= new SinglyList<Integer>(values);System.out.println( list.toString()) ;for(int j=0;j<k ;j++)list.remove(i);System.out.println("删除后:"+list.toString());}public static void main(String[] args){new Del1(2,2);}}f、package ex2;public class Del2 {public Del2(int mink,int maxk){Integer[] values={1,3,9,17,34};SortedSinglyList<Integer> list = new SortedSinglyList<Integer>(values);System.out.println(list.toString());Node<Integer> p=list.head;int j=0;while(p.next!=null &&p.next.data<=mink){p=p.next;j++;}while(p.next!=null&&p.next.data<maxk){list.remove(j);}System.out.println("list="+list.toSt ring());}public static void main(String args[]) {new Del2(2,18);}}g、package ex2;public class Meger{public Meger(){Integer[] values1={1,2,5,7,9}; SortedSinglyList<Integer> val1=new SortedSinglyList<Integer>(values1); Integer[] values2= {1,0,5,8,9}; SortedSinglyList<Integer> val2=new SortedSinglyList<Integer>(values2); SortedSinglyList<Integer> val=new SortedSinglyList<Integer>();int i=0;int j = 0;while(i<val1.size()&&j<val2.size()) {if(val1.get(i)<=val2.get(j)){val.insert(val1.get(i));if(val1.get(i)==val2.get(j))j++;i++;}else{val.insert(val2.get(j));j++;}}while(i<val1.size()){val.insert(val2.get(i));i++;}while(j<val2.size()){val.insert(val2.get(j));j++;}System.out.println(val1.toString()); System.out.println(val2.toString()); System.out.println(val.toString());}public static void main(String args[]) {new Meger();}}(7)、package Poly;public interface Subible<T> //可相加接口,T表示数据元素的数据类型{public void sub(T t);。