【数据结构】线性表的操作算法

【数据结构】线性表的操作算法


实验内容

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)
在这里插入图片描述

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢热型网友.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值