실험 2: 프로그램을 작성하고 선형 테이블 순서가 모든 연산을 나타내는지 확인

이 블로그 포스트는 Yan Weimin의 책 "Data Structure"에서 가져왔습니다. 오늘 실험 2가 있는 것을 보고 즉시 작성하여 블로그에 공유했습니다. 코드는 Clion 컴파일러에서 완전히 실행 가능합니다. 전체 주제는 다음과 같습니다.

주제 재생산

선형 테이블 순서로 표현되는 모든 연산
(최소한 알고리즘 2.3, 2.4, 2.5)을 설계하고 검증하는 메인 프로그램을 작성하고 값이 최소값보다 크고 최대값보다 작은 모든 요소를 ​​삭제하는 알고리즘을 설계하십시오.

주제 분석

  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