2021-09-14

实验一:线性表的基本操作

【实验目的】
学习掌握线性表的顺序存储结构的设计与操作。对顺序表建立、插入、删除、查找的基本操作算法。
【实验内容】

  1. 建立5个元素的顺序表,如s=sqlist[]={1,2,3,4,5},实现顺序表建立的基本操作。
  2. 在sqlist []={1,2,3,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。
  3. 在sqlist []={1,2,3,4,9,5}中删除指定位置(i=5)上的元素9,实现顺序表的删除的基本操作。
  4. 输出顺序表中的所有元素。
  5. 在顺序表中查找任一元素。
    【源代码】
#include <stdio.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define  MAXSIZE 100     //最大长度
typedef  struct {
      ElemType  *elem;     //指向数据元素的基地址
      int  length;          //线性表的当前长度
 }SqList;

Status InitList(SqList &L)
{				//构造一个空的线性表L
     L.elem=new ElemType [MAXSIZE];
//为线性表动态分配存储空间
	if(!L.elem)	exit(OVERFLOW); //检验是否分配成功
	L.length=0;
	return OK;
}//InitList_Sq

Status CreateSqList(SqList &L,int n)
{
	for(int i=0;i<n;i++)
		cin>>L.elem[i];
	L.length=n;
	return OK;
}

void TraverList(SqList L)
{
	printf("\n顺序表中的元素为:");
	for(int i=0;i<L.length;i++)
		cout<<L.elem[i]<<" ";
	cout<<endl;
}

int LocateElem(SqList L,ElemType e)
{       //在线性表L中查找值为e的数据元素,返回其序号
       for (int i=0;i< L.length;i++)
             if (L.elem[i]==e) return i+1; //查找成功,返回序号i+1
      return 0;                //查找失败,返回0
}

Status ListInsert(SqList &L,int i ,ElemType e){
if(i<1 || i>L.length+1) return ERROR;    //i值不合法
    if(L.length==MAXSIZE) 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放入第i个位置
    ++L.length;			//表长增1
    return OK;
}


Status ListDelete(SqList &L,int i)
{
   if((i<1)||(i>L.length)) return ERROR;   //i值不合法
   for (int j=i;j<=L.length-1;j++)
		L.elem[j-1]=L.elem[j];  //被删除元素之后的元素前移
   --L.length;                    //表长减1
   return OK;
}

void menu()
{
	cout<<"****************************"<<endl;
	cout<<"  0:退出"<<endl;
	cout<<"  1:初始化"<<endl;
	cout<<"  2:建表"<<endl;
	cout<<"  3:遍历"<<endl;
	cout<<"  4:按值查找元素"<<endl;
	cout<<"  5:插入元素;"<<endl;
	cout<<"  6:删除元素;"<<endl;
	cout<<"****************************"<<endl;
}

int main()
{
	SqList L;
	int choose,i,e,n;
	menu();
    while(1)
	{
	   cout<<"选择要执行的基本操作:";
       cin>>choose;
	   switch(choose)
		{
			case 1:
				InitList(L);
				break;
			case 2:
				cout<<"输入表中元素个数:";
				cin>>n; 
				CreateSqList(L,n);
				break;
			case 3:
				TraverList(L);
				break;
			case 4:
				cout<<"输入要查找元素的值:"<<endl;
				scanf("%d",&e);
				if(LocateElem(L,e))
					cout<<"该元素的位置是第"<<LocateElem(L,e)<<"位。"<<endl;
				else
					cout<<"该元素不存在!"<<endl;
				break;	
			case 5:
				cout<<"输入要插入元素的位置和值:"<<endl;
				cin>>i>>e;
				if (ListInsert(L,i,e)==OK) 
					TraverList(L);
				else 
					cout<<"不能插入!"<<endl;
				break;
			case 6:
				cout<<"输入要删除元素的位置:"<<endl;
				cin>>i;
				if(ListDelete(L,i)==OK) 
					TraverList(L);
				else 
					cout<<"删除位置不合法。"<<endl;
				break;
			case 0:
			cout<<"操作结束!"<<endl;
				exit(0);
	   }
	} 
	return 0;
}

【程序运行结果】
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值