线性表的操作算法讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数 据 结 构
实验报告
课题名称:线性表的操作算法
姓名:
班级:
学号:
一、内容提要
1、掌握使用cFree上机调试线性表的基本方法;
2、分别用数组和链表作为存储结构,实现线性表的插入、删除、查找、排序、合并等操作。
二、实验要求
1、设计对线性表进行链式存储操作的内容;
2、写出相应程序;
3、保存和打印出程序的运行结果,并结合程序进行分析;
printf("该元素的前驱元素为:%d\n",pre);
else
printf("顺序表中没有该元素!!!");
}break;
case 8:{
ElemType cur_e, nextE;
printf("\n输入《求后继元素》的指定元素的值:");
scanf("%d",&cur_e);
nextE=NextElem(&a,cur_e);
return;
}
8.查找前驱
ElemType PriorElem(SqList *L,ElemType cur_e)
{
int i=0,pre;
SqList *p;
p=L;
while(i<=L->length&&p->a[i]!=cur_e)
{
i++;
}
if(i>L->length)
return -1;
//删除
ElemType delete_sq(SqList *L,int i);
//查找
ElemType locat_sq(SqList L,ElemType e);
//清空
void DestroyList(SqList *L);
//查找前驱
ElemType PriorElem(SqList *L,ElemType cur_e);
void creat_list(SqList *L);
void out_list(SqList L);
void insert_sq(SqList *L,int i,ElemType e);
ElemType delete_sq(SqList *L,int i);
ElemType locat_sq(SqList L,ElemType e);
2.功能函数说明与定义
//加载头文件
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
//定义结构体类型
typedef struct
{ElemType a[MAXSIZE];
int length;
}SqList;
三、实验目的
1、理解数据结构中单链表的定义和建立。
2、掌握单链表中结点结构的C语言描述。
3、熟练掌握单链表的插入、删除、查找、排序、合并等算法的设计与C语言实现。
4、将理论与实际相结合,切实提高自己的逻辑能力和动手能力。
四、算法流程图
开始
创建
遍插删查查找查找合
历入除找前驱后继并
主函数
输出
结束
五、概要设计
printf("\n 5.查找值为e的元素");
printf("\n 6.清空顺序表");
printf("\n 7.输出指定元素的前驱元素");
printf("\n 8.输出指定元素的后继元素");
printf("\n 9.将两个非递减的线性表la和lb合并成一个新的非递减的线性表lc");
printf("\n 0.结束程序运行");
SqList a,la,lb,lc;
//以下是9个函数的声明
//顺序表的初始化-置空表
void init(SqList *slt);
//创建顺序表
void creat_list(SqList *L);
//输出顺序表
void out_list(SqList L);
//插入
void insert_sq(SqList *L,int i,ElemType e);
#define MAXSIZE 100
typedef int ElemType;
//定义结构体类型
typedef struct
{ElemType a[MAXSIZE];
int length;
}SqList;
SqList a,la,lb,lc;
//以下是9个函数的声明
void init(SqList *slt);
x=-1;}
else{ x=L->a[i-1];
for(j=i;j<=L->length-1;j++) L->a[j-1]=L->a[j];
L->length--;
}
return(x);
}
6.查找值为e的元素
ElemType locat_sq(SqList L, ElemType e)
{int i=0;
1.界面设置
1.建立顺序表,输入数据元素
2.输出顺序表
3.在i位置插入元素e
4.删除第i个元素,返回其值
5.查找值为e的元素
6.清空顺序表
7.输出指定元素的前驱元素
8.输出指定元素的后继元素
9.将两个非递减的线性表la和lb合并成一个新的非递减的线性表
0.结束程序运行
请输入您的选择(1,2,3,4,5,6,7,8,9,0)
}
if(i>L->length)
return -1;
else
{
nextE=p->a[i+1];
return nextE;
}
}
10.将两个非递减的线性表合并成一个新的非递减的线性表
void MergeList(SqList *la,SqList *lb,SqList lc)
{
//SqList *lc;
}break;
case 6:{
DestroyList(&a);
}break;
case 7:{
ElemType cur_e, pre;
printf("\n输入《求前驱元素》的指定元素的值:");
scanf("%d",&cur_e);
pre=PriorElem(&a,cur_e);
if(pre!=-1)
while(i<=L.length-1 && L.a[i]!=e)i++;
if(i<=L.length-1) return(i+1);
else return(-1);
}
7.清空顺序表
void DestroyList(SqList *L)
{
//free(L);
L->length=0;
printf("顺序表清空成功!!!");
//i++;
//j++;
}
//下面的for循环是对顺序表lc进行非递减排序
for(x=0; x<k; x++)
{
for(y=0; y<k-1-x; y++)
{
if(lc.a[y]>lc.a[y+1])
{
int temp = lc.a[y];
lc.a[y] = lc.a[y+1];
lc.a[y+1] = temp;
}
2.顺序表结点输入,顺序表的创建
void creat_list(SqList *L)
{int i;
printf("\n顺序表的长度n=");scanf("%d",&(L->length));
for(i=0;i<L->length;i++){printf("\n元素%d=",i);
scanf("%d",&(L->a[i]));
//主函数
int main()
{int i,k,loc;ElemType e,x;
do{printf("\n\n\n");
printf("\n 1.建立顺序表,输入数据元素");
printf("\n 2.输出顺序表");
printf("\n 3.在i位置插入元素e");
printf("\n 4.删除第i个元素,返回其值");
void DestroyList(SqList *L);
ElemType PriorElem(SqList *L,ElemType cur_e);
ElemType NextElem(SqList *L,ElemType cur_e);
void MergeList(SqList *la,SqList *lb,SqList lc);
}
}
}
//打印排序后的顺序表lc
printf("\n\n一个新的非递减的线性表为(排序后):\n");
for(i=0;i<k;i++)
{
printf("%d\t",lc.a[i]);
}
//out_list(lc);
}
六、运行结果
1.界面选项(根据提示选择需要进行的操作)
2.根据提示创建一个长度为5,0、1、2、3、4号元素分别为1,2,3,4,5的顺序表
}
printf("顺序表创建成功!!!");
}
3.遍历顺序表
void out_list(SqList L)
{int i;
printf("\n");
for(i=0;i<=L.length-1;i++)printf("%10d",L.a[i]);
printf("\n\n按Enter键,继续。");
}
4.在顺序表的i位置插入值为e的结点
L->a[i-1]=e;
L->length++;
}
}
5.删除顺序表中第i个位置的结点
ElemType delete_sq(SqList *L,int i)
{ElemType x;int j;
if(L->length==0)printf("\n是空表格。underflow !");
else if(i<1||i>L->length){printf("\n error i !");
int i,j,k;
i=j=k=0;
int x,y;
while(i<la->length)
{
lc.a[k++]=la->a[i++];
//insert_sq(&lc,i,la->a[i]);
//i++;
}
while(j<lb->length)
{
lc.a[k++]=lb->a[j++];
//insert_sq(&lc,i,lb->a[j]);
}break;
case 2:{out_list(a);
}break;
case 3:{printf("\n i,e(用逗号分隔开)="); scanf("%d,%d",&i,&e);
insert_sq(&a,i,e);out_list(a);
}break;
case 4:{printf("\n i=?");scanf("%d",&i);
if(nextE!=-1)
printf("该元素的后继元素为:%d\n",nextE);
else
printf("顺序表中没有该元素!!!");
void insert_sq(SqList * L,int来自百度文库i,ElemType e)
{int j;
if(L->length==MAXSIZE)printf("\n overflow !");
else if(i<1||i>L->length+1) printf("\n erroe i !");
else {for(j=L->length-1;j>=i-1;j--)L->a[j+1]=L->a[j];
else
{
pre=p->a[i-1];
return pre;
}
}
9.查找后继
ElemType NextElem(SqList *L,ElemType cur_e)
{
int i=0,nextE;
SqList *p;
p=L;
while(i<=L->length&&p->a[i]!=cur_e)
{
i++;
//查找后继
ElemType NextElem(SqList *L,ElemType cur_e);
//合并
void MergeList(SqList *la,SqList *lb,SqList lc);
3.各部分函数的建立
1.顺序表的初始化-置空表
void init(SqList *slt)
{
slt->length=0;
printf("\n=================================================================");
printf("\n请输入您的选择(1,2,3,4,5,6,7,8,9,0)");
scanf("%d",&k);
switch(k)
{ case 1:{creat_list(&a);
x=delete_sq(&a,i);out_list(a);
printf("\n x=%d",x);
}break;
case 5:{printf("\n e=");scanf("%d",&e);
loc=locat_sq(a,e);
if (loc==-1)printf("\n未找到%d",loc);
else printf("\n已找到,元素位置是%d",loc);
3.输出顺序表
4.在4号位置插入一个元素7
5.删除第3个元素
6.查找值为7的元素,结果为位置为3
7.查找元素4的前驱,结果为7
8.查找元素7的后继元素,结果为4
9.清空顺序表
10.创建2个非递减的线性表la和lb并合并成一个新的非递减线性表。
源代码
//加载头文件
#include<stdio.h>
#include<stdlib.h>
相关文档
最新文档