데이터 구조 1 - 시퀀스 테이블의 기본 구현

목차

1. 시퀀스 테이블 유형 정의

2. 초기화 시퀀스 테이블

3. 시퀀스 테이블에 요소 삽입

4. 시퀀스 목록에서 요소 삭제

5. 비트로 요소 찾기

6. 값으로 요소 찾기

7. 시퀀스 테이블을 초기화하고 여기에 요소를 삽입합니다.

8. 동적 할당 시퀀스 테이블


이 블로그는 물리 주소에 연속적으로 저장되는 선형 테이블인 시퀀스 테이블의 기본 동작을 주로 소개합니다. 이 기사에 제시된 코드는 정적 배열을 사용합니다.

        먼저 데이터 요소를 저장하는 배열과 현재 시퀀스 테이블의 요소 수를 각각 나타내는 Sqlist두 개의 멤버 변수 data및 를 포함하는 시퀀스 테이블의 구조 유형을 정의해야 합니다. 시퀀스 테이블의 최대 길이를 나타냅니다.lengthMaxSize

        그런 다음 시퀀스 테이블을 초기화해야 합니다. 함수 에서 InitList시퀀스 테이블의 요소 개수를 0으로 설정한다는 것은 시퀀스 테이블이 빈 테이블이라는 것을 의미합니다.

        그런 다음 시퀀스 테이블에서 요소를 삽입하거나 요소를 삭제하는 작업을 구현할 수 있습니다. 구체적으로, 이 함수는 시퀀스 테이블의 첫 번째 위치에 새 요소를 삽입하는 ListInsert데 사용되며 , 이 함수는 시퀀스 테이블의 첫 번째 요소를 삭제하는 데 사용됩니다 . 삽입 또는 삭제 작업을 수행하기 전에 작업이 합법적인지 여부를 확인해야 합니다. 삽입할 위치가 시퀀스 테이블의 범위 내에 있지 않거나 시퀀스 테이블이 최대 길이에 도달한 경우 이 작업은 불법입니다.ieListDeletei

        또한 시퀀스 테이블의 비트 순서 또는 값으로 요소를 조회할 수도 있습니다. 특히, 이 함수는 요소를 비트 단위로 찾는 데 사용되며 GetElem시퀀스 테이블의 첫 번째 요소 i값을 반환합니다. 이 함수는 값별로 요소를 조회하는 데 사용되며 LocateElem첫 번째 값이 동일한 e요소의 비트 순서를 반환합니다. 시퀀스 테이블에 . 값으로 검색할 때 일치하는 요소를 찾거나 목록 끝에 도달할 때까지 전체 시퀀스 테이블을 탐색해야 한다는 점에 유의해야 합니다.

        마지막으로 main 함수에서 시퀀스 테이블을 초기화하고 여기에 요소를 삽입하고 각 요소의 값을 시퀀스 테이블에 출력합니다. 정적 배열 외에도 동적으로 할당된 배열을 사용하여 순차 테이블을 구현할 수도 있습니다. 동적으로 할당된 배열을 사용하는 경우 컴퓨터 리소스를 더 잘 활용하려면 동적 메모리 할당 및 해제가 필요합니다.

1. 시퀀스 테이블 유형 정의

//静态数组
#define MaxSize 10 //定义最大长度
typedef struct {
    int data[MaxSize];
    int length;
}Sqlist;

보시다시피 키워드를 사용하여 코드에서 쉽게 참조할 수 있는 #define시퀀스 테이블의 최대 길이를 정의합니다 . 그런 다음 두 개의 멤버 변수를 포함하는 시퀀스 테이블을 나타내는 MaxSize구조 유형을 정의합니다 . 현재 시퀀스 테이블의 요소 수와 데이터 요소를 저장하는 배열을 각각 나타냅니다.Sqlistdatalength

2. 초기화 시퀀스 테이블

void InitList(Sqlist& L) {
    L.length = 0;
}

이 함수의 기능은 시퀀스 테이블을 빈 테이블로 초기화하는 것, 즉 시퀀스 테이블의 요소 수를 0으로 설정하는 것입니다.

3. 시퀀스 테이블에 요소 삽입

bool ListInsert(Sqlist& L, int i, int e) {
    if (i<1 || i>L.length + 1)
        return false;
    if (L.length >= MaxSize)
        return false;
    for (int j = L.length; j >= i; j--)//将第i个元素及之后的元素往后移动
        L.data[j] = L.data[j - 1];
    L.data[i - 1] = e;
    L.length++;
    return true;
}

ListInsert이 함수는 시퀀스 테이블의 ith 위치에 새 요소를 삽입하는 데 사용됩니다 e. 먼저 연산이 적법한지 판단이 필요한데 삽입할 위치가 시퀀스 테이블의 범위를 벗어나거나 시퀀스 테이블이 최대 길이에 도달한 경우 연산이 불법이며 바로 리턴한다 false. i그렇지 않으면 삽입된 요소를 위한 공간을 만들기 위해 첫 번째 요소와 다음 요소를 한 비트 뒤로 이동 해야 합니다 e. 그런 다음 요소를 eth i위치에 삽입하고 시퀀스 테이블의 요소 수를 동시에 1씩 늘립니다. 마지막으로 반환은 true삽입이 성공했음을 나타냅니다.

4. 시퀀스 목록에서 요소 삭제

