一、上机实验的问题和要求:
线性表顺序存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、等)。
二、基本思想,原理和算法描述:
首先基于线性表的顺序存储结构建一个单链表(下面的程序实现的是通过头插法逆序建表),在此基础上实现对单链表的赋值、取值、插入、删除以及两个表的归并,需要注意的是插入(删除)过程中指针的修改。
三、调试和运行程序过程中产生的问题及采取的措施:
过程调试时未发现错误,但是运行时意外终止,仔细检查后发现有一因变量未赋初值,导致出现输入错误,改正后顺利运行,得到了期望的结果。
四、源程序及注释
//线性表顺序存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、归并等)
#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");
}
- 运行结果