/*程序的版权和版本声明部分:
*Copyright(c)2014,烟台大学计算机学院学生
*All rights reserved.
*文件名称:
*作者:田成琳
*完成日期:2014 年 9 月 5 日
*版本号:v1.0
*对任务及求解方法的描述部分:
*问题描述:线性顺序表的简单应用
*程序输入:n和n个元素,最后输入要删除的x
*程序输出:删除x后的线性表
*问题分析:用number记录顺序表L中等于x的元素个数,一边扫描
K一边统计number值,并将不为x的元素前移number个
位置,最后修改L长度。
*算法设计:算法中只扫描顺序表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=0;
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++)
{
if(L.data[j]==x)
number++;
else
L.data[j-number]=L.data[j];
}
L.length-=number; //别忘了长度赋值
cout<<"删除"<<x<<"后线性表中的元素为:"<<endl;
DisplayList(&L);
return 0;
}
运行结果: