实验2:写程序并验证线性表顺序表示所有操作

本博文源于严蔚敏老师的书籍《数据结构》,看到今天有个实验二,我立马写了一下,并分享到博客里,代码由Clion编译器完全可执行。完整的题目如下:

题目再现

写一个主程序来上机设计并验证线性表顺序表示的所有操作
(至少包含算法2.3、2.4、2.5),并设计一个算法删除所有值大于min而且小于max的元素。

题目分析

  1. 2.3 是一个线性表的插入
  2. 2.4 是一个线性表的删除
  3. 2.5是一个线性表的查找
  4. 自己设计的是一个删除函数(给出两种方法)

2.3 线性表插入

线性表插入,就是值往后挪的过程,我们按照书上的进行书写就行了。

Status ListInsert_Sq(SqList &L,int i,ElementType e){
    
    
    if(i<1 || i>L.length+1) {
    
    
        return ERROR;

    }

    if(L.length >= L.listsize){
    
    
        ElementType * newbase = (ElementType *) realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElementType));
        if(!newbase) exit(OVERFLOW);
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    ElementType *q = &(L.elem[i-1]);
    for(ElementType *p = &(L.elem[L.length-1]);p>=q;--p){
    
    
        *(p+1) = *p;
    }
    *q = e;
    ++L.length;
    return OK;
}

从后面往前遍历,就行了。

2.3 线性表删除

从前往后删除

Status ListDelete_Sq(SqList &L,int i,ElementType &e){
    
    
    if((i<1)|| (i>L.length)) return ERROR;
    int* p = &(L.elem[i-1]);
    e = *p;
    int* q = L.elem + L.length - 1;
    for(++p;p<=q;++p)*(p-1)=*p;
    --L.length;
    return OK;
}

2.5 线性表查找

直接找这个值。我们从头到尾遍历就行了。

Status compare(ElementType a,ElementType b){
    
    
    return a==b?0:1;
}
int LocateElem_Sq(SqList L,ElementType e,Status (*compare)(ElementType,ElementType)){
    
    
    int i = 1;
    int* p  = L.elem;


    while(i<=L.length && !(*compare)(*p++,e)){
    
    
        ++i;

    }
    if(i<=L.length) return i;
    else return 0;
}

2.6 自己设计函数 删除范围

这道题目我先用了普通的O(n^2)复杂度进行计算,然后我们用空间换时间的O(n)的复杂度进行替换,因此这两个算法都一一给出。感觉第二种好理解一些。

Status Delete_minToMax(SqList &L,ElementType min,ElementType max){
    
    
    while(1){
    
    
        int flag = true;
        int i;
        for(i =0;i<L.length;i++){
    
    
            if(L.elem[i]>min && L.elem[i]<max){
    
    
                flag = false;
                break;
            }
        }
        for(int j= i+1;j<L.length;j++){
    
    
            L.elem[j-1] = L.elem[j];
        }

        if(flag) break;
        else L.length--;
    }
    return TRUE;
}

Status Delete_minToMax2(SqList &L,ElementType min,ElementType max){
    
    
    SqList L_cp;
    InitList_Sq(L_cp);
    for(int i=0;i<L.length;i++){
    
    
        if(L.elem[i]>min && L.elem[i]<max) continue;
        L_cp.elem[L_cp.length++] = L.elem[i];
    }
    L.length = 0;
    for(int i=0;i<L_cp.length;i++){
    
    
        L.elem[L.length++] = L_cp.elem[i];
    }
    return TRUE;
}

2.7 总结

题目整体来说也不难,主要是一些小细节需要单独处理,比如L.length什么时候啥时候删除减去。这些都是事先想好,这样做题才会快。

完整代码

#include<iostream>
#define ERROR -1
#define OVERFLOW -1
#define TRUE 1
#define OK 1
#define LISTINCREMENT 10
#define LIST_INIT_SIZE 100
typedef int Status;
typedef int ElementType;
using namespace std;
typedef struct{
    
    
    ElementType *elem;
    int listsize;
    int length = 0;
}SqList;

