实验二单链表实现.docx

上传人:b****7 文档编号:10490461 上传时间:2023-02-13 格式:DOCX 页数:21 大小:48.33KB
下载 相关 举报
实验二单链表实现.docx_第1页
第1页 / 共21页
实验二单链表实现.docx_第2页
第2页 / 共21页
实验二单链表实现.docx_第3页
第3页 / 共21页
实验二单链表实现.docx_第4页
第4页 / 共21页
实验二单链表实现.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

实验二单链表实现.docx

《实验二单链表实现.docx》由会员分享,可在线阅读,更多相关《实验二单链表实现.docx(21页珍藏版)》请在冰豆网上搜索。

实验二单链表实现.docx

实验二单链表实现

实验报告

 

课程名称数据结构课程设计

实验项目单链表的实现

实验仪器PC机一台

 

学院_____信息管理学院_______

专业电子商务

班级/学号___电子商务1401______

学生姓名____________

实验日期___12.27_______

成绩_______________________

指导教师_________________

 

北京信息科技大学

信息管理学院

(课程上机)实验报告

实验课程名称:

数据结构课程设计专业:

电子商务班级:

商务1401

学号:

:

成绩:

实验名称

单链表的实现

实验地点

小营学院机房

实验时间

12.29

1.实验目的:

1)理解线性表的逻辑特点;

2)掌握单链表的定义及C语言实现;

3)熟练掌握在单链表中实现各种基本操作;

4)掌握使用单链表解决一些简单应用问题的编程。

2.实验要求:

1)学时为4学时;

2)在上机前完成源程序;

3)能在机器上正确、调试运行程序;

4)本实验需提交实验报告;

5)实验报告文件命名方法:

实验2_xx班_学号后两位_.doc

3.实验内容和步骤:

1)基于单链表实现线性表的以下操作:

a)在表头插入元素

b)在表尾插入元素

c)在指定的位置i插入元素

d)删除操作

e)查找元素

f)求表长度

g)清空操作

h)判断线性表是否为空

i)按位序打印线性表中的元素

2)单链表的简单应用:

a)调用基本操作编写算法删除第i个开始的k个元素;

b)计算单链表中值为x的元素的个数;

c)将x插入到单链表的适当位置上,以保持单链表中元素的有序性;

d)将线性表元素进行就地逆置

e)将两个单链表合并为一个单链表。

4.实验过程:

1)基于单链表实现线性表的以下操作:

在表头插入元素

intInsert_First(LinkList*Head_pointer,ElemTypex)

{

Node*p;

P=(LinkList)malloc(sizeof(Node));

if(p==NULL)

returnOverFlow;

p->data=x;

p->next=*Head_pointer;

*Head_pointer=p;

ReturnOK;

}

在表尾插入元素

intInsert_Last(LinkList*Head_pointer,ElemTypex)

{

Node*p,*q;

P=(LinkList)malloc(sizeof(Node));

if(p==NULL)

returnOverFlow;

p->data=x;

p->next=NULL;

q=*Head_pointer;

if(q==NULL)

*Head_pointer=p;

else

{while(q->next!

=NULL)

q=q->next;

q->next=p;

}

ReturnOK;

}

在指定的位置i插入元素

intInsert_i(LinkList*Head_pointer,ElemTypex,inti)

Node*p,*q;

P=(LinkList)malloc(sizeof(Node));

if(p==NULL)

returnOverFlow;

p->data=x;

if(i==0)

{p->next=*Head_pointer;

*Head_pointer=p;

returnOK;

}

else

{q=*Head_pointer;

while(q->next!

=NULL&&i>1)

{q=q->next;i--;}

if(q!

=NULL)

p->next=q->next;

q->next=p;

returnOK;

}

returnError;

}

}

删除操作

intDelete_LinkList(LinkList*Head_pointer,ElemTypex)

Node*p,*q;

p=*Head_pointer;

if(p->data==x)

{*Head_pointer=(*Head_pointer)->next;

free(p);

returnOK;

}

q=p;p=p->next;

}

}

returnError;

}

查找元素

LinkListLocation_LinkList(LinkListHead,ElemTypex)

{LinkListp;

p=Head;

while(p!

=NULL)

{if(p->data==x)break;

p=p->next;

}

returnp;

}

求表长度

intLength_LinkList(LinkListHead)

{Node*p;

intsum=0;

p=Head;

while(p!

=NULL)

{sum++;

p=p->next;

}

returnsum;

}

清空操作

voidSetNull_LinkList(LinkList*Head_pointer)

{Node*p,*q;

p=*Head_pointer;

while(p!

=NULL)

q=p;

p=p->next;

free(q);

}

*Head_pointer=NULL;

}

判断线性表是否为空

voidIfNull_LinkList(LinkList*Head_pointer)

{if(*Head_pointer==NULL)

returnTrue;

elsereturnFalse;

}

按位序打印线性表中的元素

voidShow_LinkList(LinkListHead)

{Node*p;

printf("\n");

p=Head;

if(p==NULL)

printf("\n空表!

");

while(p!

=NULL)

{printf("%d",p->data);

p=p->next;

}

}

2)单链表的简单应用:

调用基本操作编写算法删除第i个开始的k个元素;

计算单链表中值为x的元素的个数;

将x插入到单链表的适当位置上,以保持单链表中元素的有序性;

将线性表元素进行就地逆置

将两个单链表合并为一个单链表。

1.调用基本操作编写算法删除第i个开始的k个元素;

#include"stdio.h"

#include"stdlib.h"

typedefstructnode

{

intdata;

structnode*next;

}Node,*LinkList;

voidDelete_LinkList(LinkList*Head_pointer,inti,intk)

{

intj=i+k-1;

Node*p,*q,*m,*n;

q=*Head_pointer;

while(q->next!

=NULL&&i>1)

{n=q;q=q->next;i--;}

p=*Head_pointer;

while(p->next!

=NULL&&j>1)

{p=p->next;j--;}

while(q!

=p)

{

m=q;

q=q->next;

free(m);

}

n->next=p->next;

free(p);

}

intinsert_First(LinkList*Head_pointer,intx)

{

Node*p;

p=(LinkList)malloc(sizeof(Node));

if(p==NULL)

return-1;

p->data=x;

p->next=*Head_pointer;

*Head_pointer=p;

return1;

}

voidShow_LinkList(LinkListHead)

{

Node*p;

printf("\n");

p=Head;

if(p==NULL)

printf("\nNULL");

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

}

intmain()

{

intm;

inti,k;

LinkListHead;

Head=NULL;

scanf("%d%d",&i,&k);

for(m=0;m<7;m++)

if(!

insert_First(&Head,m))

break;

Show_LinkList(Head);

Delete_LinkList(&Head,i,k);

Show_LinkList(Head);

return0;

}

2.计算单链表中值为x的元素的个数

#include"stdio.h"

#include"stdlib.h"

typedefstructnode

{

intdata;

structnode*next;

}Node,*LinkList;

intLocation_LinkList(LinkListHead,intx)

{

Node*p;

intsum=0;

p=Head;

while(p!

=NULL)

{

if(p->data==x)

sum++;

p=p->next;

}

returnsum;

}

intinsert_First(LinkList*Head_pointer,intx)

{

Node*p;

p=(LinkList)malloc(sizeof(Node));

if(p==NULL)

return-1;

p->data=x;

p->next=*Head_pointer;

*Head_pointer=p;

return1;

}

voidShow_LinkList(LinkListHead)

