实验一线性表.docx
- 文档编号:10156529
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:30
- 大小:152.12KB
实验一线性表.docx
《实验一线性表.docx》由会员分享,可在线阅读,更多相关《实验一线性表.docx(30页珍藏版)》请在冰豆网上搜索。
实验一线性表
南昌大学实验报告
---
(1)线性表
学生姓名:
罗明学号:
6100411055专业班级:
计算机111班
实验类型:
■验证□综合□设计□创新实验日期:
2013/3/7实验成绩:
一、实验目的
1.掌握线性表的存储结构以及插入、删除、查找等基本操作
2.分别在顺序表和链表这两种存储结构下,通过编程实现这些基本操作
二、实验内容
1.构造一个空的线性表L
2.在线性表L的第i个元素之前插入新的元素e
3.删除线性表L中第i个元素,并用e返回其值
4.在线性表L中查找元素e,查找成功返回元素在表中的位置,否则返回0
5.合并两个线性表
三、实验要求
分别利用顺序表和链表两种存储结构实现线性表的初始化,并设计出在不同的存储结构中线性表的基本操作算法
四、实验环境
PC微机
Windows 操作系统
VisualC++6.0程序集成环境
五、程序代码
1.顺序表
//-------函数结果状态代码----------
//common.h
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
//-------线性表的动态分配顺序存储结构---------
//Sqlist.h
#defineLIST_INIT_SIZE10
#defineLISTINCREMENT2
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
//-------基本操作的函数原型说明--------
StatusInitList_Sq(SqList&L);
StatusListInsert_Sq(SqList&L,inti,ElemTypee);
StatusListDelete_Sq(SqList&L,inti,ElemType&e);
Statuscompare(ElemTypee1,ElemTypee2);
intLocateElem_Sq(SqList&L,ElemTypee,Status(*compare)(ElemType,ElemType));
voidMergeList_Sq(SqListLa,SqListLb,SqList&Lc);
//--------基本操作的实现-----------
//sqlist.cpp
#include
#include
#include
#include"common.h"
typedefintElemType;
#include"Sqlist.h"
StatusInitList_Sq(SqList&L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
//插入元素
StatusListInsert_Sq(SqList&L,inti,ElemTypee){
ElemType*newbase;
ElemType*p;
ElemType*q;
if(i<1||i>L.length+1)
returnERROR;
if(L.length>=L.listsize)
{newbase=(ElemType)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=L.elem+i-1;//q为插入位置
for(p=L.elem+L.length-1;p>=q;--p)
*(p+1)=*p;
*q=e;//插入e
++L.length;
returnOK;
}
//删除元素
StatusListDelete_Sq(SqList&L,inti,ElemType&e){
ElemType*p;
ElemType*q;
if((i<1)||(i>L.length))
returnERROR;
p=L.elem+i-1;//p为被删除元素的位置
e=*p;
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p){
*(p-1)=*p;
}
--L.length;
returnOK;
}
//查找元素
Statuscompare(ElemTypee1,ElemTypee2)
{returne1==e2?
1:
0;}
intLocateElem_Sq(SqList&L,ElemTypee,Status(*compare)(ElemType,ElemType)){
inti;
ElemType*p;
i=1;
p=L.elem;
while(i<=L.length&&!
(*compare)(*p++,e))
++i;
if(i<=L.length)
returni;
else
return0;
}
//顺序表的合并
voidMergeList_Sq(SqListLa,SqListLb,SqList&Lc){
//已知顺序线性表的元素按值非递减排列
ElemType*pa,*pb,*pc;
ElemType*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!
Lc.elem)
exit(OVERFLOW);
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last){
//归并两表
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
while(pa<=pa_last){
//插入La剩余的元素
*pc++=*pa++;
}
while(pb<=pb_last){
//插入Lb剩余的元素
*pc++=*pb++;
}
}
}
//--------主程序--------
//main.cpp
#include
#include
#include
#include"common.h"
typedefintElemType;
#include"Sqlist.h"
voidmain(){
inti,j,t,e;
SqListLa,Lb,Lc,L;
InitList_Sq(L);
InitList_Sq(La);//建立放插入元素的顺序表
InitList_Sq(Lb);//建立放删除元素后的顺序表
InitList_Sq(Lc);//建立量表合并后的新表
//插入元素
inta[10];
printf("输入10个不同的数:
");
for(j=0;j<10;j++)
{
scanf("%d",&a[j]);
}
printf("把从表头插入输入的数,表内元素为:
");
for(j=0;j<10;j++)
ListInsert_Sq(L,1,a[j]);
for(i=0;i ListInsert_Sq(La,1,L.elem[L.length-1-i]); printf("%3d",L.elem[i]); } printf("\n"); printf("线性表的长度为%d\n",L.length); printf("当前分配的存储容量为%d\n",L.listsize); //删除元素 printf("是否需要删除元素? 1.Yes2.No\n"); scanf("%d",&j); if(j==1){ printf("输入要删除第几个元素: "); scanf("%d",&i); ListDelete_Sq(L,i,t); for(j=0;j ListInsert_Sq(Lb,1,L.elem[L.length-1-j]); printf("删除第%d个元素%d后,结果为: ",i,t); for(j=0;j printf("%3d",Lb.elem[j]); printf("\n"); printf("线性表的长度为%d\n",Lb.length); printf("当前分配的存储容量为%d\n",Lb.listsize); } else exit(OVERFLOW); //查找元素 printf("需要查找元素? 1.Yes2.No\n"); scanf("%d",&j); if(j==1){ printf("输入要查找的元素: "); scanf("%d",&e); i=LocateElem_Sq(Lb,e,compare); if(i==0) printf("没有这个元素.\n"); else printf("已找到元素%d,是表中第%d个元素\n",e,i); } else exit(OVERFLOW); //顺序表的合并 printf("需要合并删除前和删除后的顺序表? 1.Yes2.No\n"); scanf("%d",&i); if(i==1){ MergeList_Sq(La,Lb,Lc); printf("合并后的新表: \n"); for(i=0;i printf("%3d",Lc.elem[i]); printf("\n"); } else exit(OVERFLOW); } 2.单链表 //-------函数结果状态代码---------- //common.h #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 typedefintStatus; //-------线性表的单链表存储结构--------- //Linklist.h typedefstructLNode { ElemTypedata; structLNode*next; }LNode,*LinkList; //-------基本操作的函数原型说明-------- voidCreateList(LinkList&L,intn); voidprint_list(LNode*L); StatusGetElem_L(LinkListL,inti,ElemType&e); StatusListDelete_L(LinkList&L,inti,ElemType&e); StatusListInsert_L(LinkList&L,inti,ElemTypee); voidMergeList_L(LinkList&La,LinkList&Lb,LinkList&Lc); StatusListLength(LinkListL); StatusConverseLink(LinkList&L); //--------基本操作的实现----------- //linklist.cpp #include #include #include #include"common.h" typedefintElemType; #include"Linklist.h" //创建链表 voidCreateList(LinkList&L,intn){ inti; LinkListp; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=n;i>0;--i){ p=(LinkList)malloc(sizeof(LNode));//生成新节点 scanf("%d",&p->data);//输入元素值 p->next=L->next;L->next=p;//插入到表头 } } //输出链表 voidprint_list(LNode*L){ LNode*p; for(p=L->next;p! =NULL;){ printf("%d",p->data); p=p->next; } printf("\n"); } //查找元素 StatusGetElem_L(LinkListL,inti,ElemType&e){ //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR LNode*p; intj;//j为计数器 p=L->next;//p指向第一个结点 j=1; while(p&&j p=p->next;++j; if(! p||j>i) returnERROR; e=p->data; returnOK; } //删除元素 StatusListDelete_L(LinkList&L,inti,ElemType&e){ //在带头结点的单链线性表L中,删除第i个元素,并用e返回其值 LinkListp; LNode*q; intj; p=L;j=0; while(p->next&&j //寻找第i个结点,并令p指向其前趋 p=p->next;++j; } if(! (p->next)||j>i-1) returnERROR;//删除位置不合理 q=p->next;p->next=q->next; e=q->data;free(q); returnOK; } //插入元素 StatusListInsert_L(LinkList&L,inti,ElemTypee){ //在带有结点的单链线性表中第i个位置之前插入元素e LinkLists; LNode*p; intj; p=L;j=0; while(p&&j //寻找第i-1个结点 p=p->next;++j; } if(! p||j>i-1) returnERROR; s=(LinkList)malloc(sizeof(LNode)); s->data=e;s->next=p->next;p->next=s;//插入L中 returnOK; } //合并两表 voidMergeList_L(LinkList&La,LinkList&Lb,LinkList&Lc){ LNode*pa; LNode*pb; LNode*pc; pa=La->next;pb=Lb->next; Lc=pc=La;//用La的头结点作为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; free(Lb); } //计算链表长度 StatusListLength(LinkListL){ inti=0; LinkListp=L->next; while(p){ i++; p=p->next; } returni; } //单链表的就地逆置 StatusConverseLink(LinkList&L){ LinkListp,q; p=L->next; L->next=NULL; while(p! =NULL){ q=p; p=p->next; q->next=L->next; L->next=q; } returnOK; } //--------主程序-------- //main.cpp #include #include #include #include"common.h" typedefintElemType; #include"Linklist.h" voidmain() { LinkListL; inti,n; ElemTypee; printf("创建一个单链表.请输入链表中的10个元素: "); CreateList(L,10); printf("创建的链表是: "); print_list(L); //查找元素 printf("\n需要查找元素吗? 1.Yes2.No\n"); scanf("%d",&n); if(n==1){ printf("要查找第几个元素? "); scanf("%d",&i); GetElem_L(L,i,e); if(GetElem_L(L,i,e)){ printf("找到所查元素%d",e); printf("需要删除该元素吗? 1.Yes2.No\n"); scanf("%d",&n); if(n==1){ //删除元素 ListDelete_L(L,i,e); printf("删除后的单链表为: "); print_list(L); printf("\n"); } } else printf("表中无该元素"); } //插入元素 printf("需要插入元素吗? 1.Yes2.No\n"); scanf("%d",&n); if(n==1){ printf("要在第几个位置前插入什么元素? "); scanf("%d,%d",&i,&e); if(ListInsert_L(L,i,e)){ printf("在表中第%d个位置前插入元素%d后,链表为: ",i,e); print_list(L); } else printf("无法插入该元素,输入有误."); } //合并两表 printf("输入两张表La和Lb,各含10个元素,并合并两表.\n"); LinkListLa,Lb,Lc; printf("La中元素: "); CreateList(La,10); printf("La: "); print_list(La); printf("Lb中元素: "); CreateList(Lb,10); printf("Lb: "); print_list(Lb); MergeList_L(La,Lb,Lc); printf("合并表La和Lb后,得到的新表Lc: "); print_list(Lc); //统计新表的元素 printf("元素的个数有%d个\n",ListLength(Lc)); //就地逆置单链表Lc ConverseLink(Lc); printf("就地逆置Lc: "); print_list(Lc); } 3.静态单链表 //-------函数结果状态代码---------- //common.h #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 typedefintStatus; //-------线性表的静态单链表存储结构--------- //SLinklist.h #defineMAXSIZE1000 typedefstruct { ElemTypedata; intcur; }component,SLinkList[MAXSIZE]; //-------基本操作的函数原型说明-------- voidInitSpace_SL(SLinkList&space); intMallov_SL(SLinkList&space); voidFree_SL(SLinkList&space,intk); intLocateElem_SL(SLinkListSS,ElemTypee); voiddifference(SLinkList&space,int&S); //--------基本操作的实现----------- //slinklist.cpp #include #include #include"common.h" typedefintElemType; #include"SLinklist.h" //初始化,第一个元素作为备用表表头,线性表表头存在数组之外,另行定义 voidInitSpace_SL(SLinkList&space){ //将一维数组space中各分量链成一个备用链表,space[0].cur为头指针 //"0"表示空指针 inti; for(i=0;i space[i].cur=i+1; space[MAXSIZE-1].cur=0; } } //分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验一 线性表 实验 线性