1. 程式人生 > >線性表中刪除所有值等於X的元素(1)

線性表中刪除所有值等於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;
}

執行結果: