- 1 -
实验报告
化学实验报告单总流体力学实验报告观察种子结构实验报告观察种子结构实验报告单观察种子的结构实验报告单
1
课程 数据结构 实验名称 顺序
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
基本操作 第 页
专业 计算机科学与技术 班级_ _ 学号_ _ 姓名
实验日期: 2010 年 9 月 8 日 评分
一、实验目的
1.学会定义线性表的顺序存储类型,实现 C程序的基本结构,对线性表的一
些基本操作和具体的函数定义。
2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运
算。
二、实验要求
1.预习 C 语言中结构体的定义与基本操作
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
。
2.对顺序表的每个基本操作用单独的函数实现。
3.编写完整程序完成下面的实验内容并上机运行。
4.整理并上交实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
。
三、实验内容
1.编写程序实现顺序表的下列基本操作:
(1)初始化顺序表 La。
(2)将 La 置为空表。
(3)销毁 La。
(4)在 La 中插入一个新的元素。
(5)删除 La 中的某一元素。
(6)在 La 中查找某元素,若找到,则返回它在 La 中第一次出现的位置,
否则返回 0。
(7)打印输出 La 中的元素值。
2.编写程序完成下面的操作:
(1)构造两个顺序线性表 La 和 Lb,其元素都按值非递减顺序排列。
(2)实现归并 La 和 Lb 得到新的顺序表 Lc,Lc 的元素也按值非递减顺
序排列。
(3)假设两个顺序线性表 La和 Lb 分别表示两个集合 A 和 B,利用
union_Sq 操作实现 A=A∪B。
四、实验步骤
一
1.编写头文件。定义数据类型。分别写各个函数如 ListInsern_Sq ,
ListDelete_Sq,LocateElem 等函数。
2.编写主函数。在主函数里构造空的线性表,然后利用 ListInsert 函数使用户
初始化线性表。然后调用函数操作,操作结果用 PrintList_Sq 打印出线性表的内
容
3.运行程序,完整代码见下:
- 2 -
//data struct 实验一 线性表基本操作 1
#include
#include
//#include
//using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define YES 1
#define NO 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status cmp(ElemType a,ElemType b)
{
if(a==b)
return YES;
else
return NO;
}
Status InitList_Sq(SqList &L)
{//构造空的顺序表 La
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status Destroy_Sq(SqList &L)
{//撤销线性表 L;
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
- 3 -
return OK;
}
Status ClearList_Sq(SqList &L)
{//清空线性表
L.length=0;//memset(L,0,sizeof(L));
return OK;
}
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{// 在顺序线性表 L 的第 i 个元素之前插入新的元素 e
ElemType *p;
if (i < 1 || i > L.length+1) return ERROR;
if (L.length >= L.listsize)
{
ElemType *newbase = (ElemType
*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof (ElemType));
if (!newbase) return ERROR;
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElemType *q = &(L.elem[i-1]);
for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
*q = e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
{ // 在顺序线性表 L 中删除第 i 个元素,并用 e 返回其值
ElemType *p, *q;
if (i<1 || i>L.length) return ERROR;
p = &(L.elem[i-1]);
e = *p;
q = L.elem+L.length-1;
for (++p; p<=q; ++p) *(p-1) = *p;
--L.length;
return OK;
} // ListDelete_Sq
Status LocateElem_Sq(SqList L, ElemType e,Status (*compare)(ElemType,
ElemType))
{ // 在顺序线性表 L 中查找第 1 个值与 e 满足 compare()的元素的位序
int i;
ElemType *p;
i = 1;
p = L.elem;
- 4 -
while (i <= L.length && !(*compare)(*p++, e))
++i;
if (i <= L.length) return i;
else return 0;
}
void PrintList_Sq(SqList L)
{
int i;
for(i=0;i
#include
#define TRUE 1
#define FALSE 0
#define YES 1
#define NO 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType ;
#define LIST_INIT_SIZE 100
#define LISTINCERMENT 10
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L)
{//构造空的顺序表 La
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
- 7 -
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
/**/Status ListInsert_Sq(SqList &L, int i, ElemType e)
{// 在顺序线性表 L 的第 i 个元素之前插入新的元素 e
ElemType *p;
if (i < 1 || i > L.length+1) return ERROR;
if (L.length >= L.listsize)
{
ElemType *newbase = (ElemType
*)realloc(L.elem,(L.listsize+LISTINCERMENT)*sizeof (ElemType));
if (!newbase) return ERROR;
L.elem = newbase;
L.listsize += LISTINCERMENT;
}
ElemType *q = &(L.elem[i-1]);
for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
*q = e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
{ // 在顺序线性表 L 中删除第 i 个元素,并用 e 返回其值
ElemType *p, *q;
if (i<1 || i>L.length) return ERROR;
p = &(L.elem[i-1]);
e = *p;
q = L.elem+L.length-1;
for (++p; p<=q; ++p) *(p-1) = *p;
--L.length;
return OK;
} // ListDelete_Sq
Status cmp(ElemType a,ElemType b)
{
if(a==b)
return YES;
else
return NO;
}
Status LocateElem_Sq(SqList L, ElemType e,Status (*compare)(ElemType,
ElemType))
{ // 在顺序线性表 L 中查找第 1 个值与 e 满足 compare()的元素的位序
- 8 -
int i;
ElemType *p;
i = 1;
p = L.elem;
while (i <= L.length && !(*compare)(*p++, e))
++i;
if (i <= L.length) return i;
else return 0;
}
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)
{ // 已知顺序线性表 La 和 Lb 的元素按值非递减排列。归并 La 和 Lb 得到新
的顺序线性表 Lc,Lc 的元素也按值非递减排列。
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa = La.elem; pb = Lb.elem;
Lc.listsize = Lc.length = La.length+Lb.length;
pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
if (!Lc.elem)
exit(OVERFLOW); // 存储分配失败
pa_last = La.elem+La.length-1;
pb_last = Lb.elem+Lb.length-1;
while (pa <= pa_last && pb <= pb_last) { // 归并
if (*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while (pa <= pa_last) *pc++ = *pa++; // 插入 La 的剩余元素
while (pb <= pb_last) *pc++ = *pb++; // 插入 Lb 的剩余元素
} // MergeList
void Union_Sq(SqList &La,SqList Lb)
{
int len1=La.length;
int len2=Lb.length;
int i,pl;ElemType e;//
for(i=1;i<=len2;i++)
{
pl=LocateElem_Sq(La,Lb.elem[i-1],cmp);
if(pl==0)
{
ListInsert_Sq(La,++len1,Lb.elem[i-1]);
}
}
len1=La.length;
for(i=0;i
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
1.函数指针的使用:
定义函数,写函数代码。
函数头,是一个函数指针,值向调用的函数,这个调用的函数即为主函数中的
上面一段的意思即:在主函数中调用这个 LocateElem_Sq 函数,然后其中就是的
*compare 指向 cmp 这个函数的入口,所以 compare=cmp,LocateElem_Sq 函数中
将调用 cmp 函数。
2.使用 malloc 函数需要包含一个头文件#include
3.用 Typedef int ElemType 之后,定义数据类型直接用 ElemType,这样需
要改变数据类型是只需改变 Typedef **** ElemType 即可,****为需要改变
为什么类型的数据。
4.疑问:
在写 ClearList_Sq 函数时,直接使用 memset 函数会出错。出错时提示,数
据类型不一致。
七、思考与提高
假设两个顺序线性表 La和 Lb 分别表示两个集合 A和 B,如何实现 A=A ∩
B ?
答:对于每一个 Lb 中的元素利用 LocateElem_Sq 查找在 La 中是否有,有
则返回该元素在 La 中的位置,然后用 ListDelete_Sq 删除该元素。同时删除 A
中其他相同的元素。