版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、河南城建学院计算机科学与工程学院数据结构实验报告实验名称:_实验一 线性表操作 成绩:_ _专业班级:_ 信管2班 _ 姓名:_张凯迪_ 学号:_083215217_ 实验日期 : 2016 年 4 月 27 日一、实验目的1掌握用C+/C语言调试程序的基本方法。2掌握线性表的基本运算,如插入、删除等。二、实验内容线性表在顺序、链式存储结构上的插入元素,删除元素运算。三、实验要求1用C+/C完成算法设计和程序设计并上机调试通过。2撰写实验报告,提供实验结果和数据。3分
2、析算法,并简要给出算法设计小结和心得。四、程序实现源程序清单五、写出输入数据及运行结果、算法分析上述程序在Visual C+ 6.0环境下加以实现。经过多次测试,程序运行正确。例如:输入,运行结果如图所示,图中显示了(一)顺序表的基本操作源代码#include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_S
3、IZE 100#define LISTINCREMENT 10typedef struct /结构体ElemType *elem;int length;int listsize;SqList;SqList Lx;Status InitList_Sq(SqList &L) /分配空间 L.elem=new ElemTypeLIST_INIT_SIZE; if(!L.elem)exit(OVERFLOW); L.length =0; L.listsize=LIST_INIT_SIZE; return OK;Status ListInsert(SqList &L,int i,Elem
4、Type e) /插入新元素 int *q,*p;ElemType *newbase;if(i<1 | i>L.length+1) return ERROR;if(L.length>=L.listsize) newbase=new ElemTypeL.listsize+LISTINCREMENT; if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; q=&(L.elemi-1); for (p=&(L.elemL.length-1);p>=q;-p) *(p+1)
5、=*p; *q=e; +L.length; return OK;Status Listlength(SqList L) /长度 int *p=L.elem; /判断线形表是否存在while(p) return (L.length); Status GetElem(SqList L, int i,ElemType &e) /取元素 if(i<1 | i>L.length)return ERROR;else e=L.elemi-1;return e;void MergeList(SqList La,SqList Lb,SqList &Lc) /合并 ElemType a
6、i,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while(i<=La_len)&&(j<=Lb_len) GetElem(La,i,ai);GetElem(Lb,j,bj); if(ai<=bj) ListInsert(Lc,+k,ai);+i; else ListInsert(Lc,+k,bj);+j; while(i<=La_len) GetElem(La,i+,ai);ListInsert(Lc,+
7、k,ai);while(j<=Lb_len) GetElem(Lb,j+,bj);ListInsert(Lc,+k,bj);void show(SqList L,int i) /显示 int j;ElemType k; cout<<"顺序表显示如下:"<<endl; for(j=0;j<i-1;j+) k=L.elemj; cout<<k<<"->" if(j=i-1 && i>0) k=L.elemj; cout<<k; cout<<endl
8、;void create(SqList &L,int n) /输入元素 int e;for(int i=0;i<n;i+) cin>>e;L.elemi=e;L.length=i+1; Status ListDelete_Sq(SqList &L,int i,ElemType &e) /删除 ElemType *p, *q;if(i<1 | i>L.length) return ERROR;p=&(L.elemi-1);e=*p;q=L.elem+L.length-1;for(+p;p<=q;+p) *(p-1)=*p;-L.
9、length;return OK;Status Listxiugei(SqList &L,int i,ElemType &e) /修改 if(i<1 | i>L.length)return ERROR; else L.elemi-1=e; return OK; void shuru(SqList &L1) /顺序表的创建 int a;InitList_Sq(L1);cout<<"请输入顺序表的长度:"cin>>a;cout<<"请输入顺序表的元素(共"<<a<<
10、;"个)"<<endl; create(L1,a); show(L1,a);void chaxun(SqList &L1) /取第i个位置的元素 int j;ElemType e1;cout<<"请选择所要取出元素的位置:"cin>>j; while(j<0|j>Listlength(L1) cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:" cin>>j; GetEle
11、m(L1,j,e1);cout<<"取出的元素为:"<<e1<<endl;void xiugai(SqList &L1) /修改第i个位置的元素 int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要修改元素的位置:"cin>>j;while(j<0|j>Listlength(L1) cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要修改元素的
12、位置:" cin>>j; cout<<"要修改成的元素:"cin>>e1;Listxiugei(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a);void shanchu(SqList &L1) /删除顺序表里的元素 int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:"cin>>j;while(j<0|j>Listlen
13、gth(L1) cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:" cin>>j; ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a-1);void charu(SqList &L1) /插入元素到顺序表里 int a; int j; ElemType e1;a=L1.length;cout<<"请选择所要插入元素的位置:&qu
14、ot;cin>>j;while(j<0|j>Listlength(L1) cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:" cin>>j; cout<<"要插入的元素:"cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a+1);void hebing(SqList &L3)
15、 /合并两个顺序表 SqList L1,L2; int a,b; InitList_Sq(L1); InitList_Sq(L2); cout<<"请输入第一个有序表的长度:" cin>>a; cout<<"请输入第一个有序表的元素(共"<<a<<"个)"<<endl; create(L1,a); show(L1,a); cout<<"请输入第二个有序表的长度:" cin>>b; cout<<"请输
16、入第二个有序表的元素(共"<<b<<"个)"<<endl; create(L2,b); show(L2,b); MergeList(L1,L2,L3); cout<<"合并后的有序表如下:" show(L3,a+b);void main() /主菜单 int choice; for(;) cout<<" 顺序表的基本操作 "<<endl; cout<<" 1.顺序表的创建"<<endl; cout<<
17、;" 2.顺序表的显示"<<endl; cout<<" 3.顺序表的长度"<<endl; cout<<" 4.取第i个位置的元素"<<endl; cout<<" 5.修改第i个位置的元素"<<endl; cout<<" 6.插入元素到顺序表里"<<endl; cout<<" 7.删除顺序表里的元素"<<endl; cout<<&quo
18、t; 8.合并两个顺序表"<<endl; cout<<" 9.退出系统"<<endl; cout<<"请选择:" cin>>choice; switch(choice) case 1: shuru(Lx);break; case 2: show(Lx,Lx.length);break; case 3: cout<<"顺序表的长度:"<<Listlength(Lx)<<endl;break; case 4: chaxun(Lx);b
19、reak; case 5: xiugai(Lx);break; case 6: charu(Lx);break; case 7: shanchu(Lx);break; case 8: hebing(Lx);break; case 9: cout<<"退出系统!"<<endl;exit(0);break; default : cout<<"输入有误,请重新选择"<<endl;break; 运行结果、顺序表得创建显示如下图2-1顺序表的插入如下2-2顺序表的删除如下2-3(二)链式表的基本操作源代码#inclu
20、de<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode /存储结构 ElemType data; struct LNode *next;LNode,*LinkList;void CreateList(LinkList &L,int n) /尾插法创建单链表 LinkList p; L=new LNo
21、de; L->next=NULL; /建立一个带头结点的单链表 LinkList q=L; /使q指向表尾 for(int i=1;i<=n;i+) p=new LNode; cin>>p->data; p->next=NULL; q->next=p; q=p; Status GetElem(LinkList L,int i,ElemType &e)/取第i个元素 LinkList p=L->next; int j=1; while(p&&j<i) p=p->next; +j; if(!p|j>i) re
22、turn error; /第i个元素不存在 e=p->data; return ok;Status LinkInsert(LinkList &L,int i,ElemType e) /插入 LinkList p=L; int j=0; while(p&&j<i-1) p=p->next; +j; /寻找第i-1个结点 if(!p|j>i-1) return error; /i小于1或者大于表长加1 LinkList s=new LNode; /生成新结点 s->data=e; s->next=p->next; /插入L中 p-&
23、gt;next=s; return ok; Status ListDelete(LinkList &L,int i,ElemType &e) / 删除 LinkList p=L; LinkList q; int j=0; while(p->next&&j<i-1) /寻找第i个结点,并令p指向其前驱 p=p->next; +j; if(!(p->next)|j>i-1) return error; /删除位置不合理 q=p->next; p->next=q->next; /删除并释放结点 e=q->data;
24、 delete(q); return ok;void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) /合并两个顺序链表LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb) if(pa->data<=pb->data) pc->next=pa; pc=pa; pa=pa->next; else pc->next=pb; pc=pb; pb=pb->next; pc->n
25、ext=pa?pa:pb; delete(Lb); void show(LinkList L) /显示 LinkList p; p=L->next; while(p) cout<<p->data<<"->" p=p->next; cout<<endl;int Length(LinkList L,int i) /表长 i=0; LinkList p=L->next; while(p) +i; p=p->next; return i; void xiugai(LinkList L) /修改 int i,j=
26、1; ElemType k; ElemType e,m; LinkList p=L->next; cout<<"请输入要修改的元素位置(0<i<length):" cin>>i; GetElem(L,i,e); cout<<"该位置的元素:"<<e<<endl; cout<<"修改后的元素值:" cin>>k; while(p&&j<i) p=p->next; +j; m=p->data; p->
27、;data=k; cout<<"修改后的单链表显示如下:"<<endl; show(L); void hebing() /合并两个单链表 int a,b; LinkList La,Lb,Lc; cout<<"请输入第一个有序链表的长度:"<<endl; cin>>a; cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl; CreateList(La,a); show(La); co
28、ut<<"请输入第二个有序链表的长度:"<<endl; cin>>b; cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl; CreateList(Lb,b); show (Lb); MergeList(La,Lb,Lc); cout<<"合并后的有序链表如下:"<<endl; show(Lc);void main() /主函数 int select; int x; ElemTyp
29、e y; LinkList list; for(;) cout<<" 单链表的基本操作"<<endl; cout<<" 1.单链表的创建"<<endl; cout<<" 2.单链表的显示"<<endl; cout<<" 3.单链表的长度"<<endl; cout<<" 4.取第i个位置的元素"<<endl; cout<<" 5.修改第i个位置的元素&quo
30、t;<<endl; cout<<" 6.插入元素到单链表里"<<endl; cout<<" 7.删除单链表里的元素"<<endl; cout<<" 8.合并两个单链表"<<endl; cout<<" 9.退出系统"<<endl; cout<<"请选择:" cin>>select; switch(select) case 1:cout<<"请输入
31、单链表的长度:"<<endl; cin>>x; cout<<"请输入"<<x<<"个元素"<<endl; CreateList(list,x); break; case 2: cout<<"单链表显示如下:"<<endl; show(list); break; case 3: int s; cout<<"单链表的长度为:"<<Length(list,s)<<endl; bre
32、ak; case 4: cout<<"请选择所要取出元素的位置:" cin>>x; while(x<0|x>Length(list,s) cout<<"输入有误,请重新输入"<<endl; cout<<"请选择所要取出元素的位置:" cin>>x; GetElem(list,x,y); cout<<"该位置的元素为:"<<y<<endl; break; case 5: xiugai(list); break; case 6: cout<<"请选择要插入的位置:" cin>>x; while(x<0|x>Length(list,s) cout<<"输入有误,请重新输入"<<endl;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年项目利润分配协议
- 2024年采沙场工人劳动合同2篇
- 2024幼儿园幼儿教育项目合作协议3篇
- 2024年环保要求土建工程合同示范文本3篇
- 2025年度数字经济股权优化与产业生态构建协议3篇
- 2024年酒类产品原料供应合同
- 2024版区块链技术应用合同
- 2024版租赁投资回报保证协议3篇
- 2024年铁路货运运输工程居间服务协议3篇
- 2024年绿色施工环保合同:建设工程版
- (新版)焊工(初级)理论知识考试200题及答案
- 满堂脚手架计算书
- MRAS系统标准用户手册
- HAPS系统实现协同仿真验证-基础电子
- 欧洲地下车库诱导通风系统设计手册
- 现代文答题技巧课件2023年中考语文二轮复习
- YS/T 673-2013还原钴粉
- TY/T 3001-2006中国青少年儿童 手腕骨成熟度及评价方法
- GB/T 32545-2016铁矿石产品等级的划分
- 福建省地方标准《先张法预应力混凝土管桩基础技术规程》DBJ13-2023
- 危险作业监护人员培训
评论
0/150
提交评论