数据结构(Java版)-线性表的实现与应用完整版

合集下载

数据结构线性表的基本操作及应用实验报告

数据结构线性表的基本操作及应用实验报告

实验日期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、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。

数据结构第二章:线性表

数据结构第二章:线性表
实现逻辑上相邻—物理地址相邻 实现逻辑上相邻— 实现随机存取 实现随机存取
实现:可用C 实现:可用C语言的一维数组实现
6
V数组下标 0 1
内存 a1 a2
元素序号 1 2
typedef int DATATYPE; #define M 1000 DATATYPE data[M]; 例 typedef struct card { int num; char name[20]; char author[10]; char publisher[30]; float price; }DATATYPE; DATATYPE library[M];
4
{加工型操作 加工型操作} 加工型操作
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, &e ) 初始条件:线性表L已存在,1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值同 e 的值 ListInsert( &L, i, e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。 操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。 ListDelete( &L, i, &e ) 初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。 操作结果:删除 L 的第 i 个元素,并用 e 返回其值,L 的长度减1。 }ADT LIST
3
PriorElem( PriorElem L, cur_e, &pre_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回 它的前驱,否则操作失败,pre_e 无定义。 NextElem( NextElem L, cur_e, &next_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返 回它的后继,否则操作失败,next_e 无定义。 GetElem( GetElem L, i, &e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)。 操作结果:用 e 返回 L 中第 i 个元素的值。 LocateElem( LocateElem L, e, compare( ) ) 初始条件:线性表 L 已存在,compare( ) 是元素判定函数。 操作结果:返回 L 中第1个与 e 满足关系 compare( ) 的元 素的位序。若这样的元素不存在,则返回值为0。 ListTraverse(L, visit( )) ListTraverse 初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。 操作结果:依次对 L 的每个元素调用函数 visit( )。 一旦 visit( ) 失败,则操作失败。

数据结构_java实现线性表的部分操作

数据结构_java实现线性表的部分操作

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)判断线性表是否已满。

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

数据结构(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);。

相关文档
最新文档