목차
7. 시퀀스 테이블을 초기화하고 여기에 요소를 삽입합니다.
이 블로그는 물리 주소에 연속적으로 저장되는 선형 테이블인 시퀀스 테이블의 기본 동작을 주로 소개합니다. 이 기사에 제시된 코드는 정적 배열을 사용합니다.
먼저 데이터 요소를 저장하는 배열과 현재 시퀀스 테이블의 요소 수를 각각 나타내는 Sqlist
두 개의 멤버 변수 data
및 를 포함하는 시퀀스 테이블의 구조 유형을 정의해야 합니다. 시퀀스 테이블의 최대 길이를 나타냅니다.length
MaxSize
그런 다음 시퀀스 테이블을 초기화해야 합니다. 함수 에서 InitList
시퀀스 테이블의 요소 개수를 0으로 설정한다는 것은 시퀀스 테이블이 빈 테이블이라는 것을 의미합니다.
그런 다음 시퀀스 테이블에서 요소를 삽입하거나 요소를 삭제하는 작업을 구현할 수 있습니다. 구체적으로, 이 함수는 시퀀스 테이블의 첫 번째 위치에 새 요소를 삽입하는 ListInsert
데 사용되며 , 이 함수는 시퀀스 테이블의 첫 번째 요소를 삭제하는 데 사용됩니다 . 삽입 또는 삭제 작업을 수행하기 전에 작업이 합법적인지 여부를 확인해야 합니다. 삽입할 위치가 시퀀스 테이블의 범위 내에 있지 않거나 시퀀스 테이블이 최대 길이에 도달한 경우 이 작업은 불법입니다.i
e
ListDelete
i
또한 시퀀스 테이블의 비트 순서 또는 값으로 요소를 조회할 수도 있습니다. 특히, 이 함수는 요소를 비트 단위로 찾는 데 사용되며 GetElem
시퀀스 테이블의 첫 번째 요소 i
값을 반환합니다. 이 함수는 값별로 요소를 조회하는 데 사용되며 LocateElem
첫 번째 값이 동일한 e
요소의 비트 순서를 반환합니다. 시퀀스 테이블에 . 값으로 검색할 때 일치하는 요소를 찾거나 목록 끝에 도달할 때까지 전체 시퀀스 테이블을 탐색해야 한다는 점에 유의해야 합니다.
마지막으로 main 함수에서 시퀀스 테이블을 초기화하고 여기에 요소를 삽입하고 각 요소의 값을 시퀀스 테이블에 출력합니다. 정적 배열 외에도 동적으로 할당된 배열을 사용하여 순차 테이블을 구현할 수도 있습니다. 동적으로 할당된 배열을 사용하는 경우 컴퓨터 리소스를 더 잘 활용하려면 동적 메모리 할당 및 해제가 필요합니다.
1. 시퀀스 테이블 유형 정의
//静态数组
#define MaxSize 10 //定义最大长度
typedef struct {
int data[MaxSize];
int length;
}Sqlist;
보시다시피 키워드를 사용하여 코드에서 쉽게 참조할 수 있는 #define
시퀀스 테이블의 최대 길이를 정의합니다 . 그런 다음 두 개의 멤버 변수를 포함하는 시퀀스 테이블을 나타내는 MaxSize
구조 유형을 정의합니다 . 및 현재 시퀀스 테이블의 요소 수와 데이터 요소를 저장하는 배열을 각각 나타냅니다.Sqlist
data
length
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
이 함수는 시퀀스 테이블의 i
th 위치에 새 요소를 삽입하는 데 사용됩니다 e
. 먼저 연산이 적법한지 판단이 필요한데 삽입할 위치가 시퀀스 테이블의 범위를 벗어나거나 시퀀스 테이블이 최대 길이에 도달한 경우 연산이 불법이며 바로 리턴한다 false
. i
그렇지 않으면 삽입된 요소를 위한 공간을 만들기 위해 첫 번째 요소와 다음 요소를 한 비트 뒤로 이동 해야 합니다 e
. 그런 다음 요소를 e
th 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
할당하고 i
4번째 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
더 많은 요소를 수용할 수 있도록 시퀀스 테이블의 길이를 늘리는 함수를 호출합니다.