第3周实践项目4 -顺序表的应用 删除顺序表中元素为x的值

/* 
copyright (t) 2017,烟台大学计算机学院  
*All rights reserved.  
*文件名称:1.cpp  
*作者:邵雪源 
*完成日期:2017年9月14日  
*问题描述:删除元素在x,的所有元素,要求算法的时间按复杂度为o(n),空间复杂度为o(1)
*版本号:v1.0  
*/
main.cpp

#include "list.h"
#include 
void delnode1(SqList *&L,ElemType x)
{
    int i;
    ElemType e;
    while((i=LocateElem(L,x))>0)
    {
        ListDelete(L, i, e);
    }
}
//用main写测试代码
int main()
{
    SqList *sq;
    ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
    CreateList(sq, a, 10);
    printf("删除前 ");
    DispList(sq);

    delnode1(sq, 7);

    printf("删除后 ");
    DispList(sq);
    return 0;
}
list.h

#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
#define MaxSize 50
typedef int ElemType;
typedef struct
{
    ElemType data[MaxSize];
    int length;
} SqList;
void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表
bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
void DispList(SqList *L);//输出线性表DispList(L)
bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)#endif // LIST_H_INCLUDED
#endif
list.cpp

#include 
#include 
#include "list.h"
//用数组创建线性表
void CreateList(SqList *&L, ElemType a[], int n)
{
    int i;
    L=(SqList *)malloc(sizeof(SqList));
    for (i=0; idata[i]=a[i];
    L->length=n;
}
//判定是否为空表ListEmpty(L)
bool ListEmpty(SqList *L)
{
    return(L->length==0);
}
//输出线性表DispList(L)
void DispList(SqList *L)
{
    int i;
    if (ListEmpty(L)) return;
    for (i=0; ilength; i++)
        printf("%d ",L->data[i]);
    printf("\n");
}
//求某个数据元素值GetElem(L,i,e)
bool GetElem(SqList *L,int i,ElemType &e)
{
    if (i<1 || i>L->length)  return false;
    e=L->data[i-1];
    return true;
}
//按元素值查找LocateElem(L,e)
int LocateElem(SqList *L, ElemType e)
{
    int i=0;
    while (ilength && L->data[i]!=e) i++;
    if (i>=L->length)  return 0;
    else  return i+1;
}
//删除数据元素ListDelete(L,i,e)
bool ListDelete(SqList *&L,int i,ElemType &e)
{
    int j;
    if (i<1 || i>L->length)  //参数错误时返回false
        return false;
    i--;        //将顺序表逻辑序号转化为物理序号
    e=L->data[i];
    for (j=i; jlength-1; j++) //将data[i..n-1]元素前移
        L->data[j]=L->data[j+1];
    L->length--;              //顺序表长度减1
    return true;              //成功删除返回true
}
解法二:
#include "list.h"
#include 
void delnode2(SqList *&L,ElemType x)
{
    int k=0,i; //k记录非x的元素个数
    for (i=0; ilength; i++)
        if (L->data[i]!=x)
        {
            L->data[k]=L->data[i];
            k++;
        }
    L->length=k;
}
//用main写测试代码
int main()
{
    SqList *sq;
    ElemType a[10]= {5,8,7,0,2,4,9,6,7,3};
    CreateList(sq, a, 10);
    printf("删除前 ");
    DispList(sq);
    delnode2(sq, 7);
    printf("删除后 ");
    DispList(sq);
    return 0;
}


你可能感兴趣的:(第3周实践项目4 -顺序表的应用 删除顺序表中元素为x的值)