数据结构实验参考.docx
- 文档编号:29892511
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:60
- 大小:69.10KB
数据结构实验参考.docx
《数据结构实验参考.docx》由会员分享,可在线阅读,更多相关《数据结构实验参考.docx(60页珍藏版)》请在冰豆网上搜索。
数据结构实验参考
数据结构
实验一顺序表的基本操作
实验目的:
1.熟悉C语言上机环境,进一步掌握C语言结构特点
2.掌握顺序表的逻辑结构和定义
3.掌握顺序表的生成、插入、删除和查找等基本运算
实验要求:
1.完成算法设计和程序设计,并上机调试通过
2.完成实验报告,提供实验数据和结果
3.对插入和删除算法进行时间复杂度的估算
实验内容:
实现顺序表的基本操作,使得对于线性表(6,9,14,23,28,50),实现以下功能:
1.从键盘依次往顺序表中输入数据
2.在第3位插入数值10,输出顺序表
3.删除第4位数值,输出整个顺序表.
4.查找表中是否有数据24,有则返回其位置
5.输出线性表中第i个元素的值,位序i由用户通过键盘输入
请在实验中完成以下函数定义:
PSeqListInit_SeqList()//初始化顺序表
intLength_List(SeqListL)//求顺序表长
voidDisp_List(SeqListL)//输出顺序表
intLocate_List(SeqListL,ElemTypex)//在顺序表中检索查找x
intInsert_List(PSeqListPL,inti,ElemTypex)//向表中第i个元素前插入新元素x
intDelete_List(PSeqListPL,inti)//删除第i个元素
voidCreat_List(PSeqListPL)//向顺序表中输入数据
voidShowSelect();//显示用户提示界面
运行后,用户界面如下:
思考题:
1.函数调用时,实参何时使用取内容运算符*,何时使用取地址运算符&?
2.试编写一个算法,可以删除顺序表中从第i个元素起的k个元素。
在程序中实现算法并完成调用。
参考代码1(秦锋格式定义):
/*线形表的顺序存储,用指针做参数传递,顺序表采用数组存储,定义参考秦锋《数据结构》中定义格式*/
#include
#include
#defineMAXSIZE50
#defineFALSE0
#defineTRUE1
/*数据元素类型ElemType为int型*/
typedefintElemType;
/*定义顺序表类型SeqList及指向顺序表的指针PSeqList*/
typedefstruct
{
ElemTypedata[MAXSIZE];/*存放线性表的数组*/
intlength;/*length是顺序表的长度*/
}SeqList,*PSeqList;
/*初始化顺序表*/
PSeqListInit_SeqList()
{
PSeqListPL;
PL=(PSeqList)malloc(sizeof(SeqList));
if(PL!
=NULL)
PL->length=0;
else
printf("outofspace!
\n");
return(PL);
}
/*清空顺序表*/
SeqListClear_List(SeqListL)
{
L.length=0;
returnL;
}
/*求顺序表长度*/
intLength_List(SeqListL)
{
return(L.length);
}
/*遍历输出顺序表*/
voidDisp_List(SeqListL)
{
inti;
if(L.length==0)
printf("顺序表为空\n");
else
{
printf("顺序表中元素为:
\n");
for(i=0;i printf("%d\t",L.data[i]); printf("\n"); } } /*检索查找,在线性表中查找元素x,并返回其位置,若查找不成功,则返回0*/ intLocate_List(SeqListL,ElemTypex) { inti=0; while(i =x) i++; if(i>=L.length) return0; else return(i+1); } /*向顺序表第i个元素前插入元素x,插入成功返回1,不成功返回0*/ intInsert_List(PSeqListPL,inti,ElemTypex) { intj; if(! PL) { printf("顺序表不存在! "); return0; } if(i<1||i>PL->length+1) {printf("插入位置不正确! \n"); return0; } for(j=PL->length-1;j>=i-1;j--) PL->data[j+1]=PL->data[j]; PL->data[i-1]=x; PL->length++; return1; } /*在线性表中插入元素x,使得线性表仍然有序*/ intinsert(PSeqListPL,ElemTypex) { inti,j; i=PL->length-1; while(x i--; for(j=PL->length-1;j>i;j--) PL->data[j+1]=PL->data[j]; PL->data[i+1]=x; PL->length++; return1; } /*删除线性表中第i个元素,成功删除元素,返回1,否则返回0*/ intDelete_List(PSeqListPL,inti) { intj; if(! PL) { printf("顺序表不存在! "); return0; } if(i<1||i>PL->length) {printf("删除位置不正确! \n"); return0; } for(j=i;j<=PL->length-1;j++) PL->data[j-1]=PL->data[j]; PL->length--; return1; } /*删除线性表中从第i个元素起k个元素*/ intdelk(PSeqListL,inti,intk) { intj; if(i<0||i+k-1>L->length) { printf("error! "); return0; } else { for(j=i+k-1;j L->data[j-k]=L->data[j]; L->length=L->length-k; return1; } } /*向顺序表中顺序输入元素*/ voidCreat_List(PSeqListPL) {inti; printf("输入数据不得超过50个! \n"); printf("输入顺序表中元素个数: \n"); scanf("%d",&PL->length); for(i=1;i<=PL->length;i++) {printf("inputthe%dnumber: ",i); scanf("%d",&PL->data[i-1]); } } /*显示选择提示信息函数*/ voidShowSelect() {printf("\n请选择要执行的操作: \n"); printf("-------------------------\n"); printf("1----初始化\n"); printf("2----为顺序表输入元素\n"); printf("3----求顺序表长度\n"); printf("4----遍历输出顺序表\n"); printf("5----在顺序表中检索查找\n"); printf("6----向顺序表中插入元素\n"); printf("7----从顺序表中删除元素\n"); printf("0----退出\n"); printf("-------------------------\n"); printf("pleaseinputnumber0~~7\n\n"); } intmain(void) {PSeqListPL=NULL; inti,x,flag; intlen;/*表示顺序表长*/ intselect;/*select变量表示用户的选择项*/ ShowSelect(); scanf("%d",&select); while(select! =0) {switch(select) {case1: PL=Init_SeqList();break; case2: Creat_List(PL);break; case3: len=Length_List(*PL);printf("顺序表长为%d\n",len);break; case4: Disp_List(*PL);break; case5: printf("\n请输入你想查找的数据: "); scanf("%d",&x); flag=Locate_List(*PL,x); if(flag) printf("该元素在顺序表中的位置是: %d\n",flag); else printf("该元素在顺序表中不存在"); break; case6: printf("请输入要插入的元素的值和位置,用空格分隔: \n"); scanf("%d%d",&x,&i); flag=Insert_List(PL,i,x); if(flag)printf("插入操作成功"); break; case7: printf("请输入要删除的元素的位置: \n"); scanf("%d",&i); flag=Delete_List(PL,i); if(flag)printf("删除操作成功"); break; } ShowSelect(); scanf("%d",&select); } } 实验二链表的基本操作 实验目的: 1.进一步熟悉C语言上机环境,进一步掌握C语言结构特点 2.掌握单链表的逻辑结构和定义 3.掌握单链表的生成、插入、删除和查找等基本运算 实验要求: 1.完成算法设计和程序设计,并上机调试通过 2.完成实验报告,提供实验数据和结果 3.对插入和删除算法进行时间复杂度的估算 实验内容: 实现单链表的基本操作,使得对于线性表(6,9,14,23,28,50),实现以下功能: 1.从键盘依次往顺序表中输入数据 2.在第3位插入数值10,输出顺序表 3.删除第4位数值,输出整个顺序表. 4.查找表中是否有数据24,有则返回其位置 5.输出线性表中第i个元素的值,位序i由用户通过键盘输入 请在实验中完成以下函数定义并调用它们: LinkListInit_LinkList()//初始化单链表 voidCreat_List(LinkListL,intn)//按逆序产生一个链表长度为n intLength_List(LinkListL)//求单链表表长 voidDisp_List(LinkListL)//依次输出单链表中元素 //在单链表中检索查找x,找不到返回0,否则返回在线性表中的位序 intLocate_List(LinkListL,ElemTypex) //向表中第i个元素前插入新元素x intInsert_List(LinkListL,inti,ElemTypex) //删除单链表中第i个元素 intDelete_List(LinkListL,inti) //实现单链表的逆置 voidReverse_LinkList(LinkListL) 用户界面如图: 实验小结及思考: 1.总结单链表结构特点 2.试编写算法,在一个带头结点的单链表中删除最小值结点 参考代码 /*单链表结构定义各书差不多,只名称有区别,本程序名称定义按秦峰版*/ /*本程序为带头结点单链表*/ #include #include #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineNull0 typedefintElemType; typedefstructLNode { ElemTypedata; structLNode*next; }LNode,*LinkList; /*初始化单链表,即产生一个带头结点的空表,创建成功则返回空表的头指针*/ LinkListInit_List(void) { LinkListL; L=(LinkList)malloc(sizeof(LNode)); if(L) L->next=NULL;//产生空表,头结点的next域为空 returnL; } /*按逆序产生一个长度为n链表,参数为初始化的空链表,及线性表长度n*/ /*每个元素依次插入在头结点后*/ intCreate_List(LinkListL,intn) {inti; LinkLists;/*s变量用于保存新结点地址*/ printf("生成有%d个元素的线性表: \n",n); for(i=n;i>0;i--) {printf("请输入线性表中第%d个元素: \n",i);/*逆序输入元素*/ s=(LinkList)malloc(sizeof(LNode)); if(! s) { printf("创建结点不成功\n"); return0; } scanf("%d",&s->data); s->next=L->next; L->next=s; } return1; } /*求单链表表长,返回L中数据元素个数*/ intLength_List(LinkListL) { inti=0; LinkListp=L->next; while(p) { i++; p=p->next; } returni; } /*当按位置查找元素,第i个元素存在时,其值赋给e并返回1,否则返回0*/ intGetElem_List(LinkListL,inti,ElemType*e) { intj=0; LinkListp=L; while(p&&j { p=p->next; j++; } if(! p||j>i) {printf("链表不存在或参数i错"); return0; } *e=p->data;/*取第i个元素*/ return1; } /*按元素查找,查找链表中是否存在值为e的元素,存在,则返回L中第一个e元素的位序,若不存在,则返回值为0*/ intLocate_List(LinkListL,ElemTypee) { inti=0; LinkListp=L; while(p&&p->data! =e) {p=p->next; i++; } if(p) returni; else return0; } /*在带头结点的单链线性表L中第i个位置之前插入元素e*/ intInsert_List(LinkListL,inti,ElemTypee) { intj=0; LinkListp=L,s; while(p&&j { p=p->next; j++; } if(! p||j>i-1) returnERROR; s=(LinkList)malloc(sizeof(structLNode)); s->data=e; s->next=p->next; p->next=s; returnOK; } intDelete_List(LinkListL,inti,ElemType*e)/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/ { intj=0; LinkListp=L,q; while(p->next&&j { p=p->next; j++; } if(! p->next||j>i-1) return0; q=p->next; p->next=q->next; *e=q->data; free(q); return1; } intDisp_List(LinkListL)/*显示单链表*/ { LinkListp=L->next; if(p==Null)printf("单链表为空表"); else {printf("输出单链表: \n"); while(p! =Null) {printf("%d",p->data); printf("->"); p=p->next; } } printf("\n"); return1; } /*以下函数为作业中常见练习,不是基本操作,也未在主函数中调用*/ /*删除单链表中多余的元素值相同的结点*/ voidDelRepeat_List(LinkListL) { LinkListp,h,pre; h=L->next; if(h==NULL) { printf("是一个空表"); return; } p=L->next->next; if(p==NULL) { printf("表中只有一个结点"); return; } while(h->next! =NULL) {pre=h; p=pre->next; while(p) {if(h->data==p->data) { pre->next=p->next; free(p); p=pre->next; } else { pre=p; p=p->next; } } h=h->next; } } /*显示选择提示信息函数*/ voidShowSelect() {printf("\n请选择要执行的操作: \n"); printf("-------------------------\n"); printf("1----初始化\n"); printf("2----逆序输入元素\n"); printf("3----求单链表长度\n"); printf("4----遍历输出顺序表\n"); printf("5----在单链表中检索查找\n"); printf("6----向单链表中插入元素\n"); printf("7----从单链表中删除元素\n"); printf("0----退出\n"); printf("-------------------------\n"); printf("pleaseinputnumber0~~7\n\n"); } intmain(void) {LinkListPL=NULL; inti,x,flag; intlen;/*表示单链表长*/ intselect;/*select变量表示用户的选择项*/ ShowSelect(); scanf("%d",&select); while(select! =0) {switch(select) {case1: PL=Init_List();break; case2: printf("请输入线性表中元素个数: \n");scanf("%d",&len);Create_List(PL,len);break; case3: len=Length_List(PL);printf("单链表表长为%d\n",len);break; case4: Disp_List(PL);break; case5: printf("\n请输入你想查找的数据: "); scanf("%d",&x); i=Locate_List(PL,x); if(flag) printf("该元素在顺序表中的位置是: %d\n",i); else printf("该元素在顺序表中不存在"); break; case6: printf("请输入要插入的元素的值和位置,用空格分隔: \n"); scanf("%d%d",&x,&i); flag=Insert_List(PL,i,x); if(flag)printf("插入操作成功"); break; case7: printf("请输入要删除的元素的位置: \n"); scanf("%d",&i); flag=Delete_List(PL,i,&x); if(flag)printf("删除操作成功"); break; case8: DelRepeat_List(PL); } ShowSelect(); scanf("%d",&select); } } 实验三线性表的应用----稀疏多项式计算器 (vc环境,&符号) #include #include #defineNull0 typedefstructLNode/*项的表示,多项式的项作为LinkList的数据元素*/ { intcoef;/*系数*/ intexpn;/*指数*/ structLNode*next; }LNode,*LinkList; typedefLinkListpolynomial;/*用带有表头结点的有序链表表示多项式*/ voidCreatePolyn(polynomial&L)/*按尾插法产生一个n项多项式*/ {inti,n; polynomialp,s; L=(polynomial)malloc(sizeof(LNode)); L->next=Null; p=L; printf("请输入该多项式的总项数: \n"); scanf("%d",&n); for(i=1;i<=n;i++) {printf("输入第%d项系数,指数(用,号分隔)\n",i); s=(polynomial
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 参考
![提示](https://static.bdocx.com/images/bang_tan.gif)