单链表基本操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf(" ===============制作人:***===========\n");
printf("\n");
printf(" ==============系统功能菜单==============\n");
printf(" =======友情提醒:查询前请刷新系统!======\n");
printf(" ========================================\n");
linklist p;
printf("the data of L is:\n");
for(p=l->next;p!=NULL;p=p->next) printf("%d ",p->data);
printf("\n");
}
显示操作菜单函数scan()
(4.调试分析
1)分析算法的总体结构,分清程序中各部分应实现的功能;
要求:要有良好的人机界面,具备插入、删除、显示以及查找的功能。
三、实验要求
1.在问题分析的基础上选择合适的存储结构,进行算法设计,编制程序并上机调试成功。
2.按要求完成实验报告。
3.保存和打印出程序的运行结果,并结合程序进行分析。
四、实验步骤
1.需求分析
本演示程序用C语言编写,要有良好的人机界面,实现单链表的基本功能:插入、删除、显示以及查找。
printf("当前链表为:");
printList_L(L);
printf("\n");
printf("欢迎使用\n");
printf("\n");
printf(" -------☆-【单链表数据管理系统】-☆------\n");printf("\n");
printf("================================================================================\n");
LinkList p;
for(p=L->next;p!=NULL;p=p->next){
printf("%d",p->data);
printf("->");
printf("\t");
}
}
void main(){
printf("\n");
printf("\n");
printf("\n");
printf("---------★------------------------***学院----------------------★---------\n");
break;
case 2 :
printf("请输入要插入数的位置:");
scanf("%d",&i);
printf("请输入要插入的数:");
scanf("%d",&e);
L=ListInsert_L(L,i,e);
printf("插入后的链表为:\n");
printList_L(L);
break;
printf(" |--------------------------------------|\n");
printf(" | 3.删除数据|\n");
printf(" |--------------------------------------|\n");
printf(" |======================================|\n");
printf(" ========================================\n");
scanf("%d",&s);
switch(s){
case 1:
printf("请输入要查询的数:");
scanf("%d",&i);
e=GetElem_L(L,i,e);
printf("%d为第%d个数",e,i);
p=L;
j=0;
while(p->next&&j<i-1){
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
printf("该数字不存在!");
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return L;
}
//单链表打印
void printList_L(LinkList L){
}
return L;
}
//单链表的查找
int GetElem_L(LinkList L,int i,int &e){
LinkList p;
int j;
p=L->next;
j=1;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i)
printf("该数据不存在!");
e=p->data;
If (!p||j>i-1)return ERROR; //i小于1或大于表长+1
S=(LinkList)malloc(sizeof(LNode)); //生成新结点
s->data=e;s->next=p->next; //插入L中
p->next=s;
return OK;
}//ListInsert_L
E=p->data; //取第i个元素
Return OK;
}//GetElem_L
插入算法2.9
Status ListInsert _L(LinkList &L,int i,ElemType e){
//在带头结点的单链线性表L中第i个位置之前插入元素e
P=L;j=0;
While (p&&j<i-1){p=p->next; ++j;} //寻找第i-1个结点
1)输入的形式和输入值的范围:
通过键盘输入数据,输入的数据可以是数字或字符,如:3 -23 100 56
或r q m y u
2)输出的形式:
以单链表的形式输出。如:3-> -23-> 100-> 56
或r->q->m->y->u
3)预期结果:
要求体现良好的人机界面,插入、删除和查找数或字符之前,要给出提示信息,插入、删除和查找完成之后,要提示操作成功,并显示结果。
printf("\n");
printf("尊敬的用户:您好!\n");
printf("\n");
printf("\n");
printf("欢迎使用\n");
int s,i,e,e1;
LinkList L;
printf("请输入你要建立的链表的大小:");
scanf("%d",&s);
L=CreateList_L(s);
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
P=L->next;j=1; //初始化,p指向第一个结点,j为计数器
While(p&&j<i){ //顺时针向后查找,直到p指向第i个元素或p为空
P=p->next;++j;
}If(!p||j>i)return ERROR; //第i个元素不存在
}
If(!(->next)||j>i-1)return ERROR; //删除位置不合理
q=p->next; p->next=q->next; //删除并释放结点
e=q->data; free(q);
return OK;
}//ListDelete_L
输出单链表算法:…
void printlist_l(linklist l){
删除算法2.10
Status ListDelete_L(LinkList &L,int i,ElemType &e){
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
P=L;j=0;
While(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前趋
P=p->next;++j;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i){
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
Typedef struct LNode{
ElemType data;
Struct LNode *next;
}LNode, *LinkList;
(2)单链表的基本操作算法
构造单链表算法:…
查找算法2.8
Status GetElem_L(LinkList L,int i,ElemType &e){
//L为带头结点的单链表的头指针。
*****学院计算机科学与技术系
实验报告
实验名称单链表基本操作
专业班级姓名学号
指导教师成绩日期2011-11-4
一、实验目的
熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验内容
建立单链表,并实现单链表的插入、删除、查找运算。
2)调试方法通常有二种:总体调试、分块调试。你主要采用哪种调试方法?
总体调试:把算法组装成单个程序,按C程序结构标准分层检查调试;
分块调试:把算法分拆成几个功能模块,按C程序结构标准分模块调试;
3)错误跟踪有两种方法:错误信息排查法、执行路线跟踪法。
错误信息排查法:根据错误信息进行分类排查,要求分析者对C的错误代码要有足够的了解和认识,有经验的程序员多用此法。
2.概要设计
本程序包含7个函数:
①主函数main()
②显示操作菜单函数scan()
③构造单链表函数createlist_l()
④查找单链表函数locatelist_l()
⑤插入运算函数listinsert_l()
⑥删除运算函数listdelete_l()Leabharlann Baidu
⑦显示单链表函数printlist_l()
各函数间关系如下:
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return L;
}
//单链表有删除
LinkList ListDelete_L(LinkList L,int i,int &e){
int j;
LinkList p,q;
查找函数: locatelist_l()
插入函数:listinsert_l()
删除函数:listdelete_l()
输出函数:printlist_l( )
由上述结构可知,采用分功能模块调试的方法较合理,即主要功能按以下顺序实现:构造——查找——删除(或插入)——输出。
、实验总结(调试和运行程序过程中产生的问题及采取的措施;对算法的程序的讨论、分析,改进设想以及其它经验教训;对实验方式、组织、设备、题目的意见和建议等)
执行路线跟踪法:变量分析法(跟踪变量的值)、插入标签法(插入输出标签),这种方法适合初学者。
4)调试分析不宜面面俱到,具体写出关键问题就行。
分析如下:
主函数main()首先调用构造单链表函数createlist_l(),然后调用显示操作菜单函数scan(),再根据用户输入的数字选项分别调用以下函数:
case 3:
printf("请输入要删除数的位置:");
scanf("%d",&i);
L=ListDelete_L(L,i,e1);
printf("删除后的链表为:\n");
printf(" |======================================|\n");
printf(" | 1.查询数据|\n");
printf(" |--------------------------------------|\n");
printf(" | 2.插入数据|\n");
附源程序清单:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//单链表的建立
LinkList CreateList_L(int n){
LinkList L,p;
return i;
}
//单链表的插入
LinkList ListInsert_L(LinkList L,int i,int e){
LinkList p,s;
int j;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("该链表不存在!");
main()
createlist_l()
scan()
locatelist_l()listinsert_l()listdelete_l()printlist_l( )
3.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模块也都需要写出伪码算法。
(1)单链表Linklist的存储结构
printf("\n");
printf(" ==============系统功能菜单==============\n");
printf(" =======友情提醒:查询前请刷新系统!======\n");
printf(" ========================================\n");
linklist p;
printf("the data of L is:\n");
for(p=l->next;p!=NULL;p=p->next) printf("%d ",p->data);
printf("\n");
}
显示操作菜单函数scan()
(4.调试分析
1)分析算法的总体结构,分清程序中各部分应实现的功能;
要求:要有良好的人机界面,具备插入、删除、显示以及查找的功能。
三、实验要求
1.在问题分析的基础上选择合适的存储结构,进行算法设计,编制程序并上机调试成功。
2.按要求完成实验报告。
3.保存和打印出程序的运行结果,并结合程序进行分析。
四、实验步骤
1.需求分析
本演示程序用C语言编写,要有良好的人机界面,实现单链表的基本功能:插入、删除、显示以及查找。
printf("当前链表为:");
printList_L(L);
printf("\n");
printf("欢迎使用\n");
printf("\n");
printf(" -------☆-【单链表数据管理系统】-☆------\n");printf("\n");
printf("================================================================================\n");
LinkList p;
for(p=L->next;p!=NULL;p=p->next){
printf("%d",p->data);
printf("->");
printf("\t");
}
}
void main(){
printf("\n");
printf("\n");
printf("\n");
printf("---------★------------------------***学院----------------------★---------\n");
break;
case 2 :
printf("请输入要插入数的位置:");
scanf("%d",&i);
printf("请输入要插入的数:");
scanf("%d",&e);
L=ListInsert_L(L,i,e);
printf("插入后的链表为:\n");
printList_L(L);
break;
printf(" |--------------------------------------|\n");
printf(" | 3.删除数据|\n");
printf(" |--------------------------------------|\n");
printf(" |======================================|\n");
printf(" ========================================\n");
scanf("%d",&s);
switch(s){
case 1:
printf("请输入要查询的数:");
scanf("%d",&i);
e=GetElem_L(L,i,e);
printf("%d为第%d个数",e,i);
p=L;
j=0;
while(p->next&&j<i-1){
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
printf("该数字不存在!");
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return L;
}
//单链表打印
void printList_L(LinkList L){
}
return L;
}
//单链表的查找
int GetElem_L(LinkList L,int i,int &e){
LinkList p;
int j;
p=L->next;
j=1;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i)
printf("该数据不存在!");
e=p->data;
If (!p||j>i-1)return ERROR; //i小于1或大于表长+1
S=(LinkList)malloc(sizeof(LNode)); //生成新结点
s->data=e;s->next=p->next; //插入L中
p->next=s;
return OK;
}//ListInsert_L
E=p->data; //取第i个元素
Return OK;
}//GetElem_L
插入算法2.9
Status ListInsert _L(LinkList &L,int i,ElemType e){
//在带头结点的单链线性表L中第i个位置之前插入元素e
P=L;j=0;
While (p&&j<i-1){p=p->next; ++j;} //寻找第i-1个结点
1)输入的形式和输入值的范围:
通过键盘输入数据,输入的数据可以是数字或字符,如:3 -23 100 56
或r q m y u
2)输出的形式:
以单链表的形式输出。如:3-> -23-> 100-> 56
或r->q->m->y->u
3)预期结果:
要求体现良好的人机界面,插入、删除和查找数或字符之前,要给出提示信息,插入、删除和查找完成之后,要提示操作成功,并显示结果。
printf("\n");
printf("尊敬的用户:您好!\n");
printf("\n");
printf("\n");
printf("欢迎使用\n");
int s,i,e,e1;
LinkList L;
printf("请输入你要建立的链表的大小:");
scanf("%d",&s);
L=CreateList_L(s);
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
P=L->next;j=1; //初始化,p指向第一个结点,j为计数器
While(p&&j<i){ //顺时针向后查找,直到p指向第i个元素或p为空
P=p->next;++j;
}If(!p||j>i)return ERROR; //第i个元素不存在
}
If(!(->next)||j>i-1)return ERROR; //删除位置不合理
q=p->next; p->next=q->next; //删除并释放结点
e=q->data; free(q);
return OK;
}//ListDelete_L
输出单链表算法:…
void printlist_l(linklist l){
删除算法2.10
Status ListDelete_L(LinkList &L,int i,ElemType &e){
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
P=L;j=0;
While(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前趋
P=p->next;++j;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i){
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
Typedef struct LNode{
ElemType data;
Struct LNode *next;
}LNode, *LinkList;
(2)单链表的基本操作算法
构造单链表算法:…
查找算法2.8
Status GetElem_L(LinkList L,int i,ElemType &e){
//L为带头结点的单链表的头指针。
*****学院计算机科学与技术系
实验报告
实验名称单链表基本操作
专业班级姓名学号
指导教师成绩日期2011-11-4
一、实验目的
熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验内容
建立单链表,并实现单链表的插入、删除、查找运算。
2)调试方法通常有二种:总体调试、分块调试。你主要采用哪种调试方法?
总体调试:把算法组装成单个程序,按C程序结构标准分层检查调试;
分块调试:把算法分拆成几个功能模块,按C程序结构标准分模块调试;
3)错误跟踪有两种方法:错误信息排查法、执行路线跟踪法。
错误信息排查法:根据错误信息进行分类排查,要求分析者对C的错误代码要有足够的了解和认识,有经验的程序员多用此法。
2.概要设计
本程序包含7个函数:
①主函数main()
②显示操作菜单函数scan()
③构造单链表函数createlist_l()
④查找单链表函数locatelist_l()
⑤插入运算函数listinsert_l()
⑥删除运算函数listdelete_l()Leabharlann Baidu
⑦显示单链表函数printlist_l()
各函数间关系如下:
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return L;
}
//单链表有删除
LinkList ListDelete_L(LinkList L,int i,int &e){
int j;
LinkList p,q;
查找函数: locatelist_l()
插入函数:listinsert_l()
删除函数:listdelete_l()
输出函数:printlist_l( )
由上述结构可知,采用分功能模块调试的方法较合理,即主要功能按以下顺序实现:构造——查找——删除(或插入)——输出。
、实验总结(调试和运行程序过程中产生的问题及采取的措施;对算法的程序的讨论、分析,改进设想以及其它经验教训;对实验方式、组织、设备、题目的意见和建议等)
执行路线跟踪法:变量分析法(跟踪变量的值)、插入标签法(插入输出标签),这种方法适合初学者。
4)调试分析不宜面面俱到,具体写出关键问题就行。
分析如下:
主函数main()首先调用构造单链表函数createlist_l(),然后调用显示操作菜单函数scan(),再根据用户输入的数字选项分别调用以下函数:
case 3:
printf("请输入要删除数的位置:");
scanf("%d",&i);
L=ListDelete_L(L,i,e1);
printf("删除后的链表为:\n");
printf(" |======================================|\n");
printf(" | 1.查询数据|\n");
printf(" |--------------------------------------|\n");
printf(" | 2.插入数据|\n");
附源程序清单:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//单链表的建立
LinkList CreateList_L(int n){
LinkList L,p;
return i;
}
//单链表的插入
LinkList ListInsert_L(LinkList L,int i,int e){
LinkList p,s;
int j;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("该链表不存在!");
main()
createlist_l()
scan()
locatelist_l()listinsert_l()listdelete_l()printlist_l( )
3.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模块也都需要写出伪码算法。
(1)单链表Linklist的存储结构