线性表的顺序表示与链式表示.docx
- 文档编号:3460684
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:20
- 大小:164.07KB
线性表的顺序表示与链式表示.docx
《线性表的顺序表示与链式表示.docx》由会员分享,可在线阅读,更多相关《线性表的顺序表示与链式表示.docx(20页珍藏版)》请在冰豆网上搜索。
线性表的顺序表示与链式表示
数据结构课程实验报告
课程名称
数据结构
班级
计算123
实验日期
2014年4月2日
姓名
学号
实验成绩
实验名称
线性表的顺序表示与链式表示
实
验
目
的
及
要
求
【实验目的】
1.加深理解线性表的顺序表示与链式表示的意义和区别,掌握用它们表示时各基本操作的设计与实现。
2.学会定义线性表的顺序存储类型和链式存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
3.掌握线性表的基本操作(初始化、建立、插入、删除、遍历等)。
4.掌握对多函数程序的输入、编辑、调试和运行过程。
5.进一步熟练C语言的使用,特别是指针和链表的使用。
6.能在实际应用背景下恰当选择顺序存储和链式存储。
【实验要求】
1.预习C语言中的结构的定义和基本操作方法
2.对线性表的每个基本操作用单独的函数实现
3.编写完整程序完成下面的实验内容并上机运行
4.整理并上交实验报告
实
验
环
境
硬件平台:
普通的PC机
软件平台:
Windows7操作系统
编程环境:
VisualC++6.0
实
验
内
容
1.分别建立包含10个数据元素的顺序线性表和链式线性表;
2.从键盘输入一个数据元素和插入位置k,将元素插入到线性表中第k(包含0号位置)个位置;
3.从键盘输入一个数据元素关键字或位置k(包含1号位置),从线性表中删除相应数据元素;
4.能完成查找功能;
5.给出程序及插入、删除前和插入、删除后线性表结果。
算
法
描
述
及
实
验
步
骤
算法描述:
1.链式线性表:
定义结构体:
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
构造函数——功能:
查找第i个元素并返回
voidGetElem(LinkListL,inti,ElemType*e)
{
LNode*p;
intj=1;
p=L->next;
while(p&&j
{
p=p->next;++j;
}
if(!
p||j>i)printf("不存在,查找错误\n");
else
*e=p->data;
}
构造函数——功能:
插入元素
voidListInsert_L(LinkList*L,inti,ElemTypee)
{
LinkListp=*L,s=NULL;
intj=0;
while(p&&j
if(!
p||j>i-1)printf("插入位置错误\n");
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
构造函数——功能:
删除元素
voidListDelet_L(LinkList*L,inti,ElemType*e)
{
LNode*p=*L,*q=NULL;
intj=0;
while(p->next&&j { p=p->next;++j; } if(! (p->next)||j>i-1)printf("删除位置错误"); q=p->next;p->next=q->next; *e=q->data; free(q); } 构造函数——功能: 建立链表输入n个ElemType类型的数 voidCreatList(LinkList*L,intn) { LinkListp=NULL,q=NULL; inti; ElemTypem; (*L)=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; q=p; scanf("%d",&m); p->data=m; (*L)->next=p; for(i=1;i { p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&m); p->data=m; q->next=p; p->next=NULL; q=p; } } 主函数: intmain() { LinkListL=NULL; inti,p=1,m; ElemTypee; printf("请输入15个元素: "); CreatList(&L,15); printf("输出表中的15个元素: "); DisList(L); while(p) { printf("1.插入元素\n""2.删除元素\n""3.查找元素\n""4.显示链表\n""5.退出链表: \n"); scanf("%d",&m); switch(m) { case1: printf("请输入要插入的位置: "); scanf("%d",&i); printf("请输入要插入的元素值: "); scanf("%d",&e); ListInsert_L(&L,i,e);break; case2: printf("请输入要删除元素的位置: "); scanf("%d",&i);ListDelet_L(&L,i,&e);printf("需要删除的元素值为: %d\n",e);break; case3: printf("请输入需要查找的位置: "); scanf("%d",&i);GetElem(L,i,&e);printf("该位置的元素值为: %d\n",e);break; case4: printf("显示出链表的数为: ");DisList(L);break; case5: p=0;break; } } return0; } 2.顺序线性表: 定义结构体: typedefstruct { ElemType*elem; intlength; intlistsize; }SqList; 初始化线性表: StatusInitList_Sq(SqList*L) { L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(! L->elem)returnOVERFLOW;//存储分配失败 L->length=0;//空表长度为0 L->listsize=LIST_INIT_SIZE;//初始存储容量 returnOK; } 构造函数——功能: 向表中插入元素 StatusListInsert_Sq(SqList*L,inti,ElemTypee) { ElemType*q,*p,*newbase; 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)returnERROR; L->elem=newbase; L->listsize+=LISTINCREMENT; } q=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=q;p--)*(p+1)=*p; *q=e; ++L->length; returnOK; } 构造函数——功能: 删除表中的元素 StatusListDelete_Sq(SqList*L,inti,ElemType*e) { ElemType*p,*q; if(i<1||i>L->length+1)returnERROR; p=&(L->elem[i-1]); *e=*p; q=(L->elem+L->length-1); for(++p;p<=q;p++)*(p-1)=*p; --L->length; returnOK; } 构造函数——功能: 查找表中元素 intListFind(SqListL,intk) { returnL.elem[k-1]; } 主函数: intmain() { SqListLst; inti,j,n=15,a,k,p=1; ElemTypee; if(InitList_Sq(&Lst)==OK) { for(i=1;i<=n;i++) if(ListInsert_Sq(&Lst,i,i)! =OK)break; printf("线性表中的元素为: "); for(i=0;i printf("%d",Lst.elem[i]); printf("\n"); while(p) { printf("1.插入元素\n""2.删除元素\n""3.查找元素\n""4.显示顺序表\n""5.退出\n""请选择操作: \n"); scanf("%d",&j); switch(j) { case1: printf("请输入要插入的元素: "); scanf("%d",&a); printf("请输入要插入的位置: "); scanf("%d",&k); ListInsert_Sq(&Lst,k,a);break; case2: printf("请输入要删除元素的位置: "); scanf("%d",&k); ListDelete_Sq(&Lst,k,&e);break; case3: printf("请输入查找元素的位置: "); scanf("%d",&k); printf("位置为%d的元素为%d\n",k,ListFind(Lst,k)); case4: for(i=0;i printf("%d",Lst.elem[i]); printf("\n");break; case5: p=0;break; } } } return0; } 调 试 过 程 及 实 验 结 果 1.创建链表,插入,删除,功能。 2.链表的查找,显示,退出,功能。 3.顺序表的创建与插入功能。 4.顺序表的删除,查找,功能。 5.顺序表的显示,退出,功能。 总 结 通过这次实验,我更好的掌握了顺序表的链式存储的基本方法,比如链表的初始化,查找,插入,删除等基本函数的调用,以及在链表中对于指针传递地址的应用。 附 录 1.链式线性表的源程序: /*链式线性表*/ #include #include #defineERROR0 #defineOK1 #defineOVERFLOW-1 typedefintElemType; typedefstructLNode { ElemTypedata; structLNode*next; }LNode,*LinkList; voidGetElem(LinkListL,inti,ElemType*e)//查找第i个元素并返回 { LNode*p; intj=1; p=L->next; while(p&&j { p=p->next;++j; } if(! p||j>i)printf("不存在,查找错误\n"); else *e=p->data; } voidListInsert_L(LinkList*L,inti,ElemTypee)//插入元素 { LinkListp=*L,s=NULL; intj=0; while(p&&j if(! p||j>i-1)printf("插入位置错误\n"); s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } voidListDelet_L(LinkList*L,inti,ElemType*e)//删除元素 { LNode*p=*L,*q=NULL; intj=0; while(p->next&&j { p=p->next;++j; } if(! (p->next)||j>i-1)printf("删除位置错误"); q=p->next;p->next=q->next; *e=q->data; free(q); } voidCreatList(LinkList*L,intn)//建立链表输入n个ElemType类型的数 { LinkListp=NULL,q=NULL; inti; ElemTypem; (*L)=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; q=p; scanf("%d",&m); p->data=m; (*L)->next=p; for(i=1;i { p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&m); p->data=m; q->next=p; p->next=NULL; q=p; } } voidDisList(LinkListL) { LinkListp=L->next; while(p) { printf("%d",p->data); p=p->next; } printf("\n"); } intmain() { LinkListL=NULL; inti,p=1,m; ElemTypee; printf("请输入15个元素: "); CreatList(&L,15); printf("输出表中的15个元素: "); DisList(L); while(p) { printf("1.插入元素\n""2.删除元素\n""3.查找元素\n""4.显示链表\n""5.退出链表: \n"); scanf("%d",&m); switch(m) { case1: printf("请输入要插入的位置: "); scanf("%d",&i); printf("请输入要插入的元素值: "); scanf("%d",&e); ListInsert_L(&L,i,e);break; case2: printf("请输入要删除元素的位置: "); scanf("%d",&i);ListDelet_L(&L,i,&e);printf("需要删除的元素值为: %d\n",e);break; case3: printf("请输入需要查找的位置: "); scanf("%d",&i);GetElem(L,i,&e);printf("该位置的元素值为: %d\n",e);break; case4: printf("显示出链表的数为: ");DisList(L);break; case5: p=0;break; } } return0; } 2.顺序线性表的源程序: /*顺序表线性表*/ #include #include #include #defineTURE1 #defineFAUSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 #defineLIST_INIT_SIZE15 #defineLISTINCREMENT4 typedefintStatus; typedefintElemType; typedefstruct { ElemType*elem; intlength; intlistsize; }SqList; StatusInitList_Sq(SqList*L)//初始化线性表 { L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(! L->elem)returnOVERFLOW;//存储分配失败 L->length=0;//空表长度为0 L->listsize=LIST_INIT_SIZE;//初始存储容量 returnOK; } StatusListInsert_Sq(SqList*L,inti,ElemTypee)//向表中插入元素 { ElemType*q,*p,*newbase; 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)returnERROR; L->elem=newbase; L->listsize+=LISTINCREMENT; } q=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=q;p--)*(p+1)=*p; *q=e; ++L->length; returnOK; } StatusListDelete_Sq(SqList*L,inti,ElemType*e)//删除表中的元素 { ElemType*p,*q; if(i<1||i>L->length+1)returnERROR; p=&(L->elem[i-1]); *e=*p; q=(L->elem+L->length-1); for(++p;p<=q;p++)*(p-1)=*p; --L->length; returnOK; } intListFind(SqListL,intk) { returnL.elem[k-1]; } intmain() { SqListLst; inti,j,n=15,a,k,p=1; ElemTypee; if(InitList_Sq(&Lst)==OK) { for(i=1;i<=n;i++) if(ListInsert_Sq(&Lst,i,i)! =OK)break; printf("线性表中的元素为: "); for(i=0;i printf("%d",Lst.elem[i]); printf("\n"); while(p) { printf("1.插入元素\n""2.删除元素\n""3.查找元素\n""4.显示顺序表\n""5.退出\n""请选择操作: \n"); scanf("%d",&j); switch(j) { case1: printf("请输入要插入的元素: "); scanf("%d",&a); printf("请输入要插入的位置: "); scanf("%d",&k); ListInsert_Sq(&Lst,k,a);break; case2: printf("请输入要删除元素的位置: "); scanf("%d",&k); ListDelete_Sq(&Lst,k,&e);break; case3: printf("请输入查找元素的位置: "); scanf("%d",&k); printf("位置为%d的元素为%d\n",k,ListFind(Lst,k)); case4: for(i=0;i printf("%d",Lst.elem[i]); printf("\n");break; case5: p=0;break; } } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 顺序 表示 链式