实验内容
1.编写线性表定义及基本操作函数 例如:建立具有5个元素的顺序表。
L=(a,b,c,d,f)
并完成如下操作:
(1)输出线性表
(2)求线性表L的长度
(3)获取第3个元素的值
(4)获取元素 a 在线性表中的位置
(5)在第4个元素前,插入元素g
(6)删除第3个元素的值
2.编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。
例如:LA=(a,c,b) LB=(a,d,b) LC=LA∪LB LC=(a,c,b,d)
设计思路
(1)创建一个线性表,将给定的含有n个元素的数组中的每个元素依次放入到顺序表中,并将n赋给顺序表的长度成员。算法如下
void CreateList(SqList *&L,ElemType a[],int n)
//建立顺序表
{
int i;
L=(SqList *)malloc(sizeof(SqList));
for (i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
(2)初始化线性表
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
L->length=0;
}
(3)销毁线性表,释放线性表L所占用的内存空间
void DestroyList(SqList *&L)
{
free(L);
}
(4)判断是否为空表,若L为空表则返回true,否则返回false
int ListEmpty(SqList *L)
{
return(L->length==0);
}
(5)求线性表的长度ListLength(L)
int ListLength(SqList *L)
{
return(L->length);
}
(6)输出运算表(DispList)
该运算当线性表L不为空时,顺序显示L中各元素的值
void DispList(SqList *L)
{
int i;
if (ListEmpty(L)) return;
for (i=0;i<L->length;i++)
printf("%c ",L->data[i]);
printf("\n");
}
(7)求某个数据元素的值GetElem(L,i,&e)
该运算返回L中第 i(1≤i≤ListLength(L))个元素的值,存放在e中。
bool GetElem(SqList *L,int i,ElemType &e)
{if (i<1 || i>L->length)
return false;
e=L->data[i-1];
return true;
}
(8)插入数据元素
该运算在顺序表L的第i(1≤i≤ListLength(L)+1)个位置上插入新的元素e。如果i值不正确,则显示相应错误信息;否则将顺序表原来第i个元素及以后元素均后移一个位置,移动方向从右向左,如下图所示,腾出一个空位置插入新元素,最后顺序表长度增1。
bool ListInsert(SqList *&L,int i,ElemType e)
{ int j;
if (i<1 || i>L->length+1)
return false; //参数错误时返回false
i--; //将顺序表逻辑序号转化为物理序号
for (j=L->length;j>i;j--)//将data[i..n]元素后
移一个位置
L->data[j]=L->data[j-1];
L->data[i]=e;//插入元素e
L->length++;//顺序表长度增1
return true;//成功插入返回true
}
(9)删除数据元素
该运算删除顺序表L的第i(1≤i≤ListLength(L))个元素。如果i值不正确,则显示相应错误信息;否则将线性表第i个元素以后元素均向前移动一个位置,移动方向为从左向右,如下图所示,这样覆盖了原来的第i个元素,达到删除该元素的目的,最后顺序表长度减1。
bool ListDelete(SqList *&L,int i,ElemType &e)
{ int j;
if (i<1 || i>L->length)//参数错误时返回false
return false;
i--;//将顺序表逻辑序号转化为物理序号
e=L->data[i];
for (j=i;j<L->length-1;j++) //将data[i..n-1]元素前移
L->data[j]=L->data[j+1];
L->length--; //顺序表长度减1
return true; //成功删除返回true
}
合并两个线性表的算法流程
初始化线性表LA,LB,并为其赋值。然后,初始化LC,开始遍历LA中的元素,插入到LC中,同样的,遍历LB中的元素,插入到LC中,如果LA与LB中无相同元素则一直循环直至LA与LB中的元素都插入到LC中。
实验代码
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize]; //存放顺序表元素
int length; //存放顺序表的长度
} SqList; //顺序表的类型定义
void CreateList(SqList *&L,ElemType a[],int n)
//建立顺序表
{
int i;
L=(SqList *)malloc(sizeof(SqList));
for (i=0; i<n; i++)
L->data[i]=a[i];
L->length=n;
}
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
L->length=0;
}
void DestroyList(SqList *&L)
{
free(L);
}
int ListEmpty(SqList *L)
{
return(L->length==0);
}
int ListLength(SqList *L)
{
return(L->length);
}
void DispList(SqList *L)
{
int i;
if (ListEmpty(L)) return;
for (i=0; i<L->length; i++)
printf("%c ",L->data[i]);
printf("\n");
}
int GetElem(SqList *L,int i,ElemType &e)
{
if (i<1 || i>L->length)
return 0;
e=L->data[i-1];
return 1;
}
int LocateElem(SqList *L, ElemType e)
{
int i=0;
while (i<L->length && L->data[i]!=e) i++;
if (i>=L->length)
return 0;
else
return i+1;
}
int ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if (i<1 || i>L->length+1)
return 0;
i--; //将顺序表位序转化为elem下标
for (j=L->length; j>i; j--) //将data[i]及后面元素后移一个位置
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++; //顺序表长度增1
return 1;
}
int ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if (i<1 || i>L->length)
return 0;
i--; //将顺序表位序转化为elem下标
e=L->data[i];
for (j=i; j<L->length-1; j++) //将data[i]之后的元素前移一个位置
L->data[j]=L->data[j+1];
L->length--; //顺序表长度减1
return 1;
}
#include "sqlist.h" //假设线性表以顺序表表示
int main()
{
SqList *L;
ElemType e;
//方法一:
InitList(L);
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListInsert(L,3,'c');
ListInsert(L,4,'d');
ListInsert(L,5,'f');
/*方法二:
ElemType b[]={'a','b','c','d','m'};
CreateList(L,b,5);*/
printf("刚建立的线性表元素如下:\n");
DispList(L);
printf("线性表的长度为:%d\n",ListLength(L));
GetElem(L,3,e);
//printf("取到的第三个元素是:\n");
printf("取到的第三个元素是:e=%c\n",e);
printf("LocateElem(L,'a')=%d\n",LocateElem(L,'a'));
ListInsert(L,4,'g');
DispList(L);
ListDelete(L,3,e);
DispList(L);
DestroyList(L);
return 0;
}
//线性表的合并
#include "sqlist.cpp"
int main()
{
int a=0,b=0;
ElemType e1,e2;
SqList *LA,*LB,*LC;
InitList(LA);
ListInsert(LA,1,'a');
ListInsert(LA,2,'c');
ListInsert(LA,3,'b');
printf("LA:");
DispList(LA);
InitList(LB);
ListInsert(LB,1,'a');
ListInsert(LB,2,'d');
ListInsert(LB,3,'b');
printf("LB:");
DispList(LB);
printf("LC=LAULB\n");
InitList(LC);
a = ListLength(LA);
b = ListLength(LB);
for(int i=1 ; i<=a; i++)
{
GetElem(LA,i,e1);
ListInsert(LC,i,e1);
}
int c=0;
for(int i=1; i<=b; i++)
{
GetElem(LB,i,e2);
if(!LocateElem(LC,e2))
{
c++;
ListInsert(LC,a+c,e2);
}
}
printf("LC:");
DispList(LC);
return 0;
}
实验成果
1.编写线性表定义及基本操作函数
2.编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。
例如:LA=(a,c,b) LB=(a,d,b) LC=LA∪LB LC=(a,c,b,d)