顺序表基本操作的实现

实验一 顺序表基本操作的实现

一、实验学时: 2学时

二、实验目的

  • 实现顺序表的基本操作

三、实验内容

  1. 顺序表的建立、取指定元素、返回指定元素位置
  2. 顺序表中插入新元素、删除指定元素操作的实现

四、主要仪器设备及耗材

  • 硬件:计算机一台
  • 软件:VC++ 6.0,MSDN2003或者以上版本

五、实验步骤

  1. 分析问题
  2. 写出算法
  3. 编制程序
  4. 上机调试
  5. 分析结果

六、程序清单

#include
#include
#include			//要用exit所以加它 
#define OK 1				//成功返回值 
#define ERROR 0         	//出错返回值 
#define OVERFLOW -2    		//溢出返回值 
#define MAXSIZE 10000   	//空间大小 
//用户自定义类型Status 
typedef int Status;

//定义图书结构体 
typedef struct
{
	char no[20];		//书号 
	char name[50];		//书名 
	float price;		//价格 
}Book;

//用户自定义类型SqList 
typedef struct
{
	Book *elem;		//图书指针 
	int length;		//图书顺序表长度 
}SqList;

//初始化顺序表 
Status InitList(SqList &L)		//形参要的是SqList的引用,调用时是InitList(L),因为引用更改后它本身就更改了。不然传的只是副本,对原值无影响。 
{
	L.elem=new Book[MAXSIZE];	//为顺序表分配一个MAXSIZE大小的数组空间 
	if(!L.elem) exit(OVERFLOW);	//分配失败退出 
	L.length=0;					//空表长度为0 
	return OK;
}

//取值 
Book GetElem(SqList L,int i)	//取出顺序表位于第i个位置的元素 
{
    if(i<1||i>L.length) printf("取值操作异常");	//取值异常 
    return L.elem[i-1];							//返回找到的值 
}

//查找 
int LocateElem(SqList L,Book e)		//查找元素e在顺序表中的位置 
{
	int i;
    for(i=0;i<L.length;i++)
        if(strcmp(L.elem[i].no,e.no)==0&&strcmp(L.elem[i].name,e.name)==0&&L.elem[i].price==e.price) return i+1;
    return 0;
}

//插入 
Status ListInsert(SqList &L,int i,Book e)	//将元素e插入到顺序表L的第i的位置 
{
    if((i<1)||(i>L.length+1)) return ERROR;
    if(L.length==MAXSIZE) return ERROR;
    int j;
    for(j=L.length-1;j>=i-1;j--)
        L.elem[j+1]=L.elem[j];				//i位置及以后的元素整体后移 
    L.elem[i-1]=e;
    ++L.length;
    return OK;
}

//删除 
SqList ListDelete(SqList &L,int i)
{
    if((i<1)||(i>L.length+1)) printf("删除异常");
    int j; 
    for(j=i;j<=L.length-1;j++)
        L.elem[j-1]=L.elem[j];				//被删元素后面的整体前移 
    --L.length;
    return L;
}

int main()
{
	SqList L;
	Status status = InitList(L);
	if(!status)
	{
		printf("顺序表初始化失败!\n");
		return ERROR;	
	}
	else
	{
		printf("顺序表初始化成功!\n");
		Book e;
		printf("请录入图书信息:\n");
		printf("书号:");scanf("%s",&e.no);
		printf("书名:");scanf("%s",&e.name);
		printf("价格:");scanf("%f",&e.price);
		int i;
		for(i=1;;++i)
		{
			ListInsert(L,i,e);
			printf("成功收藏%d本书至图书馆\n",i);
			printf("书号:");scanf("%s",&e.no);
			printf("书名:");scanf("%s",&e.name);
			printf("价格:");scanf("%f",&e.price);
			if(e.price==0)
				break;
		}
		
		printf("图书馆共%d本书\n",L.length);
		printf("图书馆的图书列表:\n");
		Book e1;
		int j;
		printf("编号\t书名\t\t价格\n");
		for(j=1;j<=L.length;j++)
		{
			e1=GetElem(L,j);
			printf("%s\t",e1.no);
			printf("%s\t",e1.name);
			printf("%-7.2f\n",e1.price);
		}
		Book e2={"10102","计算机组成原理",46.5};
		int location = LocateElem(L,e2);
		printf("其中第%s在第%d个位置\n",e2.name,location); 
		printf("------------------------------\n"); 
		
		printf("删除第二本后的列表:\n"); 
		SqList sl = ListDelete(L,2);
		printf("图书馆共%d本书\n",sl.length);
		printf("图书馆的图书列表:\n");
		printf("编号\t书名\t\t价格\n");
		for(j=1;j<=sl.length;j++)
		{
			e2=GetElem(sl,j);
			printf("%s\t",e2.no);
			printf("%s\t",e2.name);
			printf("%-7.2f\n",e2.price);
		}
	}
}

七、运行结果及分析
顺序表基本操作的实现_第1张图片
八、小总结

  • 建立顺序表(初始化):初始化就是用指针指向新分配的空间,若内存不足分配失败则退出,否的话长度置为0,然后返回OK。
  • 取指定位置元素(取值):就是超出范围取值异常,在范围内就返回第i个元素。
  • 返回指定元素位置(查找):循环查找,如果是基本数据类型相等就行了,像本程序中用的是Book结构体类型,所以要比较每一个数据,都相等则返回位置。
  • 向指定位置插入元素(插入):超出范围和溢出都报错,i位置及以后的元素整体后移空出位置i放元素e,然后长度加1。
  • 删除指定位置元素(删除):超出范围报错,否则被删元素后面的元素整体前移,长度减1。
  • 要说的问题:&L与L
    参数里的这两者区别,带&是传的引用,可以更改L里的数据,不然的话只是传了一个副本,形参改变对实参无影响。

你可能感兴趣的:(数据结构)