bool ListDelete(Sqlist& L, int i, int &e) {
    if (i<1 || i>L.length + 1)
        return false;
    e = L.data[i - 1];
    for (int j = i; j < L.length; j++) {
        L.data[j - 1] = L.data[j];
    }
    L.length--;
    return true;
}

ListDelete이 함수는 시퀀스 목록의 첫 번째 요소를 삭제하는 데 사용됩니다 i. 마찬가지로 해당 작업이 적법한지 여부를 판단해야 합니다. 삭제할 위치가 시퀀스 테이블의 범위를 벗어나면 연산이 불법이며 바로 리턴한다 false. 그렇지 않으면 해당 요소에 4번째 요소의 값을 e할당하고 i4번째 i요소와 그 다음 요소를 1비트 앞으로 이동하여 요소를 삭제합니다 e. 마지막으로 시퀀스 테이블의 요소 수가 1씩 줄어들고 true삭제가 성공했음을 반환합니다.

5. 비트로 요소 찾기

int GetElem(Sqlist L, int i) {
    return L.data[i - 1];
}

GetElem이 함수는 비트 단위로 요소를 찾는 데 사용됩니다. 즉, i시퀀스 목록에서 4번째 요소의 값을 반환합니다. 이 함수는 시퀀스 테이블의 요소 수정을 포함하지 않기 때문에 참조가 아닌 값으로 전달되도록 매개 변수를 선언할 수 있습니다.

6. 값으로 요소 찾기

int LocateElem(Sqlist L, int e) {
    for (int i = 0; i < L.length; i++)
        if (L.data[i] == e)//匹配
            return i + 1;
    return 0;
}

LocateElem이 함수는 값으로 요소를 찾는 데 사용됩니다. 즉, 정렬된 목록에서 값이 같은 첫 번째 요소 e의 비트 순서를 반환합니다. 값으로 검색할 때 일치하는 요소를 찾거나 목록 끝에 도달할 때까지 전체 시퀀스 테이블을 탐색해야 한다는 점에 유의해야 합니다. 일치하는 요소가 없으면 0을 반환합니다.

7. 시퀀스 테이블을 초기화하고 여기에 요소를 삽입합니다.

int main() {
    Sqlist L;
    InitList(L);
    ListInsert(L, 3, 3);
    for (int i = 0; i < MaxSize; i++) {
        printf("data[%d]=%d\n", i, L.data[i]);
    }
    return 0;
}

main함수 에서 먼저 InitList시퀀스 테이블을 빈 테이블로 초기화하는 함수를 호출합니다. 그런 다음 ListInsert함수를 사용하여 요소 3을 시퀀스 테이블의 세 번째 위치에 삽입합니다. 마지막으로 전체 시퀀스 테이블을 순회하고 각 요소의 값을 출력합니다.

8. 동적 할당 시퀀스 테이블

정적 배열 외에도 동적으로 할당된 배열을 사용하여 순차 테이블을 구현할 수도 있습니다. 동적으로 할당된 배열을 사용하는 경우 컴퓨터 리소스를 더 잘 활용하려면 동적 메모리 할당 및 해제가 필요합니다. 다음은 간단한 동적 할당 시퀀스 테이블의 코드 예입니다.

#define ElemType int
#define Initsize 10
typedef struct {
    ElemType* data; //表示动态分配数组的指针
    int Maxsize;
    int length;
}SeqList;

void InitList(SeqList& L) {
    //用malloc函数申请一片连续的存储空间
    L.data = (int*)malloc(Initsize * sizeof(int));
    L.length = 0;
    L.Maxsize = Initsize;
}

//增加动态数组的长度
void IncreaseSize(SeqList& L, int len) {
    int* p = L.data;
    L.data = (int*)malloc((L.Maxsize + len) * sizeof(int));
    for (int i = 0; i < L.length; i++) {
        L.data[i] = p[i];
    }
    L.Maxsize = L.Maxsize + len;
    free(p);
}

int main() {
    SeqList L;
    InitList(L);
    IncreaseSize(L, 5);
    return 0;
}

SeqList이 코드에서는 먼저 데이터 요소를 저장하는 배열, 현재 시퀀스 테이블의 요소 수 및 배열의 ​​최대 길이를 각각 나타내는 세 개의 멤버 변수를 포함하는 동적으로 할당된 시퀀스 테이블의 구조 유형을 정의합니다 .

InitList함수 에서 malloc연속 저장 공간을 신청하여 시퀀스 테이블에 요소를 저장하고 동시에 요소 수와 시퀀스 테이블의 최대 길이를 0으로 초기화하고 사전 설정 값을 지정하는 기능을 사용합니다 Initsize.

시퀀스 테이블의 요소 수가 최대 길이에 도달한 경우 IncreaseSize더 많은 요소를 수용하기 위해 시퀀스 테이블의 길이를 늘리는 기능을 사용할 수 있습니다. 이 기능은 먼저 원래 저장 공간 포인터를 저장한 p다음 더 큰 저장 공간에 다시 적용하고 이전 요소를 하나씩 새 저장 공간에 복사한 다음 마지막으로 원래 저장 공간을 해제합니다.

main함수 에서 먼저 InitList시퀀스 테이블을 초기화하는 함수를 호출한 다음 IncreaseSize더 많은 요소를 수용할 수 있도록 시퀀스 테이블의 길이를 늘리는 함수를 호출합니다.

Guess you like

Origin blog.csdn.net/m0_62338174/article/details/131022431