实验一线性表的基本操作
一、实验目的
1. 熟悉C/C++语言上机环境;
2. 掌握线性表的基本操作:查找、插入、删除等运算在顺序存储、链式存储结构上的运算。
二、实验环境
1. 装有Visual C++6.0的计算机。
2. 本次实验共计2学时。
三、实验内容
1. 建立顺序表,基本操作包括:初始化、建立顺序表、输出顺序表、判断是否为空、取表中第i个元素、查找、插入和删除。
并在主函数中完成对各种函数的测试。
2. 设有两个非递增有序的线性表A和B,均已顺序表作为存储结构。
编写算法实现将A表和B表合并成一个非递增有序排列的线性表(可将线性表B插入线性表A中,或重新创建线性表C)。
3. 建立单链表,基本操作包括:初始化、判断是否为空、取表中第i个元素、查找、插入和删除。
并在主函数中完成对各种函数的测试。
四、源程序
#include <stdio.h>
#include <malloc.h>
#include <iostream.h>
#define MaxSize 50
typedef char ElemType;
//-------存储结构----------
typedef struct
{
ElemType elem[MaxSize]; //存放顺序表中的元素
int length; //存放顺序表的长度
} SqList;
//-------初始化线性表----------
void InitList(SqList *&L) //初始化线性表,构造一个空的线性表,并将长度设置为0
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
//-------释放线性表-----------------
void DestroyList(SqList *L) //销毁线性表,即释放线性表所占用的内存空间
{
free(L);
}
//-------判断线性表是否为空--------
int ListEmpty(SqList *L) //判断线性表是否为空即看其长度是否为0
{
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->elem[i]);
printf("\n");
}
//------取值---------
int GetElem(SqList *L,int i,ElemType &e)//求线性表中某个数据元素的值
{
if (i<1 || i>L->length)
return 0;
e=L->elem[i-1];
return 1;
}
//-----------查找-------------
int LocateElem(SqList *L, ElemType e)//按元素查找,找到与该元素值相同的元素并返回其序号
{
int i=0;
while (i<L->length && L->elem[i]!=e) i++;
if (i>=L->length)
return 0;
else
return i+1;
}
//-------------插入操作
int ListInsert(SqList *&L,int i,ElemType e)//插入数据元素,在第i个位置上插入新元素,使后面的元素依次后移,并是长度加1;
{
int j;
if (i<1 || i>L->length+1)
return 0;
i--; /*将顺序表位序转化为elem下标*/ for (j=L->length;j>i;j--) /*将elem[i]及后面元素后移一个位置*/ L->elem[j]=L->elem[j-1];
L->elem[i]=e;
L->length++; /*顺序表长度增1*/
return 1;
}
//-------------删除表中元素---------
int ListDelete(SqList *&L,int i,ElemType &e) //删除某个元素,使后面的元素依次前移,并将线性表的长度减1;
{
int j;
if (i<1 || i>L->length)
return 0;
i--; /*将顺序表位序转化为elem下标*/ e=L->elem[i];
for (j=i;j<L->length-1;j++)
L->elem[j]=L->elem[j+1];
L->length--;
return 1;
}
//-----------主函数-------------
void main() //主函数,主要为各个函数的调用{
SqList *L;
ElemType e;
cout<<"初始化顺序表L:"<<endl;
//调用初始化函数
InitList(L);
cout<<"插入a,b,c,d,e元素"<<endl;
//调用插入函数ListInsert
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListInsert(L,3,'c');
ListInsert(L,4,'d');
ListInsert(L,5,'e');
//调用输出函数DispList
cout<<"输出顺序表L:"<<endl;
DispList(L);
//调用函数求链表长度
cout<<"顺序表L长度"<<ListLength(L)<<endl;
cout<<"顺序表L为"<<((ListEmpty(L)?"空":"非空"));
//取值
GetElem(L,3,e);
cout<<"顺序表L的第3个元素"<<e<<endl;
cout<<"元素a的位置"<<LocateElem(L,'a');
cout<<"在第4个元素位置上插入f元素"<<endl;
//调用插入函数ListInsert
ListInsert(L,4,'f');
cout<<"输出顺序表L:"<<endl;
DispList(L);
cout<<"删除L的第3个元素"<<endl;
ListDelete(L,3,e);
cout<<"输出顺序表L:"<<endl;
DispList(L);
cout<<"释放顺序表L"<<endl;
DestroyList(L);
五.实验心得
通过这次实验,掌握了线形表的定义,顺序存储及链式存储的方法及基本操作。
我们可以使用线性表来解决生活中一些计算比较繁杂或学生成绩等的问题,必须注意的是,我们应该正确理解什么是线性表,还有线性表各种存储结构的优缺点,这样对某一个问题时才能选择出最适合的方法。
编程的时候遇到了一些问题,都在老师和同学的帮助下解决了,以后要加强自己的实践能力,多编写程序,争取更好的掌握数据结构这门课。