附件2:
北京理工大学珠海学院实验报告
ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY
班级 XXX 3班 学号 0123456 姓名 XXX 指导教师 XIAO FENG 成绩
实验题目 单链表的定义及基本操作 实验时间 2013.12
一、实验目的、意义
(1)理解线性表中带头结点单链表的定义和逻辑图表示方法。 (2)熟练掌握单链表的插入,删除和查询算法的设计与实现。 (3)根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。
二、实验内容及要求
说明1:本次实验中的链表结构均为带头结点的单链表。
说明2: 学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。 具体要求:
建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。
三、实验所涉及的知识点
建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点等。
四、实验记录
调试过程中发现涉及到对链表的操作,比如设计所涉及到的函数不是很灵活,经过查找书本和询问同学后,经过多次编程尝试,一步一步解决了程序的语法错误,最终成功执行程序。
五、实验结果及分析
六、总结与体会
七、程序清单(包含注释)
#include #include #include
struct node{ /*个链表节点的结构体*/ int n; int num;
struct node*link; };
单
struct node*Lian();
void Search_n(struct node*link,int n); /*输入序号n ,查找序号为n 的结点,并输出*/
void Search_num(struct node*link,int num); void Insert(struct node*llist,struct node*p,int n);
void Delete(struct node*llist,int n); /*删除结点: 输入序号n ,删除序号为n 的结点,并输出该链表*/
void Show(struct node*llist); /*遍历链表*/
int main(void) {
struct node*llist,*p; int n,num,choice;
int size=sizeof(struct node); llist=Lian(); do{
printf(" 1:查找 2:删除 3:插入
printf("请输入需要的操作:"); scanf("%d",&choice); switch(choice){ case 0: break;
case 1:
//查找值
printf("输入要查找的值 : "); scanf("%d",&num);
Search_num(llist,num); break; case 3: //插入结点
printf("插入结点位置:"); scanf("%d",&n);
printf("插入结点数值:"); scanf("%d",&num);
p=(struct node *)malloc(size); p->n=n+1; p->num=num; p->link=NULL;
Insert(llist,p,num); break; case 2://删除结点
printf("删除结点: "); scanf("%d",&n);
退出\n"); 0:
Delete(llist,n); break; }
}while (choice!=0);
return 0; }
//新建链表
struct node*Lian() {
int i,num,n;
int size=sizeof(struct node); struct node *llist,*tail,*p; llist=tail=NULL;
printf("输入链表长度: "); scanf("%d",&n);
printf("输入链表的各个值:"); for(i=1;i
p=(struct node *)malloc(size); scanf("%d",&num); p->n=i;
p->num=num; p->link=NULL; if(llist==NULL) llist=p; else
tail->link=p; tail=p; }
return llist; }
/*查找值*/
void Search_num(struct node*llist,int num) {
struct node *ptr; if(llist==NULL){
printf("\n无结果!\n"); return; }
for(ptr=llist;ptr;ptr=ptr->link){ if(ptr->num==num){
printf("位置为 : %d\n\n",ptr->n); break; } }
if(ptr==NULL)
printf("\n无结果!\n"); }
/*插入操作*/
void Insert(struct node*llist,struct node*p,int n) {
int i=1,num;
struct node *ptr,*ptr1,*ptr2; ptr1=llist;
ptr2=llist->link;
while(ptr1->n!=n && ptr2!=NULL){ ptr1=ptr2;
ptr2=ptr2->link; }
if(ptr1->n==n){ p->link=ptr2; ptr1->link=p; }
for(ptr=llist;ptr;ptr=ptr->link){ ptr->n=i; i++; }
printf("输出链表:10 20 30 40 50\n"); printf("\n"); }
/*删除操作*/
void Delete(struct node*llist,int n) {
struct node *ptr,*ptr1,*ptr2; int i=1;
while(llist!=NULL && llist->n==n){ ptr2=llist;
llist=llist->link; free(ptr2); }
if(llist==NULL)
printf("\n无结果!\n");
ptr1=llist;
ptr2=llist->link; while(ptr2!=NULL){ if(ptr2->n==n){
ptr1->link=ptr2->link; free(ptr2); } else
ptr1=ptr2;
ptr2=ptr1->link; }
for(ptr=llist;ptr;ptr=ptr->link){ ptr->n=i; i++; }
Show(llist); }
/*遍历操作*/
void Show(struct node*llist) {
struct node*ptr;
printf("输出链表 :");
for(ptr=llist;ptr;ptr=ptr->link) printf("%3d",ptr->num); printf("\n"); printf("\n"); }
附件2:
北京理工大学珠海学院实验报告
ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY
班级 XXX 3班 学号 0123456 姓名 XXX 指导教师 XIAO FENG 成绩
实验题目 单链表的定义及基本操作 实验时间 2013.12
一、实验目的、意义
(1)理解线性表中带头结点单链表的定义和逻辑图表示方法。 (2)熟练掌握单链表的插入,删除和查询算法的设计与实现。 (3)根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。
二、实验内容及要求
说明1:本次实验中的链表结构均为带头结点的单链表。
说明2: 学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。 具体要求:
建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。
三、实验所涉及的知识点
建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点等。
四、实验记录
调试过程中发现涉及到对链表的操作,比如设计所涉及到的函数不是很灵活,经过查找书本和询问同学后,经过多次编程尝试,一步一步解决了程序的语法错误,最终成功执行程序。
五、实验结果及分析
六、总结与体会
七、程序清单(包含注释)
#include #include #include
struct node{ /*个链表节点的结构体*/ int n; int num;
struct node*link; };
单
struct node*Lian();
void Search_n(struct node*link,int n); /*输入序号n ,查找序号为n 的结点,并输出*/
void Search_num(struct node*link,int num); void Insert(struct node*llist,struct node*p,int n);
void Delete(struct node*llist,int n); /*删除结点: 输入序号n ,删除序号为n 的结点,并输出该链表*/
void Show(struct node*llist); /*遍历链表*/
int main(void) {
struct node*llist,*p; int n,num,choice;
int size=sizeof(struct node); llist=Lian(); do{
printf(" 1:查找 2:删除 3:插入
printf("请输入需要的操作:"); scanf("%d",&choice); switch(choice){ case 0: break;
case 1:
//查找值
printf("输入要查找的值 : "); scanf("%d",&num);
Search_num(llist,num); break; case 3: //插入结点
printf("插入结点位置:"); scanf("%d",&n);
printf("插入结点数值:"); scanf("%d",&num);
p=(struct node *)malloc(size); p->n=n+1; p->num=num; p->link=NULL;
Insert(llist,p,num); break; case 2://删除结点
printf("删除结点: "); scanf("%d",&n);
退出\n"); 0:
Delete(llist,n); break; }
}while (choice!=0);
return 0; }
//新建链表
struct node*Lian() {
int i,num,n;
int size=sizeof(struct node); struct node *llist,*tail,*p; llist=tail=NULL;
printf("输入链表长度: "); scanf("%d",&n);
printf("输入链表的各个值:"); for(i=1;i
p=(struct node *)malloc(size); scanf("%d",&num); p->n=i;
p->num=num; p->link=NULL; if(llist==NULL) llist=p; else
tail->link=p; tail=p; }
return llist; }
/*查找值*/
void Search_num(struct node*llist,int num) {
struct node *ptr; if(llist==NULL){
printf("\n无结果!\n"); return; }
for(ptr=llist;ptr;ptr=ptr->link){ if(ptr->num==num){
printf("位置为 : %d\n\n",ptr->n); break; } }
if(ptr==NULL)
printf("\n无结果!\n"); }
/*插入操作*/
void Insert(struct node*llist,struct node*p,int n) {
int i=1,num;
struct node *ptr,*ptr1,*ptr2; ptr1=llist;
ptr2=llist->link;
while(ptr1->n!=n && ptr2!=NULL){ ptr1=ptr2;
ptr2=ptr2->link; }
if(ptr1->n==n){ p->link=ptr2; ptr1->link=p; }
for(ptr=llist;ptr;ptr=ptr->link){ ptr->n=i; i++; }
printf("输出链表:10 20 30 40 50\n"); printf("\n"); }
/*删除操作*/
void Delete(struct node*llist,int n) {
struct node *ptr,*ptr1,*ptr2; int i=1;
while(llist!=NULL && llist->n==n){ ptr2=llist;
llist=llist->link; free(ptr2); }
if(llist==NULL)
printf("\n无结果!\n");
ptr1=llist;
ptr2=llist->link; while(ptr2!=NULL){ if(ptr2->n==n){
ptr1->link=ptr2->link; free(ptr2); } else
ptr1=ptr2;
ptr2=ptr1->link; }
for(ptr=llist;ptr;ptr=ptr->link){ ptr->n=i; i++; }
Show(llist); }
/*遍历操作*/
void Show(struct node*llist) {
struct node*ptr;
printf("输出链表 :");
for(ptr=llist;ptr;ptr=ptr->link) printf("%3d",ptr->num); printf("\n"); printf("\n"); }