中国石油大学数据结构上机实验2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
学号2015011512 姓名胡明禹专业数学与应用数学时间2018320
一、实验题目
实验2单链表基本操作
二、实验目的
1.熟练掌握线性表的顺序存储方式下,基本操作的实现算法,巩固和
体会单链表操作特点;
2.理解体会动态内存申请与释放;
3.通过本次实验,熟练掌握C语言指针的使用
三、算法设计分析
(一)实验内容
1.创建一个空的带头结点的单链表
2.采用头插法在单链表中插入n个元素
3.删除单链表中第i个元素
4.实现单链表按关键字查找操作
5.计算单链表的表长并输出单链表
6.销毁单链表
(二)总体设计
此处给出主要函数功能、及函数间调用关系的的描述。
例如:
1.构造一个空的单链表的函数;
2.插入函数;
3.删除函数
4.查找函数;
5.计算并输出函数;
6.销毁函数。
其功能描述如下:
(1 )主函数:统筹调用各个函数以实现相应功能
void mai n()
(2)
①构造一个空的单链表的函数
Status In itList_L(Li nkList &L)
{
L=(LinkList)malloc(sizeof(LNode));// 构造一个空的线性表L f(!L) exit (OVERFLOW);// 存储分配失败
L->next=NULL;〃空表长度为Osystem("cls");〃清空屏幕printf("\n\n 初始化成功\n\n\n"); system("PAUSE");〃按任意键继续
return OK;
}
void CreateList_L(LinkList &L)
{// 创建一个新表
int i,count;
LinkList p;
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");
}
②插入函数
Status ListInsert_L(LinkList &L, int i, int newnode)
{// 在顺序线性表L 中第i 个位置之前插入新的元素
LinkList p = L;
LinkList s;
int j = 0;
while(p&&j<i-1)
{
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 的后继结点return OK;
}
③删除函数
Status ListDelete_L(LinkList &L, int i)
{//在顺序线性表L中删除第i个元素,并用e返回其值
LinkList p=L;
LinkList q;
int j=0;
while(p->next&&j<i-1)// 如果满足这样的条件
{
p = p->next;
++j;
}
if(!(p->next)||j>i-1) return ERROR;// 删除位置非法q= p->next;// 将p 的后继结点给q
p->next = q->next;// 将q 的后继结点给p 的后继结点printf("\n\n 删除成功\n\n 被删除的结点是:%d\n",q->data); free(q);
return OK;
}
④查找函数
Status FindElemList_L(LinkList &L)
{// 单链表按照关键字查询
LinkList p;
int i=1,NUMBER;
int n=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");
}
return OK;
}
⑤计算并输出函数
Status PrintList_L(LinkList &L)
{// 输出链表
m=0;
LinkList p;
p=L;
printf("\n");
while(p->next!=NULL)// 当链表非空
{
p=p->next;
printf("%d: %d\n",++m,p->data);// 输出
}
printf("\n");
return OK;
}
⑥销毁函数
Status DestroyList_L(LinkList &L) // 销毁单链表{ LinkList p, q;
p=L;
while(p)
{
q=p;
p=p->next;
free(q); // 释放
}
if(p==NULL)
printf("\n 成功,请退出\n\n");
else
printf (” 失败 \n");
return OK;
}
四、实验测试结果及结果分析
(一)测试结果(此处给出程序运行截图)
'D:\Microsoft Visual Studio\Common\MSDev98\Bin\Debug\hmy_3 27nexe'
入成功
I 希W'.羊.:-*;
-辛吊fi:j ^_ 单— —i
c*i3.l w
i 6
O
n 冷】•♦
•*
**・*2默#欲譎
值:9 • 'O A IA^OW H Vnual Stu4»o \Com«i^rAM$0«vW^rAD<^u9\hn»yJ.2?.ex ,
■ ' •WMcp'S V HIO I JwdoXQnvrcrAMSO^v^VBAQ^bvgfmy,
業单
»<»<»«><> 歩 兀奠 单屢 S 8S —i
2c *s 4-u i
&
7.
a
年%去的去长为,7 请祐儀泄注・・・1
2
J 1
5 门7 £ 4Z 人
人障
九 2r 4
4
u *j 6x a • • •0\Mig5e 々、“2 女u£*OE»M \M5De*^2"d>e0jaE
谓捜衽苜槌熨冬•・・ 7 6 L
4 9 2
匝内,诵怎出
清馬任社情辭紈・■
!• ■D H \ME M H 七畔叽|细6占说“血射衬翻、伯e 翱诃津《jwbuqmb 」£T ・Ee"
(二)结杲分析 成功完成了题冃所要求的插入,删除,查找等基本操作。
五、实验总结
附录实验程序代码(该部分请加注释)
#in elude "stdio.h" #inelude "stdlib.h"
#in elude "malloe.h"
#defi ne MAX 1000
#defi ne OVERFLOW -2
#defi ne OK 1
#defi ne ERROR 0 int m=0;,
蹙
IK
t.
匸匕
”甲」
"
..
•if-X-“呼.'F L2-.3.
也5.
ft.7.d 9
如 ■ 'UrMc -usp+l 'Vrs.uJ SludH^'^irrni-icr- MbOrWBi _'>UrtiJU hhT :. -■-
mH?.诗
仁
宁
1!.1!已卞k'-: 亠尢
-r r1T -:l ・K.*
事.* LLz 4-r ■ 6 ? .D.
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data; struct LNode *next;
}LNode, *LinkList;
Status InitList_L(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));// 构造一个空的线性表L if(!L) exit (OVERFLOW);// 存储分配失败
L->next=NULL;// 空表长度为0 system("cls");// 清空屏幕printf("\n\n 初始化成功\n\n\n");
system("PAUSE");〃按任意键继续
return OK;
}
void CreateList_L(LinkList &L)
{// 创建一个新表
int i,count;
LinkList p;
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");
}
Status ListInsert_L(LinkList &L, int i, int newnode)
{// 在顺序线性表L 中第i 个位置之前插入新的元素LinkList p = L; LinkList s;
int j = 0; while(p&&j<i-1) { 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 的后继结点return OK;
}
Status ListDelete_L(LinkList &L, int i)
{//在顺序线性表L中删除第i个元素,并用e返回其值
LinkList p=L;
LinkList q;
int j=0;
while(p->next&&j<i-1)// 如果满足这样的条件
{
p = p->next;
++j;
}
if(!(p->next)||j>i-1) return ERROR;// 删除位置非法
q= p->next;// 将p 的后继结点给q
p->next = q->next;// 将q 的后继结点给p 的后继结点printf("\n\n 删除
成功\n\n 被删除的结点是:%d\n",q->data); free(q); return OK;
}
Status FindElemList_L(LinkList &L)
{// 单链表按照关键字查询
LinkList p;
int i=1,NUMBER;
int n=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");
}
return OK;
}
Status PrintList_L(LinkList &L)
{// 输出链表
m=0;
LinkList p;
p=L;
printf("\n");
while(p->next!=NULL)// 当链表非空
{
p=p->next;
printf("%d: %d\n",++m,p->data);// 输出
}
printf("\n");
return OK;
}
Status DestroyList_L(LinkList &L) // 销毁单链表{
LinkList p, q;
p=L;
while(p)
{
q=p;
p=p->next;
free(q); // 释放
}
if(p==NULL)
printf("\n 成功,请退出\n\n");
else
printf(" 失败\n");
return OK;
}
void mainmenu() // 输出菜单
{
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");
} void main() int choose,location,value;
LinkList L;
while(1)
{
mainmenu();
printf("\n 输入选择: "); scanf("%d",&choose); switch(choose)
{
case 1:
InitList_L(L);
system("cls");
break;
case 2:
CreateList_L(L);
PrintList_L(L); system("PAUSE"); system("cls"); break;
case 3:
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"); case 4: system("cls");
PrintList_L(L);
printf("\n 请输入删除结点位置:"); scanf("%d",&location);
ListDelete_L(L,location);
PrintList_L(L); system("PAUSE"); system("cls"); break;
case 5: system("cls");
FindElemList_L(L);
PrintList_L(L); system("PAUSE"); system("cls"); break;
case 6: system("cls");
m=0;
PrintList_L(L);
printf("\n 单链表的表长为:%d\n\n",m); m=0;
system("PAUSE"); system("cls"); break;
case 7: system("cls"); DestroyList_L(L); system("PAUSE"); system("cls"); break;
case 0:
exit(0);
break;
}//case
}//while
}。