[데이터 구조] - 시퀀스 테이블에 대한 자세한 설명

여러분, 안녕하세요! 동적 메모리 관리를 배운 후에는 데이터를 관리하기 위한 시퀀스 테이블을 작성할 수 있습니다! ! !

시퀀스 테이블 이해:

선형 테이블은 가장 기본적이고 단순하며 가장 일반적으로 사용되는 데이터 구조입니다. 선형 목록은 데이터 구조의 한 유형입니다. 선형 목록은 동일한 특성을 가진 n개의 데이터 요소로 구성된 유한 시퀀스입니다.

순차 테이블(Sequential Table)은 컴퓨터 메모리에 배열 형태로 저장되는 선형 테이블로, 연속적인 주소를 갖는 저장 단위의 집합을 이용하여 선형 테이블의 각 원소를 순차적으로 저장하여 선형 테이블을 구성하는 것을 말한다. 데이터 요소들은 인접한 물리적 저장 단위에 저장되는데, 즉 데이터 요소들 간의 논리적 인접 관계는 데이터 요소들의 물리적 저장의 인접 관계를 통해 반영된다. 순차 테이블. 시퀀스 테이블은 컴퓨터 메모리에 연속적인 주소가 있는 저장 장치 세트에 테이블의 노드를 순차적으로 저장합니다.

여기에 이미지 설명을 삽입하세요.

정적 시퀀스 테이블은 배열처럼 고정된 크기를 가지고 있으며, 동적 시퀀스 테이블은 용량이 부족할 때 확장하여 많은 양의 데이터를 저장할 수 있는 효과를 얻을 수 있습니다! ! !

1. 먼저 시퀀스 목록을 나타내는 구조를 만듭니다.

typedef int DATE;//重命名顺序表的数据类型
typedef struct ArrayList {
    
    
	DATE* date;
	size_t size;//顺序表长度
	size_t capacity;//顺序表容量
}AL;

2. 시퀀스 테이블의 모든 인터페이스 표시

void Init(AL* al);
void checkCapacity(AL* al);
void pushBack(AL* al, DATE info);
void pushFront(AL* al, DATE info);
void insertDate(AL* al,size_t pos, DATE info);
void printDate(AL* al);
void Erase(AL* al, size_t pos);
void PopBack(AL* al);
void PopFront(AL* al);
size_t FindDate(AL* al, DATE info);
void ExchangeDate(AL* al, size_t pos, DATE info);
void Deatory(AL* al);

3. 각 인터페이스 기능 소개 및 구현 원리

1. 초기화 기능 구현

void Init(AL* al)
{
    
    
	assert(al);
	al->size = 0;
	al->capacity = 4;//初始化容量为4
	DATE* tmp = (DATE*)malloc(sizeof(DATE) * al->capacity);
	if (tmp == NULL)
	{
    
    
		perror("malloc fail");
		exit(-1);
	}
	al->date = tmp;
}

초기화 시퀀스 테이블의 길이는 0이고 용량은 4입니다!

2. 용량 기능 구현 확인

void checkCapacity(AL* al)
{
    
    
	if (al->size == al->capacity)
	{
    
    
		DATE* tmp = (DATE*)realloc(al->date, sizeof(DATE) * al->capacity*2);
		if (tmp == NULL)
		{
    
    
			perror("realloc fail");
			exit(-1);
		}
		al->capacity *= 2;
		al->date = tmp;
		printf("扩容成功!\n");
	}
}

길이가 용량과 같다면 용량을 늘려야 한다는 뜻이므로 용량을 2배로 늘려주세요.

3. 꼬리 삽입 기능 구현

void pushBack(AL* al, DATE info)
{
    
    
	assert(al);
	checkCapacity(al);
	al->date[al->size] = info;
	al->size++;
}

매번 삽입하기 전에 반드시 용량을 확인하십시오
꼬리 삽입이란 크기 끝에 삽입할 값을 쓴 후 길이에 1을 더하는 것을 의미합니다.
여기에 이미지 설명을 삽입하세요.

4. 헤드 플러그 기능 구현

void pushFront(AL* al, DATE info)
{
    
    
	assert(al);
	checkCapacity(al);
	if (al->size == 0)
	{
    
    
		al->date[0] = info;
		al->size++;
	}
	else
	{
    
    
		size_t end = al->size;
		while (end)
		{
    
    
			al->date[end] = al->date[end-1];
			end--;
		}
		al->date[0] = info;
		al->size++;
	}
}

데이터 삽입 시 다음 데이터를 뒤로 이동시켜야 하며, 이동 중 용량을 초과할 수 있으므로 삽입 시 확장 판단이 필요합니다.

여기에 이미지 설명을 삽입하세요.

이동방법은 위와 같습니다

여기에 이미지 설명을 삽입하세요.

5. 꼬리 삭제 기능

void PopBack(AL* al)
{
    
    
    assert(ps);
	assert(al->size > 0);
	al->size--;
}

마지막 데이터를 삭제하려면 길이를 1씩 줄이세요.

6. 헤드 삭제 기능

void PopFront(AL* al)
{
    
    
    assert(al->size > 0);
	int begin = 1;
	while (begin<al->size)
	{
    
    
		al->date[begin - 1] = al->date[begin];
		begin++;
     }
	al->size--;
}

이동 시퀀스 방법은 다음과 같습니다:
여기에 이미지 설명을 삽입하세요.
변수 start=1을 정의하고, 먼저 데이터 2를 데이터 1의 위치로 이동하고 해당 작업은
al->date[begin - 1] = al->date[begin]입니다. Begin++, 데이터 3을 데이터 2의 위치로, 데이터 4를 데이터 3의 위치로 순차적으로 이동합니다. 루프의 마지막은 데이터 5를 데이터 4의 위치로 이동시키는 것, 즉 Begin=4, al->size=5이고, 루프 판단 조건은 Beginsize이고, 루프 종료 후 al->size이다. –
;

여기에 이미지 설명을 삽입하세요.

7. 임의 위치의 데이터 삭제 기능 구현

void Erase(AL* al, size_t pos)
{
    
    
	assert(al);
	assert(pos >= 0 && pos <= al->size);
	if (al->size == 0)
	{
    
    
		printf("暂无数据!!\n");
		return;
	}
	size_t end = pos;
	while (end<al->size-1)
	{
    
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/a1a63c6776c142eeb77e15536b8f9a53.png#pic_center)

		al->date[end] = al->date[end + 1];
		end++;
	}
	al->size--;
}

데이터를 삭제하려면 이 위치 이후의 모든 요소를 ​​한 위치 앞으로 이동해야 하며
첨자는 size_t로 표시되므로 헤드 삭제 시 크기를 비교하려면 unsigned -1 및 0 루프 조건을 파악해야 합니다.

숫자 3을 삭제하고 데이터 3 이후의 데이터를 앞으로 이동하려면 첫 번째 단계는 데이터 4를 데이터 3의 위치로 이동하고 변수 end=pos=2를 정의하는 것입니다. 해당 작업은 al-> date[end ] = al->date[end+1];, end++;는 데이터 5를 데이터 4의 시작 부분으로 이동합니다. 마지막 루프는 데이터 5를 데이터 4로 이동하는 것입니다. 즉, end는 최종적으로 3과 같고 al->size=5이며 루프 판단 조건은 end< al->size-1이며 루프가 종료됩니다. al->size– ;

여기에 이미지 설명을 삽입하세요.

8. 임의의 위치에 데이터를 삽입하는 기능 구현

void insertDate(AL* al, size_t pos, DATE info)
{
    
    
	assert(al);
	assert(pos >= 0 && pos <= al->size);
	checkCapacity(al);
	int end = al->size;
	while (end > pos)
	{
    
    
		al->date[end] = al->date[end - 1];
		end--;
	}
	al->date[pos] = info;
	al->size++;
}

첨자 Yi 클래스는 size_t로 표현되므로 헤더 삽입 시 unsigned -1과 0 루프 조건을 비교하는 상황을 파악해야 한다.

여기에 이미지 설명을 삽입하세요.

임의의 위치에 삽입하려면 삽입 위치와 후속 데이터를 한 번에 한 위치 뒤로 이동해야 합니다!

9. 헤드 플러그 삭제 및 헤드 삭제, 테일 삭제 기능 개선

임의 삽입 및 임의 삭제를 작성한 후 헤드 플러그 삭제, 헤드 삭제 및 테일 삭제 기능을 개선하고 함수 본문에서 임의 삽입 및 임의 삭제 기능을 직접 호출할 수 있습니다.

void pushFront(AL* al, DATE info)
{
    
    
	assert(al);
	checkCapacity(al);
	if (al->size == 0)
	{
    
    
		al->date[0] = info;
		al->size++;
	}
	else
	{
    
    
		insertDate(al, 0, info);
	}
}
void pushBack(AL* al, DATE info)
{
    
    
	assert(al);
	checkCapacity(al);
	insertDate(al, al->size, info);
}
void PopBack(AL* al)
{
    
    
	assert(al);
	if (al->size == 0)
	{
    
    
		printf("暂无数据!!\n");
		return;
	}
	Erase(al, al->size);

}
void PopFront(AL* al)
{
    
    
	assert(al);
	if (al->size == 0)
	{
    
    
		printf("暂无数据!!\n");
		return;
	}
	Erase(al, 0);
}

헤드 삽입은 insert 함수를 호출하여 0 위치에 삽입하는 것이고,
테일 삽입은 insert 함수를 호출하여 사이즈 위치에 삽입하는 것이며,
헤드 삭제는 Erase 함수를 호출하여 0 위치를 삭제하는 것이고,
테일 삭제는 크기 위치를 삭제하는 지우기 기능입니다.

10. 데이터 검색 기능 구현

size_t FindDate(AL* al, DATE info)
{
    
    
	assert(al);
	for (size_t i = 0; i < al->size; i++)
	{
    
    
		if (al->date[i] == info)
			return i;
	}
	return -1;
}

편의 시퀀스 테이블은 찾으려는 데이터가 발견되면 해당 첨자를 반환하고, 그렇지 않으면 -1을 반환합니다.

11. 데이터 수정

void ExchangeDate(AL* al, size_t pos, DATE info)
{
    
    
	assert(al);
	assert(pos >= 0 && pos <= al->size);
	al->date[pos] = info;
}

수정할 데이터가 있는지 먼저 확인한 후 수정하세요.
주로 검색 기능과 함께 사용됩니다.

여기에 이미지 설명을 삽입하세요.

12. 파기순서표

시퀀스 테이블은 힙 영역 메모리를 개방하므로 시퀀스 테이블을 사용한 후에는 할당된 메모리를 해제해야 합니다!

void Deatory(AL* al)
{
    
    
	assert(al);
	free(al->date);
	al->date=NULL;
	al->capacity = al->size = 0;
}

시퀀스 테이블을 파괴하고, 시퀀스 테이블의 용량을 0으로 설정하고, 시퀀스 테이블의 유효한 데이터 개수를 0으로 설정하고, 날짜 포인터가 가리키는 동적으로 할당된 메모리 공간을 해제한다. all p 가리키는 공간은 초기화되지 않고 date는 와일드 포인터가 되는데, 와일드 포인터를 방지하기 위해 date는 널 포인터로 설정된다.

데이터 구조 부분의 공유 - 시퀀스 테이블은 여기서 끝납니다. 검색해 주셔서 감사합니다! ! !

추천

출처blog.csdn.net/m0_71214261/article/details/133419521