线性表中删除所有值等于X的元素(1)

/*程序的版权和版本声明部分:
*Copyright(c)2014,烟台大学计算机学院学生
*All rights reserved.
*文件名称:
*作者:田成琳
*完成日期:2014 年 9 月 5 日
*版本号:v1.0
*对任务及求解方法的描述部分:
*问题描述:线性顺序表的简单应用
*程序输入:n和n个元素,最后输入要删除的x
*程序输出:删除x后的线性表
*问题分析:设删除L中所有值等于x元素后的顺序表为L1,显然
           L1包含于L,为此L1重用L的空间。扫描顺序表L,
           重建L1只包含不等于x的元素。
*算法设计:算法中只扫描顺序表1次,时间复杂度为O(n)。
           空间复杂度为O(1)。
*/
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxSize=50;       //顺序表中最多元素个数
typedef struct
{
	int data[MaxSize];  //存放顺序表中元素
	int length;         //存放顺序表长度
}SqList;
void InitList(SqList *&L);       //初始化线性表,构造空线性表L
void CreateList(SqList *L,int a[],int n);//建立顺序表
void DestroyList(SqList *&L);    //销毁线性表,释放L占用的空间
bool ListEmpty(SqList *L);       //判断线性表是否为空
int ListLength(SqList *L);       //返回线性表元素个数
void DisplayList(SqList *L);     //输出线性表
int GetElem(SqList *L,int i,int &e);//求线性表中某个元素值,e返回该数据
bool LocateElem(SqList *L,int e);    //返回线性表中与e相等的元素位置
bool ListInsert(SqList *L,int i,int e);//在第i(1<=i<=n)插入元素e到线性表
bool ListDelete(SqList *L,int i);//,int &e);//删除数据元素,并用e返回值
void InitList(SqList *L)
{
    L->length=0;                   //空线性表长度设为0
	L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间
}
void CreateList(SqList *L,int a[],int n)
{
    for(int i=0;i<n;i++)
        L->data[i]=a[i];
    L->length=n;
}
void DestroyList(SqList *&L)
{
	free(L);
}
bool ListEmpty(SqList *L)
{
	return(L->length==0);
}
int ListLength(SqList *L)
{
	return(L->length);
}
void DisplayList(SqList *L)
{
	for(int i=0;i<L->length;i++)
		cout<<L->data[i]<<" ";  //遍历输出
	cout<<endl;
}
int GetElem(SqList *L,int i,int &e)
{
	if(i<1||i>L->length)
		cout<<"输入数据出错!"<<endl;
	e=L->data[i-1];
	return e;
}
bool LocateElem(SqList *L,int n)
{
	int i=0;
	while(i<=L->length&&L->data[i]!=n)
		i++;
	if(i>L->length)
		return false;    //未找到返回false
	else
		return true;    //找到返回true
}
bool ListInsert(SqList *L,int i,int e)
{
	int j;
	if(i<1||i>L->length+1)
		return false;    //参数错误
	i--;    //将顺序表逻辑序号转为物理序号
	for(j=L->length;j>i;j--)
		L->data[j]=L->data[j-1];//将i及后面元素后移一个位置
	L->data[i]=e;  //插入元素e
	L->length++;   //长度加1
	return true;
}
bool ListDelete(SqList *L,int i)//,int &e)
{
    int j;
	if(i<1||i>L->length+1)
		return false;    //参数错误
	i--;    //将顺序表逻辑序号转为物理序号
	//e=L->data[i];
	for(j=i;j<L->length-1;j++)
		L->data[j]=L->data[j+1];//将i及后面元素前移一个位置
		L->length--;   //长度减1
		return true;
}
int main()
{
    SqList L;
	int i,n,x,number;
	cout<<"请输入集合元素个数及元素值:"<<endl;
	cin>>n;
	int *arr=new int[n];
	for(i=0;i<n;i++)
		cin>>arr[i];
	CreateList(&L,arr,n);  //创建L集合
    cout<<"请输入要删除的线性表中的元素值:"<<endl;
    cin>>x;
    for(int j=0;j<ListLength(&L);j++)
    {
        number =0;      //记录不等于x元素的个数
        if(L.data[j]!=x)
        {
            L.data[number]=L.data[j];//元素不等于x时,插入L
            number++;            //个数加1
        }
    }
    L.length=number;         //别忘了长度赋值
    cout<<"删除"<<x<<"后线性表中的元素为:"<<endl;
    DisplayList(&L);
    return 0;
}

运行结果:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值