{

Node*p;

printf("\n");

p=Head;

if(p==NULL)

printf("\nNULL");

while(p!

=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

}

intmain()

{

intm,x,sum;

LinkListHead;

Head=NULL;

scanf("%d",&x);

for(m=0;m<7;m++)

if(!

insert_First(&Head,m))

break;

Show_LinkList(Head);

sum=Location_LinkList(Head,x);

printf("%d\n",sum);

return0;

}

3.将x插入到单链表的适当位置上,以保持单链表中元素的有序性

#include"stdio.h"

#include"stdlib.h"

typedefstructnode

{

intdata;

structnode*next;

}Node,*LinkList;

intLocation_LinkList(LinkListHead,intx)

{

Node*p;

intsum=0;

p=Head;

while(p!

=NULL)

{

if(p->data<=x)

sum++;

p=p->next;

}

returnsum;

}

intinsert_i(LinkList*Head_pointer,intx,inti)

{

Node*p,*q;

p=(LinkList)malloc(sizeof(Node));

if(p==NULL)

return-1;

p->data=x;

if(i==0)

{

p->next=*Head_pointer;

*Head_pointer=p;

return1;

}

else

{

q=*Head_pointer;

while(q->next!

=NULL&&i>1)

{q=q->next;i--;}

if(q!

=NULL)

{p->next=q->next;

q->next=p;

return1;

}

return-2;

}

}

voidShow_LinkList(LinkListHead)

{

Node*p;

printf("\n");

p=Head;

if(p==NULL)

printf("\nNULL");

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

}

intmain()

{

inti,a[7]={10,20,30,40,50,60,70};

intx,sum;

LinkListHead;

Head=NULL;

scanf("%d",&x);

for(i=0;i<7;i++)

if(insert_i(&Head,a[i],i)!

=1)

break;

Show_LinkList(Head);

sum=Location_LinkList(Head,x);

if(insert_i(&Head,x,sum)!

=1)

printf("fail!

\n");

Show_LinkList(Head);

return0;

}

4.将线性表元素进行就地逆置

#include"stdio.h"

#include"stdlib.h"

typedefstructnode

{

intdata;

structnode*next;

}Node,*LinkList;

LinkListop_LinkList(LinkListHead)

{

Node*p,*q;

p=Head;

Head=NULL;

while(p)

{

q=p;

p=p->next;

q->next=Head;

Head=q;

}

returnHead;

}

intinsert_First(LinkList*Head_pointer,intx)

{

Node*p;

p=(LinkList)malloc(sizeof(Node));

if(p==NULL)

return-1;

p->data=x;

p->next=*Head_pointer;

*Head_pointer=p;

return1;

}

voidShow_LinkList(LinkListHead)

{

Node*p;

printf("\n");

p=Head;

if(p==NULL)

printf("\nNULL");

while(p!

=NULL)

{

printf("%d\n",p->data);

p=p->next;

}

}

intmain()

{

intm;

LinkListHead;

LinkListHL;

Head=NULL;

for(m=0;m<7;m++)

if(!

insert_First(&Head,m))

break;

Show_LinkList(Head);

HL=op_LinkList(Head);

Show_LinkList(HL);

return0;

}

5.将两个单链表合并为一个单链表

#include"stdio.h"

#include"stdlib.h"

typedefstructnode

{

intdata;

structnode*next;

}Node,*LinkList;

voidcontact(LinkListHead,LinkListHT)

{

Node*p;

p=Head;

while(p->next)

p=p->next;

p->next=HT;

}

intinsert_First(LinkList*Head_pointer,intx)

{

Node*p;

p=(LinkList)malloc(sizeof(Node));

if(p==NULL)

return-1;

p->data=x;

p->next=*Head_pointer;

*Head_pointer=p;

return1;

}

voidShow_LinkList(LinkListHead)

{

Node*p;

printf("\n");

p=Head;

if(p==NULL)

printf("\nNULL");

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

}

intmain()

{

intm;

LinkListHead;

LinkListHT;

Head=NULL;

HT=NULL;

for(m=0;m<20;m++)

if(!

insert_First(&Head,m))

break;

for(m=0;m<10;m++)

if(!

insert_First(&HT,m))

break;

Show_LinkList(Head);

Show_LinkList(HT);

contact(Head,HT);

Show_LinkList(Head);

return0;

}

5.实验总结:

理解线性表的逻辑特点;掌握了单链表的定义及C语言实现。

但是还有很多不清楚的地方运行时有许多错误。

说明:

1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;

2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;

3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;

4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;

5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1