陈正宁123349数据结构第1次实验报告.docx
《陈正宁123349数据结构第1次实验报告.docx》由会员分享,可在线阅读,更多相关《陈正宁123349数据结构第1次实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
![陈正宁123349数据结构第1次实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/30/cfb46233-2b53-42d8-b9a0-073fe3a0a762/cfb46233-2b53-42d8-b9a0-073fe3a0a7621.gif)
陈正宁123349数据结构第1次实验报告
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
线性数据结构试验
班级:
软嵌151
学号:
2015123349
姓名:
陈正宁
线性表实验报告要求
1目的与要求:
1)掌握线性表数据结构的基本概念和抽象数据类型描述;
2)熟练掌握线性表数据结构的顺序和链式存储存表示;
3)熟练掌握线性表顺序存储结构的基本操作算法实现;
4)熟练掌握线性表的链式存储结构的基本操作算法实现;
5)掌握线性表在实际问题中的应用和基本编程技巧;
6)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行结果);
8)积极开展实验组组内交流和辅导,严禁直接复制和剽窃他人实验成果,一旦发现严肃处理;
9)上实验课前,要求每个同学基本写好程序,并存储在自己的U盘上,用于实验课堂操作时调试和运行。
2实验内容或题目(在一个主程序中实现全部题目内容)
一、顺序表的基本操作实现实验
要求:
数据元素类型ElemType取整型int。
按照顺序存储结构实现如下算法:
1)创建任意整数线性表(即线性表的元素值随机在键盘上输入)的顺序存储结构(即顺序表),长度限定在25之内;
2)打印/显示(遍历)该线性表(依次打印/显示出表中元素值);
3)在顺序表中查找第i个元素,并返回其值;
4)在顺序表第i个元素之前插入一已知元素;
5)在顺序表中删除第i个元素;
6)求顺序表中所有元素值(整数)之和;
二、链表(带头结点)基本操作实验
要求:
数据元素类型ElemType取字符型char。
按照动态单链表结构实现如下算法:
1)按照头插法或尾插法创建一个带头结点的字符型单链表(链表的字符元素从键盘输入),长度限定在10之内;
2)打印(遍历)该链表(依次打印出表中元素值,注意字符的输入顺序与链表的结点顺序);
3)在链表中查找第i个元素,i合法返回元素值,否则,返回FALSE;
4)在链表中查找与一已知字符相同的第一个结点,有则返回TRUE,否则,返回FALSE;
5)在链表中第i个结点之前插入一个新结点;
6)在线性表中删除第i个结点;
7)计算链表的长度。
3实验步骤与源程序
第一题:
顺序表
//顺序结构
#include
#include
#include
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineElemTypeint
#defineMAXSIZE25
typedefstruct
{
ElemTypeelem[MAXSIZE];/*线性表占用的数组空间*/
intlast;/*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1*/
}SeqList;
//顺序表查找操作
intGetData(SeqList*L,inti)
{
returnL->elem[i-1];
}
//插入运算
/*在顺序表L中第i个数据元素之前插入一个元素e。
插入前表长n=L->last+1,
i的合法取值范围是1≤i≤L->last+2*/
intInsList(SeqList*L,inti,ElemTypee)
{
intk;
if((i<1)||(i>L->last+2))/*首先判断插入位置是否合法*/
{
printf("插入位置i值不合法");
return(ERROR);
}
if(L->last>=MAXSIZE-1)
{
printf("表已满无法插入");
return(ERROR);
}
for(k=L->last;k>=i-1;k--)/*为插入元素而移动位置*/
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e;/*在C语言数组中,第i个元素的下标为i-1*/
L->last++;
return(OK);
}
//删除运算
intDelList(SeqList*L,inti,ElemType*e)
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。
i的合法取值为1≤i≤L.last+1*/
{
intk;
if((i<1)||(i>L->last+1))
{
printf("删除位置不合法!
");
return(ERROR);
}
*e=L->elem[i-1];/*将删除的元素存放到e所指向的变量中*/
for(k=i;i<=L->last;k++)
L->elem[k-1]=L->elem[k];/*将后面的元素依次前移*/
L->last--;
return(OK);
}
voidmain()
{
SeqList*l;
intp,r,t,sum=0;
int*q;
inti;
l=(SeqList*)malloc(sizeof(SeqList));
q=(int*)malloc(sizeof(int));
printf("请输入线性表的长度:
");
scanf("%d",&r);
l->last=r-1;
printf("请输入线性表的各元素值:
\n");
for(i=0;i<=l->last;i++)
{
scanf("%d",&l->elem[i]);
}
printf("该结果如下所示:
\n");
for(i=0;i<=l->last;i++)
sum=sum+l->elem[i];
printf("\n以上元素之和是:
");
printf("%d\n",sum);
for(i=0;i<=l->last;i++)
{
printf("%d\t",l->elem[i]);
}
printf("\n请输入要查找的位置:
\n");
scanf("%d",&p);
printf("查找的元素是:
%d\n",GetData(l,p));
printf("\n请输入要插入的元素所在位置:
\n");
scanf("%d",&t);
printf("\n请输入要插入的元素:
\n");
scanf("%d",&p);
InsList(l,t,p);
printf("\n插入后所有元素是:
\n");
for(i=0;i<=l->last;i++)
{
printf("%d\t",l->elem[i]);
}
printf("\n请输入要删除的元素位置:
\n");
scanf("%d",&p);
DelList(l,p,q);
printf("删除的元素值为:
%d\n",*q);
}
第二题:
链表
//链表结构
#include
#include
#include
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
typedefcharElemType;
typedefstructNode//结点类型定义
{
ElemTypedata;
structNode*next;
}Node,*LinkList;
#include"common.h"
#include"SeqList.h"
//链表创建(头插法)
voidCreateFromHead(LinkListL)
{
Node*s;
charc;
intflag=1;
while(flag)/*flag初值为1,当输入"$"时,置flag为0,建表结束*/
{
c=getchar();
if(c!
='$')
{
s=(Node*)malloc(sizeof(Node));/*建立新结点s*/
s->data=c;
s->next=L->next;/*将s结点插入表头*/
L->next=s;
}
else
flag=0;
}
}
voidShow(LinkListl)
{
Node*p;
p=l->next;
printf("链表的结构为:
\n");
while(p!
=NULL)
{
printf("%c",p->data);
p=p->next;
}
}
//链表插入
intInsList(LinkListL,inti,ElemTypee)
/*在带头结点的单链表L中第i个位置插入值为e的新结点s*/
{
Node*pre,*s;
intk;
pre=L;
k=0;/*从"头"开始,查找第i-1个结点*/
while(pre!
=NULL&&k{
pre=pre->next;
k=k+1;
}/*查找第i-1结点*/
if(!
pre)/*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理*/
{
printf("插入位置不合理!
");
returnERROR;
}
s=(Node*)malloc(sizeof(Node));/*申请一个新的结点S*/
s->data=e;/*值e置入s的数据域*/
s->next=pre->next;/*修改指针,完成插入操作*/
pre->next=s;
returnOK;
}
//链表删除
intDelList(LinkListL,inti)
//在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e中
{
Node*p;
intj=0;
p=L;
if(i<1)
{
printf("对不起,删除的位置不合法!
");
returnERROR;
}
else
{
while(p->next!
=NULL&&j
{
p=p->next;
j++;
}
if(p->next==NULL)
{
printf("对不起,删除的位置不合法!
");
returnERROR;
}
p->next=p->next->next;
}
}
//链表查找
charFind(LinkListl,inti)
/*在带头结点的单链表L中查找第i个结点,若找到(1<=i<=n),则返回元素值,否则返回FALSE*/
{
Node*p;
chars;
intj=1;//从头结点开始扫描
p=l->next;
while(p!
=NULL&&j
{
p=p->next;
j++;
}
if(p!
=NULL)
{
s=p->data;//找到了下一个结点,并输出该元素
return(s);
}
else
returnERROR;//没找到该结点
}
//求链表长度
intListLength(LinkListL)
/*本算法是用来求带头结点的单链表的长度*/
{
Node*p;
p=L->next;
intj=0;//用于存放单链表的长度
while(p!
=NULL)
{
j++;
p=p->next;
}
returnj;
}
voidmain()
{
LinkListl;
intn,a;
Node*p;
ElemTyper;
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
printf("用头插法建立单链表,请输入链表数据,以$结束!
\n");
CreateFromHead(l);
Show(l);
printf("\n请输入要查找元素的位置:
");
scanf("%d",&a);
printf("\n该元素是:
");
printf("%c",Find(l,a));
printf("\n请输入要插入的元素:
");
scanf("%c",&r);
printf("请输入要插入元素的位置:
");
scanf("%d",&a);
InsList(l,a,r);
Show(l);
printf("\n请输入要删除元素的位置:
");
scanf("%d",&a);
DelList(l,a-1);
Show(l);
printf("\n链表长度为:
");
printf("%d\n",ListLength(l));
}
4测试数据与实验结果(可以抓图粘贴)
第一题:
顺序表
第二题:
链表
5结果分析与实验体会
这次的数据结构实验因时间紧迫,老师把各个分代码都给了我们,只需要把代码复制进去,加上一个顺序表的求和代码,然后合并成一个main主函数即可。
本次试验让我重温了许多C语言的知识,领略了很多C语言的深入的精华。
通过这次试验,发现自己还存在很多问题,尤其是头结点和头指针的使用更要注意,链表的插入、查找和删除需要特别注意元素的序号和数组的下标。
要利用课余时间抓紧复习C语言,争取在下次试验的时候,即使老师没有发代码,也能克服困难、完成实验!