//2.3
Status ListInsert_Sq(SqList &L,int i,ElementType e){
    
    
    if(i<1 || i>L.length+1) {
    
    
        return ERROR;

    }

    if(L.length >= L.listsize){
    
    
        ElementType * newbase = (ElementType *) realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElementType));
        if(!newbase) exit(OVERFLOW);
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    ElementType *q = &(L.elem[i-1]);
    for(ElementType *p = &(L.elem[L.length-1]);p>=q;--p){
    
    
        *(p+1) = *p;
    }
    *q = e;
    ++L.length;
    return OK;
}


Status ListDelete_Sq(SqList &L,int i,ElementType &e){
    
    
    if((i<1)|| (i>L.length)) return ERROR;
    int* p = &(L.elem[i-1]);
    e = *p;
    int* q = L.elem + L.length - 1;
    for(++p;p<=q;++p)*(p-1)=*p;
    --L.length;
    return OK;
}
Status compare(ElementType a,ElementType b){
    
    
    return a==b?0:1;
}
int LocateElem_Sq(SqList L,ElementType e,Status (*compare)(ElementType,ElementType)){
    
    
    int i = 1;
    int* p  = L.elem;


    while(i<=L.length && !(*compare)(*p++,e)){
    
    
        ++i;

    }
    if(i<=L.length) return i;
    else return 0;
}

Status InitList_Sq(SqList &L){
    
    
    L.elem = (ElementType *)malloc(LIST_INIT_SIZE*sizeof(ElementType));
    if(!L.elem) exit(OVERFLOW);
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}

//并设计一个算法删除所有值大于min而且小于max的元素。

/*Status Delete_minToMax(SqList &L,ElementType min,ElementType max){
    while(1){
        int flag = true;
        int i;
        for(i =0;i<L.length;i++){
            if(L.elem[i]>min && L.elem[i]<max){
                flag = false;
                break;
            }
        }
        for(int j= i+1;j<L.length;j++){
            L.elem[j-1] = L.elem[j];
        }

        if(flag) break;
        else L.length--;
    }
    return TRUE;
}*/

Status Delete_minToMax2(SqList &L,ElementType min,ElementType max){
    
    
    SqList L_cp;
    InitList_Sq(L_cp);
    for(int i=0;i<L.length;i++){
    
    
        if(L.elem[i]>min && L.elem[i]<max) continue;
        L_cp.elem[L_cp.length++] = L.elem[i];
    }
    L.length = 0;
    for(int i=0;i<L_cp.length;i++){
    
    
        L.elem[L.length++] = L_cp.elem[i];
    }
    return TRUE;
}
int main(){
    
    


    //test1:
    SqList  L;

    int flag  = InitList_Sq(L);
    flag = ListInsert_Sq(L,1,1);
    flag = ListInsert_Sq(L,1,2);
    flag = ListInsert_Sq(L,1,3);
    flag = ListInsert_Sq(L,1,4);
    flag = ListInsert_Sq(L,1,5);
    flag = ListInsert_Sq(L,1,6);
    cout << "test1:" << endl;
    for(int i=0;i<L.length;i++){
    
    
        cout << L.elem[i] << " ";
    }
    cout << endl;

    //test2:
    int x;

    flag = ListDelete_Sq(L,2,x);
    cout << "test2:";
    cout << endl << "Delete Element:" << x << endl;

    for(int i=0;i<L.length;i++){
    
    
        cout << L.elem[i] << " ";
    }

    //test3: find == 4
    cout << endl << "test3: find4:" << endl;
    int pos;
    pos = LocateElem_Sq(L,4,compare);
    cout << L.elem[pos] << endl;


    //test4:delete 2 - 5
    cout << "test4:" << endl <<"(2,5)Delete before:" << endl;
    for(int i=0;i<L.length;i++){
    
    
        cout << L.elem[i] << " ";
    }
    cout << endl << "after Deleted :" << endl;
    /*flag = Delete_minToMax(L,2,5);*/
    flag = Delete_minToMax2(L,2,5);
    for(int i=0;i<L.length;i++){
    
    
        cout << L.elem[i] << " ";
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/123181480