线性顺序表的操作实现

一、上机实验的问题和要求:

线性表顺序存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、等)。

二、基本思想,原理和算法描述:

    首先基于线性表的顺序存储结构建一个单链表(下面的程序实现的是通过头插法逆序建表),在此基础上实现对单链表的赋值、取值、插入、删除以及两个表的归并,需要注意的是插入(删除)过程中指针的修改。

三、调试和运行程序过程中产生的问题及采取的措施:

   过程调试时未发现错误,但是运行时意外终止,仔细检查后发现有一因变量未赋初值,导致出现输入错误,改正后顺利运行,得到了期望的结果。

四、源程序及注释

//线性表顺序存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、归并等)

#include<iostream>

using namespace std;

#define OK 1

#define ERROR 0

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量

#define LISTINCREMENT 10  //线性表存储空间的分配增量

//#define ElemType int

typedef int ElemType;

typedef int Status;

typedef struct {

ElemType * elem; //线性表存储空间基址

int length; //当前线性表长度

int listsize; //当前分配的线性表存储空间的大小

}SqList;

//初始化操作

Status InitList_Sq(SqList &L) {

//构造一个空的顺序表L

L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));

if (!L.elem)

{

exit (ERROR); //存储分配失败

}

L.listsize = LIST_INIT_SIZE; //初始存储容量

L.length = 0; //空表长度为0

return OK;

}

//赋值操作

Status SetElem_Sq(SqList &L)

{

int n;

cout << "请输入构造的线性表中元素的个数:" ;

cin >> n;

cout << "请依次输入各个元素:" << endl;

for (int i = 0; i < n; i++)

{

cin >> L.elem[i];

}

L.length = n;

return OK;

}

//取值操作

Status GetElem_Sq(SqList L, int i, ElemType &e)

{

if ((i < 1) || (i > L.length))  //判断i是否非法

{

return ERROR;

}

e = L.elem[i - 1]; //将顺序表中第i个元素复制给e

return OK;

}

//插入操作

Status ListInsert_Sq(SqList &L, int i, ElemType e) {

//在顺序表L中第i个位置之前插入新的元素e,

//i的合法值1<=i<=L.length+1,当i=L.length+1时

//e插在表尾

if (i<1 || i>L.length + 1)    //判断i是否合法

{

cout << "位置不合适" << endl;

return ERROR;

}

if (L.length >= L.listsize) //判断顺序表是否已经满了

{

cout << "顺序表已经满了" << endl;

return ERROR;

}

for (int j = L.length - 1; j >= i - 1; --j) //插入位置及之后的元素后移一个位置

{

L.elem[j + 1] = L.elem[j];

}

L.elem[i - 1] = e; //插入e

L.length++; //表长增1

cout << "插入后";

Status TraverseList(SqList L);

TraverseList(L);

return OK;

}

//删除操作

Status ListDelete_sq(SqList L, int i, ElemType &e) {

//在顺序表L中删除第i个元素,并用e返回其值

//i的合法值为1<=i<=L.length,

//表空L.length=0 则i>L.length

if ((i < 1) || (i > L.length)) //i值不合法或表空

{

return ERROR;

}

e = L.elem[i - 1]; //被删除的元素复制给e

for (int j = i; j <= L.length - 1; ++j) //被删除元素之后的元素前移

{

L.elem[j - 1] = L.elem[j];

}

L.length--; // 表长减1

cout << "删除后";

Status TraverseList(SqList L);

TraverseList(L);

return OK;

}

//归并操作

Status MergeList_Sq(SqList La, SqList Lb, SqList &Lc) {

//已知顺序表La和Lb的元素按值非递减排列

//归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减排列

ElemType *pa = La.elem;

ElemType *pb = Lb.elem;

//对Lc进行初始化操作

Lc.listsize = Lc.length = La.length + Lb.length;

ElemType *pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));

if (!Lc.elem)

{

exit(ERROR);

}

ElemType *pa_last = La.elem + La.length - 1;

ElemType *pb_last = Lb.elem + Lb.length - 1;

while (pa <= pa_last && pb <= pb_last) {

//归并

if (*pa <= *pb)

{

*pc = *pa;

pc++;

pa++;

}

else

{

*pc++ = *pb++;

//*pc=*pb;

//pc++;

//pb++;

}

}

while (pa <= pa_last)

{

*pc++ = *pa++; //插入La的剩余元素

}

while (pb <= pb_last)

{

*pc++ = *pb++; //插入Lb的剩余元素

}

return OK;

}

//遍历输出

Status TraverseList(SqList L) {

//将线性表中的元素遍历输出

cout << "线性表中的元素为:" << endl;

for (int i = 0; i < L.length; i++)

{

cout << L.elem[i] << "  ";

}

cout << endl;

return OK;

}

//分隔符

Status fen_ge()

{

for (int f = 0; f < 3; f++)

{

for (int d = 0; d < 20; d++)

{

cout << "*";

}

cout << endl;

}

return OK;

}

void main()

{

SqList L;

//初始化操作

if (InitList_Sq(L))  

{

cout << "初始化成功!" << endl;

}

else

{

cout << "初始化失败!" << endl;

}

//赋值操作

SetElem_Sq(L);

//取值操作

cout << "请输入想要取出第几个元素:";

int i;

ElemType e;

cin >> i;  //取出第几个元素

GetElem_Sq(L, i, e);

cout << "取出的第"<<i<<"个元素为:"<<e << endl;

fen_ge(); //分割

//插入操作

int j; //第几个位置

ElemType k; //插入的元素

cout << "插入前";

TraverseList(L);

cout << "请输入想要插入的位置:";

cin >> j;

cout << "请输入想要插入的元素:";

cin >> k;

ListInsert_Sq(L, j, k);

fen_ge(); //分割

//删除操作

cout << "删除前";

TraverseList(L);

int a;

cout << "请输入想要删除元素的位置:";

cin >> a; //删除元素的位置

ElemType b;

ListDelete_sq(L, a, b);

cout << "删除的元素为:" << b<< endl;

fen_ge(); //分割

//归并操作

SqList La, Lb, Lc;

//初始化操作

if (InitList_Sq(La))

{

cout << "初始化La成功!" << endl;

}

else

{

cout << "初始化La失败!" << endl;

}

cout << "输入顺序表La的元素按值非递减排列:" << endl;

SetElem_Sq(La);

//初始化操作

if (InitList_Sq(Lb))

{

cout << "初始化Lb成功!" << endl;

}

else

{

cout << "初始化Lb失败!" << endl;

}

cout << "输入顺序表Lb的元素按值非递减排列:" << endl;

SetElem_Sq(Lb);

MergeList_Sq(La, Lb, Lc);

cout << "顺序表Lc的元素按值非递减排列:" << endl;

TraverseList(Lc);

system("pause");

}

  • 运行结果

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亦悰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值