中国石油大学数据结构上机实验2.docx
- 文档编号:4723844
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:37.23KB
中国石油大学数据结构上机实验2.docx
《中国石油大学数据结构上机实验2.docx》由会员分享,可在线阅读,更多相关《中国石油大学数据结构上机实验2.docx(13页珍藏版)》请在冰豆网上搜索。
中国石油大学数据结构上机实验2
《数据结构》实验报告
学号2015011512姓名胡明禹专业数学与应用数学时间2018320
一、实验题目
实验2单链表基本操作
二、实验目的
1.熟练掌握线性表的顺序存储方式下,基本操作的实现算法,巩固和体会单链表操作特点;
2.理解体会动态内存申请与释放;
3.通过本次实验,熟练掌握C语言指针的使用
三、算法设计分析
(1)实验内容
1.创建一个空的带头结点的单链表
2.采用头插法在单链表中插入n个元素
3.删除单链表中第i个元素
4.实现单链表按关键字查找操作
5.计算单链表的表长并输出单链表
6.销毁单链表
(2)总体设计
此处给出主要函数功能、及函数间调用关系的的描述。
例如:
1.构造一个空的单链表的函数;2.插入函数;3.删除函数
4.查找函数;5.计算并输出函数;6.销毁函数。
其功能描述如下:
(1)主函数:
统筹调用各个函数以实现相应功能
voidmain()
(2)
1构造一个空的单链表的函数
StatusInitList_L(LinkList&L)
{
L=(LinkList)malloc(sizeof(LNode));//构造一个空的线性表Lf(!
L)exit(OVERFLOW);//存储分配失败
L->next=NULL;〃空表长度为Osystem("cls");〃清空屏幕printf("\n\n初始化成功\n\n\n");
system("PAUSE");〃按任意键继续
returnOK;
}
voidCreateList_L(LinkList&L)
{//创建一个新表
inti,count;
LinkListp;
system("cls");//清屏
printf("\n输入总结点数:
");
scanf("%d",&count);
printf("\n输入各个结点数值,每输一个按下回车:
\n");
for(i=count;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);
p->next=L->next;
L->next=p;〃赋值
}
system("cls");//清屏
printf("\n录入成功\n");
}
2插入函数
StatusListInsert_L(LinkList&L,inti,intnewnode)
{//在顺序线性表L中第i个位置之前插入新的元素
LinkListp=L;
LinkLists;
intj=0;
while(p&&j { p=p->next; ++j; } if(! p||j>i-1)//i插入的位置不合法 { printf("error\n"); } s=(LinkList)malloc(sizeof(LNode)); s->data=newnode; s->next=p->next;//将p的后继结点给s的后继结点p->next=s;//将s给p的后继结点 returnOK; } 3删除函数 StatusListDelete_L(LinkList&L,inti) {//在顺序线性表L中删除第i个元素,并用e返回其值 LinkListp=L; LinkListq; intj=0; while(p->next&&j { p=p->next; ++j; } if(! (p->next)||j>i-1)returnERROR;//删除位置非法q=p->next;//将p的后继结点给q p->next=q->next;//将q的后继结点给p的后继结点printf("\n\n删除成功\n\n被删除的结点是: %d\n",q->data);free(q); returnOK; } 4查找函数 StatusFindElemList_L(LinkList&L) {//单链表按照关键字查询 LinkListp; inti=1,NUMBER; intn=0; p=L->next; printf("\n输入查询数字: "); scanf("%d",&NUMBER); while(p) { if(p->data==NUMBER) {printf("\n查询成功! 该数字位于结点%d\n",i); n++; } p=p->next; i++; } if(! n) {printf("\n查询失败! 未找到该元素! \n"); } returnOK; } 5计算并输出函数 StatusPrintList_L(LinkList&L) {//输出链表 m=0; LinkListp; p=L; printf("\n"); while(p->next! =NULL)//当链表非空 { p=p->next; printf("%d: %d\n",++m,p->data);//输出 } printf("\n"); returnOK; } 6销毁函数 StatusDestroyList_L(LinkList&L)//销毁单链表{ LinkListp,q; p=L; while(p) { q=p; p=p->next; free(q);//释放 } if(p==NULL) printf("\n成功,请退出\n\n"); else printf(”失败\n"); returnOK; } 四、实验测试结果及结果分析 (一)测试结果(此处给出程序运行截图) ■*D: \MicrosoftVisualStudio\CofrnVion\MSDev98\Bin\Debug\hmy3_27.exe' 菜单 ”"JcsfcJfsi™1””活"■ 素表量素元表表链元元有盡性MBB元单线立入入掘岀醫1.2.3.生5.&7.0.*■++***■** 输入选择11. 'D: \MicrosoftVisualStudio\Common\MSDev98\Bin\Debug\hmy_327nexe' 初始化成功 请按任意键继续….■ -Klkle-K-K■事4CF IB丄,f糸Y呛二一一--I3-卄卄叮卄立卄・ ■+1ftdQd4rbSTD-*Ji 入成功 I希W'.羊.: -*; -辛吊fi: j^_单——ic*i3.lwi6? On冷】•♦•***・* 2默#欲譎值: 9 •'OaIA^owHVnualStu4»o\Com«i^rAM$0«vW^rAD<^u9\hn»yJ.2? .ex, ■'•WMcp'SVhioIJwdoXQnvrcrAMSO^v^VBAQ^bvgfmy, 業单 »<»<»«><> 歩 兀奠单屢S8S? —i2c*s4-ui&7.a 12J15门7,.. £ 4Z人人障 九2r44u*j6xa •••0\Mig5e々、“2女u£*OE»M\M5De*^2"d>e0jaE 谓捜衽苜槌熨冬•・・ 76L492 年%去的去长为,7请祐儀泄注・・・ 匝内,诵怎出 清馬任社情辭紈・■ ! •■Dh\MEmH七畔叽|细6占说“血射衬翻、伯e翱诃津《jwbuqmb」£T・Ee" ,蹙 IKt.匸匕”甲」"..•if-X-“呼.'F L2-.3.也5.ft.7.d9如 (二)结杲分析成功完成了题冃所要求的插入,删除,查找等基本操作。 五、实验总结 附录实验程序代码(该部分请加注释) #inelude"stdio.h"#inelude"stdlib.h" #inelude"malloe.h" #defineMAX1000 #defineOVERFLOW-2 #defineOK1 #defineERROR0intm=0; typedefintElemType; typedefintStatus; typedefstructLNode { ElemTypedata;structLNode*next; }LNode,*LinkList; StatusInitList_L(LinkList&L) { L=(LinkList)malloc(sizeof(LNode));//构造一个空的线性表Lif(! L)exit(OVERFLOW);//存储分配失败 L->next=NULL;//空表长度为0system("cls");//清空屏幕printf("\n\n初始化成功\n\n\n"); system("PAUSE");〃按任意键继续 returnOK; } voidCreateList_L(LinkList&L) {//创建一个新表 inti,count; LinkListp; system("cls");//清屏printf("\n输入总结点数: "); scanf("%d",&count); printf("\n输入各个结点数值,每输一个按下回车: \n");for(i=count;i>0;i--)//循环嵌套 p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next; L->next=p;//赋值 }system("cls");//清屏printf("\n录入成功\n"); } StatusListInsert_L(LinkList&L,inti,intnewnode) {//在顺序线性表L中第i个位置之前插入新的元素LinkListp=L; LinkLists; intj=0;while(p&&j ++j; }if(! p||j>i-1)//i插入的位置不合法 {printf("error\n"); } s=(LinkList)malloc(sizeof(LNode));s->data=newnode; s->next=p->next;//将p的后继结点给s的后继结点p->next=s;//将s给p的后继结点returnOK; } StatusListDelete_L(LinkList&L,inti) {//在顺序线性表L中删除第i个元素,并用e返回其值 LinkListp=L; LinkListq; intj=0; while(p->next&&j { p=p->next; ++j; } if(! (p->next)||j>i-1)returnERROR;//删除位置非法 q=p->next;//将p的后继结点给q p->next=q->next;//将q的后继结点给p的后继结点printf("\n\n删除成功\n\n被删除的结点是: %d\n",q->data);free(q); returnOK; } StatusFindElemList_L(LinkList&L) {//单链表按照关键字查询 LinkListp; inti=1,NUMBER; intn=0; p=L->next; printf("\n输入查询数字: "); scanf("%d",&NUMBER); while(p) { if(p->data==NUMBER) {printf("\n查询成功! 该数字位于结点%d\n",i); n++; p=p->next; i++; } if(! n) {printf("\n查询失败! 未找到该元素! \n"); } returnOK; } StatusPrintList_L(LinkList&L) {//输出链表 m=0; LinkListp; p=L; printf("\n"); while(p->next! =NULL)//当链表非空 { p=p->next; printf("%d: %d\n",++m,p->data);//输出 } printf("\n"); returnOK; } StatusDestroyList_L(LinkList&L)//销毁单链表 { LinkListp,q; p=L; while(p) { q=p; p=p->next; free(q);//释放 } if(p==NULL) printf("\n成功,请退出\n\n"); else printf("失败\n"); returnOK; } voidmainmenu()//输出菜单 { printf("\n 菜单"); printf("\n ***********************\n\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 ***********************\n"); } voidmain()intchoose,location,value; LinkListL; while (1) { mainmenu(); printf("\n输入选择: ");scanf("%d",&choose);switch(choose) { case1: InitList_L(L); system("cls"); break; case2: CreateList_L(L); PrintList_L(L);system("PAUSE");system("cls");break; case3: system("cls"); PrintList_L(L); printf("请输入插入位置: ");scanf("%d",&location); printf("请输入要插入的数值: ");scanf("%d",&value);system("cls"); ListInsert_L(L,location,value); PrintList_L(L);system("PAUSE");system("cls");break; default: printf("\n输入错误,重新输入! \n");case4: system("cls"); PrintList_L(L); printf("\n请输入删除结点位置: ");scanf("%d",&location); ListDelete_L(L,location); PrintList_L(L);system("PAUSE");system("cls");break; case5: system("cls"); FindElemList_L(L); PrintList_L(L);system("PAUSE");system("cls");break; case6: system("cls"); m=0; PrintList_L(L); printf("\n单链表的表长为: %d\n\n",m);m=0; system("PAUSE");system("cls");break; case7: system("cls");DestroyList_L(L);system("PAUSE");system("cls");break; case0: exit(0); break; }//case }//while }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国 石油大学 数据结构 上机 实验