数据结构线性表实验报告.doc
- 文档编号:4730694
- 上传时间:2023-05-07
- 格式:DOC
- 页数:8
- 大小:64KB
数据结构线性表实验报告.doc
《数据结构线性表实验报告.doc》由会员分享,可在线阅读,更多相关《数据结构线性表实验报告.doc(8页珍藏版)》请在冰点文库上搜索。
实验报告
课程
数据结构
实验名称
实验一线性表
学号
姓名
实验日期:
实验一线性表
实验目的:
1.理解线性表的逻辑结构特性;
2.熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;
3.熟练掌握线性表的链表存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用;
4.掌握双向链表和循环链表的的描述方法,以及在该存储结构下的基本操作。
实验原理:
线性表顺序存储结构下的基本算法;
线性表链式存储结构下的基本算法;
实验内容:
2-21设计单循环链表,要求:
(1) 单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取消数据元素操作和判非空操作。
(2) 设计一个测试主函数,实际运行验证所设计单循环链表的正确性。
2-22.设计一个有序顺序表,要求:
(1) 有序顺序表的操作集合有如下操作:
初始化、求数据元素个数、插入、删除和取数据元素。
有序顺序表与顺序表的主要区别是:
有序顺序表中的数据元素按数据元素值非递减有序。
(2) 设计一个测试主函数,实际运行验证所设计有序顺序表的正确性。
(3) 设计合并函数ListMerge(L1,L2,L3),功能是把有序顺序表L1和L2中的数据元素合并到L3,要求L3中的数据元素依然保持有序。
并设计一个主函数,验证该合并函数的正确性。
程序代码:
2-21
(1)头文件LinList.h如下:
typedefstructnode
{
DataTypedata;
structnode*next;
}SLNode;
/*
(1)初始化ListInitiate(SLNode**head)*/
voidListInitiate(SLNode**head)
{/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit
(1);
(*head)->next=NULL;/*置结束标记NULL*/
}
/*
(2)求当前数据元素个数ListLength(SLNode*head)*/
intListLength(SLNode*head)
{
SLNode*p=head;
intsize=0;
while(p->next!
=head)
{
p=p->next;
size++;
}
returnsize;
}
/*(3)插入ListInsert(SLNode*head,inti,DataTypex)*/
/*在带头结点的单链表的第i(0<=i<=size)个结点前*/
/*插入一个存放数据元素x的结点。
插入成功时返回1,失败返回0*/
intListInsert(SLNode*head,inti,DataTypex)
{
SLNode*p,*q;
intj;
p=head;
j=-1;
while(p->next!
=head&&j /*最终让指针指向第i-1个结点*/ { p=p->next; j++; } if(j! =i-1) { printf("Theinsertedpositioniserror! "); return0; } /*生成新结点由指针q指示*/ if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit (1); q->data=x; q->next=p->next; p->next=q; return1; } /*(4)删除ListDelete(SLNode*head,inti,DataType*x)*/ /*删除带头结点的单链表head的第i(0<=i<=size)个结点前*/ /*被删除结点的数据元素域由x带回。 删除成功时返回1,失败返回0*/ intListDelete(SLNode*head,inti,DataType*x) { SLNode*p,*s; intj; p=head; j=-1; while(p->next! =head&&p->next->next! =head&&j /*最终让指针指向第i-1个结点*/ { p=p->next; j++; } if(j! =i-1) { printf("Thedeletedpositionofparameteriserror! "); return0; } s=p->next;/*指针s指指向ai结点*/ *x=s->data; p->next=p->next->next;/*删除*/ free(s);/*释放指针s所指结点的内存空间*/ return1; } /*(5)取数据元素ListGet(SLNode*head,inti,DataType*x)*/ intListGet(SLNode*head,inti,DataType*x) { SLNode*p; intj; p=head; j=-1; while(p->next! =head&&j { p=p->next; j++; } if(j! =i) { printf("Thegottenpositionofparameteriserror! "); return0; } *x=p->data; return1; } /*(6)撤销单链表Destroy(SLNode**head)*/ voidDestroy(SLNode**head) { SLNode*p,*p1; p=*head; while(p! =NULL) { p1=p; p=p->next; free(p1); } *head=NULL; } (2)测试主函数如下: #include #include #include typedefintDataType;/*定义DataType为int*/ #include"LinList.h"/*包含单链表的头文件*/ voidmain(void) { SLNode*head;/*定义头指针变量*/ inti,x; ListInitiate(&head);/*初始化*/ for(i=0;i<10;i++)/*插入10个数据元素*/ { if(ListInsert(head,i,i+1)==0) { printf("error! \n"); return; } } if(ListDelete(head,4,&x)==0)/*删除第四个数据元素*/ { printf("error! \n"); return; } for(i=0;i { if(ListGet(head,i,&x)==0)/*取数据元素*/ { printf("error! \n"); return; } else printf("%d",x);/*显示*/ } Destroy(&head);/*撤销单链表*/ } 2-22设计一个有序顺序表 头文件程序如下: #defineNULL0 typedefstruct { DataTypeList[MaxSize]; intsize; }SeqList; voidlistInitiate(SeqList*L)/*初始化顺序表L*/ { L->size=0;/*定义初始化数据元素个数*/ } intListLength(SeqListL) { returnL.size; } intListInsert(SeqList*L,inti,DataTypex) { intj; if(L->size>=MaxSize) { printf("顺序表已满无法插入! \n"); return0; } elseif(i<0||i>L->size) { printf("参数i不合法! \n"); return0; } else { for(j=L->size;j>i;j--) L->List[j]=L->List[j-1]; L->List[i]=x; L->size++; return1; } } intListDelete(SeqList*L,inti,DataType*x) { intj; if(L->size<=0) { printf("顺序表已空无数据元素可删! \n"); return0; } elseif(i<0||i>L->size-1) { printf("参数i不合法! \n"); return0; } else { *x=L->List[i]; for(j=i+1;j L->List[j-1]=L->List[j]; L->size--; return1; } } intListGet(SeqListL,inti,DataType*x) { if(i<0||i>L.size-1) { printf("参数i不合法! \n"); return0; } else { *x=L.List[i]; return1; } } /*测试主函数设计如下: */ #include #defineMaxSize100 typedefintDataType; #include"SeqList.h" intSLOrderInsert(SeqList*L,DataTypex) { intj; if(L->size>=MaxSize-1) { printf("顺序表已满无法插入! \n"); return0; } { for(j=L->size-1;j>0&&x L->list[j+1]=L->list[j]; L->list[j+1]=x; L->size++; return1; } } voidmain(void) { SeqListMyList; inta[]={1,2,4,5,6,8,9};/*数组a中的数据元素递增有序*/ inti,n=7; intx; ListInitiate(&MyList); for(i=0;i ListInitiate(&MyList); SLOrderInsert(&MyList,a[i]); for(i=0;i { ListGet(MyList,i,x); printf("%d",a[i]); } } 实验结果: (1)2-21运行结果如下: (2)2-22运行结果如下: 总结与思考 (1)在TC2的使用过程中遇到很多问题,路径问题总是导致错误。 有序顺序表的操作集合和线性表的操作集合类似。 (2)带头结点循环链表的操作实现与带头结点的单链表的操作实现方法相似,但也有差别主要在: 1、在初始化函数中,把语句(*head)->next=NULL改为(*head)->next=head。 2、在其它函数中,循环判定条件p->next! =NULL和p->next->next! =NULL中的NULL换成头指针head.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 线性 实验 报告