计算机软件基础实验报告2.docx
《计算机软件基础实验报告2.docx》由会员分享,可在线阅读,更多相关《计算机软件基础实验报告2.docx(16页珍藏版)》请在冰豆网上搜索。
计算机软件基础实验报告2
北京联合大学
实验报告
课程(项目)名称:
计算机软件技术基础(实验2)
学院:
自动化学院专业:
电气工程与自动化
班级:
0910030101学号:
2009100301126
姓名:
林驷淇成绩:
2011年 4 月 24 日
一、任务与目的
1.实验目的
(1)掌握链表的概念。
(2)熟练掌握线性表的链式存储结构。
(3)熟练掌握线性表在链式存储结构上的运算。
2.实验内容
(1)编写算法,根据用户输入的整数创建一个带头结点的单链表,-1作为输入数据的结束符。
测试要求:
建立空链表、非空链表的情况下测试程序运行情况。
(2)编写算法,在带有头结点的单链表中查找序号为i的结点和值为x的结点并输出。
测试要求:
在空链表、i与x在链表头、i与x在链表尾、i与x在链表中间、i与x在链表中不存在的情况下测试程序运行情况。
(3)己知单链表中的元素非递减有序排列,编写算法删除单链表中值相同的多余的元素。
测试要求:
在空链表、有1组相同元素、有2组连续相同元素、有2组以上不连续相同元素的情况下测试程序运行情况。
(4)已知单链表中的数据元素递增有序,编写算法,给定的两个数据Min和Max,删除表中值在min与max之间的结点。
测试要求:
在空链表、max小于链表第1个元素值、min大于链表最后1个元素值、min与max在链表中间的情况下测试程序运行情况。
二、原理(条件)
VisualC++6.0
三、内容与步骤
(1)编写算法,根据用户输入的整数创建一个带头结点的单链表,-1作为输入数据的结束符。
测试要求:
建立空链表、非空链表的情况下测试程序运行情况。
测试数据为:
10,9,8,7,6,5,4,3,2,1
主函数内的代码:
linklist*createlist()
{
intt;
linklist*head,*s,*r;//s为新建结点,r为尾结点
head=(linklist*)malloc(sizeof(linklist));//开辟空间,建立一个头结点
r=head;
printf("请输入数字序列,产生单链表,以-1结束。
\n");
scanf("%d",&t);
while(t!
=-1)
{
s=(linklist*)malloc(sizeof(linklist));
s->data=t;
r->next=s;
r=s;
scanf("%d",&t);
}
r->next=NULL;
returnhead;
}
运行结果:
(2)编写算法,在带有头结点的单链表中查找序号为i的结点和值为x的结点并输出。
测试要求:
在空链表、i与x在链表头、i与x在链表尾、i与x在链表中间、i与x在链表中不存在的情况下测试程序运行情况。
主函数内的代码:
voidfindi(linklist*head)//查找结点为i的值
{
linklist*p,*q;
inti=0,j=0;
printf("输入要查找的结点:
\n");
scanf("%d",&i);
if(i==1)
q=head->next;
else
{
p=head->next;
j=1;
while(p!
=NULL)
{
p=p->next;
j++;
if(i==j)
{
q=p;
break;
}
}
}
if(p==NULL)
{
printf("超出范围,不存在");
}
else
{
printf("查找的元素为:
");
printf("%d\n",q->data);
}
}
测试数据:
查找结点为3的值
运行结果:
voidfindx(linklist*head)//查找值为x的结点
{
linklist*p;
intch;
intj=0;
printf("请输入要查找的数值:
\n");
scanf("%d",&ch);
p=head->next;
j=1;
while(p!
=NULL&&p->data!
=ch)
{
p=p->next;
j++;
}
if(p==NULL)
printf("你所输入的值不存在!
\n");
else
printf("第%d个元素为%d\n",j,p->data);
}
测试数据:
查找值为3的值
运行结果:
(3)己知单链表中的元素非递减有序排列,编写算法删除单链表中值相同的多余的元素。
测试要求:
在空链表、有1组相同元素、有2组连续相同元素、有2组以上不连续相同元素的情况下测试程序运行情况。
主函数内的代码:
linklist*deld(linklist*head)//删除连续相同元素
{
linklist*p,*q;
p=head->next;
printf("删除后链表为:
\n");
if(p==NULL)
returnhead;
else
{
while(p->next!
=NULL)
{
q=p->next;
if(p->data==q->data)
{
p->next=q->next;
free(q);
}
else
{
p=p->next;
q=q->next;
}
}
}
returnhead;
}
测试数据:
1245787896
10111125262828353648
5568910111212353865657889
运行结果:
(4)已知单链表中的数据元素递增有序,编写算法,给定的两个数据Min和Max,删除表中值在min与max之间的结点。
测试要求:
在空链表、max小于链表第1个元素值、min大于链表最后1个元素值、min与max在链表中间的情况下测试程序运行情况。
主函数内的代码:
linklist*del2(linklist*head)//删除链表中的min与max之间的元素
{
linklist*p,*q1,*q2=NULL;
intmax=0,min=0;
printf("请输入min和max\n");
scanf("%d%d",&min,&max);
printf("删除后链表为:
\n");
if(head->next==NULL)
returnhead;
if(head->next->data>max)
returnhead;
elsep=head;
while(p->next!
=NULL&&p->next->data<=min)
p=p->next;
if(p->next==NULL)
returnhead;
else
{
q1=p->next;q2=q1->next;
}
while(q2!
=NULL&&q2->dataq2=q2->next;
p->next=q2;
while(q1!
=q2)
{
p=q1;q1=q1->next;
free(p);
}
returnhead;
}
测试数据:
121518234578
min为15max为23
运行结果:
四、完整程序
#include//printf和scanf提供头文件
#include//malloc和free提供头文件
typedefintdatatype;//定义数据元素的类型,命名为datatype
typedefstructnode
{
datatypedata;
structnode*next;
}linklist;//定义结点类型,命名为linklist
linklist*createlist()
{
intt;
linklist*head,*s,*r;//s为新建结点,r为尾结点
head=(linklist*)malloc(sizeof(linklist));//开辟空间,建立一个头结点
r=head;
printf("请输入数字序列,产生单链表,以-1结束。
\n");
scanf("%d",&t);
while(t!
=-1)
{
s=(linklist*)malloc(sizeof(linklist));
s->data=t;
r->next=s;
r=s;
scanf("%d",&t);
}
r->next=NULL;
returnhead;
}
voidprintnode(linklist*head)//输出程序
{
linklist*r;
r=head->next;
if(r==NULL)
{
printf("输入为空\n");
}
while(r!
=NULL)
{
printf("%d\t",r->data);
r=r->next;
}
printf("\n输出结束\n");
}
voidfindi(linklist*head)//查找结点为i的值
{
linklist*p,*q;
inti=0,j=0;
printf("输入要查找的结点:
\n");
scanf("%d",&i);
if(i==1)
q=head->next;
else
{
p=head->next;
j=1;
while(p!
=NULL)
{
p=p->next;
j++;
if(i==j)
{
q=p;
break;
}
}
}
if(p==NULL)
{
printf("超出范围,不存在");
}
else
{
printf("查找的元素为:
");
printf("%d\n",q->data);
}
}
voidfindx(linklist*head)//查找值为x的结点
{
linklist*p;
intch;
intj=0;
printf("请输入要查找的数值:
\n");
scanf("%d",&ch);
p=head->next;
j=1;
while(p!
=NULL&&p->data!
=ch)
{
p=p->next;
j++;
}
if(p==NULL)
printf("你所输入的值不存在!
\n");
else
printf("第%d个元素为%d\n",j,p->data);
}
linklist*deld(linklist*head)//删除连续相同元素
{
linklist*p,*q;
p=head->next;
printf("删除后链表为:
\n");
if(p==NULL)
returnhead;
else
{
while(p->next!
=NULL)
{
q=p->next;
if(p->data==q->data)
{
p->next=q->next;
free(q);
}
else
{
p=p->next;
q=q->next;
}
}
}
returnhead;
}
linklist*del2(linklist*head)//删除链表中的min与max之间的元素
{
linklist*p,*q1,*q2=NULL;
intmax=0,min=0;
printf("请输入min和max\n");
scanf("%d%d",&min,&max);
printf("删除后链表为:
\n");
if(head->next==NULL)
returnhead;
if(head->next->data>max)
returnhead;
elsep=head;
while(p->next!
=NULL&&p->next->data<=min)
p=p->next;
if(p->next==NULL)
returnhead;
else
{
q1=p->next;q2=q1->next;
}
while(q2!
=NULL&&q2->dataq2=q2->next;
p->next=q2;
while(q1!
=q2)
{
p=q1;q1=q1->next;
free(p);
}
returnhead;
}
voidmain()
{
}
五、结论
通过此次试验了解的链表的创建,运用了链表的删除和查找功能的实用。
也更加强和巩固了C语言中构造函数的运用。
六、评语