선형 표 (1) - 기초 지식
7703 단어 데이터 구조 학습 노트
선형 표 (Linear List) 는 선형 데이터 구조 로 데이터 요소 의 비 공 유한 집합 에서 유일 하 게 '첫 번 째' 라 고 불 리 는 데이터 요소 가 존재 하 는 것 이 특징 이다.'마지막' 이 라 고 불 리 는 유일한 데이터 요소 가 존재 합 니 다.첫 번 째 를 제외 하고 집합 중의 모든 데이터 요 소 는 하나의 전구 만 있다.마지막 을 제외 하고 집합 중의 모든 데이터 요 소 는 하나의 후계 만 있다.
2. 선형 표 의 순서 저장
선형 표 의 순서 저장 은 한 그룹의 주소 로 연 속 된 저장 장치 로 선형 표를 순서대로 저장 하 는 데이터 요 소 를 말한다.이런 형식 으로 저 장 된 선형 표 는 순서 표 라 고 불 린 다.순서 표 의 논리 적 순 서 는 물리 적 순서 와 일치한다.
순서 표 는 데이터 요소 의 번호 에 따라 무 작위 로 접근 하 는 특징 을 가지 고 있다.고급 프로 그래 밍 언어 에 있 는 배열 형식 도 무 작위 액세스 특성 이 있 기 때문에 데이터 구조 에 있 는 순서 저장 구 조 를 배열 로 묘사 하 는 경우 가 많다.
#define LIST_INIT_SIZE 100
typedef struct{
ElemType *elem;
int length;
}SqList;
1. 순서 표 초기 화
즉, 순서 표 에 미리 정 의 된 크기 의 배열 공간 을 분배 하고 선형 표 의 현재 길 이 를 0 으로 설정 하 는 것 이다.
void InitList(SqList &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(L.elem==NULL){
printf(" !
");
exit(1);
}
L.length=0;
}
2. 연산 삽입
표 의 제 i (1 < = i < = n) 개 요 소 를 삽입 하기 전에 값 이 e 인 새로운 요 소 를 삽입 하고 삽입 한 후에 원래 표 의 길 이 를 하나 더 합 니 다.삽입 할 때 n 번 째 요 소 를 i (총 n - i + 1) 번 째 요소 로 한 자리 옮 겨 야 합 니 다.이때 시간 복잡 도 는 O (n) 이다.
int ListInsert(SqList &L,ElemType e,int i)
{
if(i<0||i>L.length)
return 0;//
else{
for(j=L.length;j>i;j--){
L.elem[j]=L.elem[j-1];
}
L.elem[i]=e;
L.length++;
return 1;//
}
}
3. 삭제 작업
표 의 i (1 < = i < = n) 개 요 소 를 선형 표 에서 삭제 하고 원래 표 의 길 이 를 1 로 줄 입 니 다.삭제 할 때 i + 1 에서 n (총 n - i) 개 요 소 를 한 단계 앞으로 이동 해 야 합 니 다.이 작업 시간의 복잡 도 는 O (n) 입 니 다.
int ListDelete(SqList &L,int i)
{
if(i<0||i>L.length)
return 0;
p=&(L.elem[i-1]);//p
q=L.elem+L.length-1;//q ,
for(++p;p<=q;++p){
*(p-1)=*p;
}
L.length--;
return 1;
}
4. 값 으로 찾기
선형 표 에서 주어진 값 e 와 같은 데이터 요 소 를 찾 습 니 다. e 와 같은 데이터 요 소 를 찾 으 면 순서 표 에 저 장 된 위 치 를 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 시간 복잡 도 는 O (n) 입 니 다.
int LocationElem(SqList &L,ElemType e)
{
i=0;
while(i
3. 선형 표 의 체인 저장
1. 싱글 체인 시트
단일 체인 테이블 의 결점 은 하나의 데이터 영역 과 하나의 지침 영역 으로 구성 된다.단일 체인 시트 의 접근 은 반드시 처음부터 시작 해 야 한다.헤드 포인터 가 링크 의 첫 번 째 노드 의 저장 위 치 를 표시 합 니 다.마지막 노드 의 포인터 영역 이 비어 있 습 니 다 (NULL).
결점 을 시작 하기 전에 부가 하 는 결점 을 두 결점 이 라 고 한다.헤드 노드 의 가입 은 완전히 연산 의 편 의 를 위해 서 입 니 다. 데이터 필드 는 정의 되 지 않 습 니 다. 포인터 필드 에 저 장 된 것 은 첫 번 째 데이터 노드 의 주소 이 고 빈 표 는 비어 있 습 니 다.
단일 체인 시트 의 저장 구조:
typedef struct LNode{
ElemType data;
Struct LNode *next;
}LNode,*LinkList;
헤드 포인터 변 수 를 정의 하면 LinkList L 이 있 고 L 을 단일 체인 표 의 헤드 포인터 로 표시 합 니 다.단일 체인 테이블 에서 i 번 째 요 소 를 얻 으 려 면 반드시 처음부터 지침 을 찾 아야 하기 때문에 단일 체인 테이블 은 무 작위 액세스 가 아 닌 저장 구조 이다.
단일 링크 만 들 기:
n 개 요소 의 값 을 역순 으로 입력 하고 선두 노드 의 단일 링크 L 을 만 듭 니 다.처음부터 결산 점 의 빈 표 부터 하나의 데이터 요 소 를 읽 을 때마다 하나의 결산 점 을 신청 한 다음 에 링크 머리 에 꽂 습 니 다. 링크 머리 에 삽입 되 기 때문에 데 이 터 를 읽 는 순서 와 선형 표 의 논리 적 순 서 는 반대 입 니 다.
void CreateList(LinkList &l,int n)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;i++){
p=(LinkList)malloc(sizeof(LNode));
scanf(&p->data);
p->next=L->next;
L->next=p;
}
}
시계 길이:
이동 포인터 p 와 카운터 n 을 설정 하고 초기 화 한 후에 p 가 가리 키 는 결점 뒤에 몇 개의 결점 이 있 습 니 다. p 는 뒤로 이동 하고 계수 기 는 하 나 를 추가 합 니 다.체인 테이블 L 은 선두 결점 을 가 진 선형 체인 테이블 (선형 테이블 의 길 이 는 머리 결점 을 포함 하지 않 음) 이다.
int ListLength(LinkList &L)
{
n=0;
p=L;
while(p->next){
p=p->next;
n++;
}
return n;
}
번호 찾기:
노드 를 이 끄 는 링크 L 에 i 번 째 요소 가 존재 하면 그 값 을 e 병 에 게 1 로 되 돌려 주 고 그렇지 않 으 면 0 으로 되 돌려 줍 니 다.
int GetElemList(LinkList &L,int i,ElemType &e)
{
p=L->next;
j=1;
while(p&&jnext;
j++;
}
if(!p||j>i) return 0;
else{
e=p->data;
return 1;
}
}
삽입 연산:
int InsertList(LinkList &L,int i,ElemType e)// L i e
{
p=L;
j=0;
while(p&&jnext;
j++;
}
if(!p||jdata=e;
s->next=p->next;
p->next=s;
return 1;
}
}
삭제 연산:
int DeleteList(LinkList &L,int i)// L , i
{
p=L;
j=0;
while(p->next&&jnext;
j++;
}
if(!p->next||jnext;
p->next=q->next;
free(q);
return 1;
}
}
2. 순환 링크
표 에서 마지막 결점 의 지침 역 은 머리 결점 을 가리 키 고 전체 체인 표 는 하나의 고 리 를 형성 하면 단일 순환 체인 표를 구성한다.이로부터 표 중의 어떤 결점 에서 출발 하여 표 중의 다른 결점 을 찾 을 수 있다.단일 순환 링크 의 꼬리 지침 (T 로 설정) 을 알 았 을 때 다른 한쪽 의 머리 지침 은 T - > next - > next (선두 결점) 입 니 다.
두 개의 단일 순환 링크 H1, H2 에 대한 연결 작업 은 H2 의 첫 번 째 데이터 노드 를 H1 꼬리 노드 에 연결 하 는 것 이다.만약 에 헤드 포인터 로 표 지 를 한다 면 첫 번 째 링크 의 끝 점 을 찾 아야 한다. 그 시간 복잡 도 는 O (n) 이 고 링크 는 각각 꼬리 포인터 T1, T2 로 표 지 를 하면 시간 복잡 도 는 O (1) 이다. 그 조작 은 다음 과 같다.
p=T1->next;// T1
T1->next=T2->next->next;//
free(T2->next);//
T2->next=p;//
3. 양 방향 링크 (이중 링크 목록)
양 방향 링크 의 결산 점 에 두 개의 지침 역 이 있 는데 하 나 는 직접 연결 을 가리 키 고 다른 하 나 는 직접 전구 를 가리 키 며 그 저장 구 조 는 다음 과 같다.
typedef struct DuLNode{
ElemTyPE DATA;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLNode;
노드 삭제:
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
노드 삽입:
// p s
s->prior=p->prior;
p->prior=s;
s->prior->next=s;
s->next=p;
4. 정적 링크
포인터 형 이 묘사 한 선형 링크 와 구별 되 고 배열 로 묘사 한 링크 를 정적 링크 라 고 합 니 다.그 유형 은 다음 과 같다.
#define MAXSIZE 100//
typedef struct{
ElemType data;
int cur;
}component,SlinkList[MAXSIZE];
배열 의 한 분량 은 결점 을 표시 하 는 동시에 포인터 대신 커서 (지시기 cur) 로 결점 이 배열 에 있 는 상대 적 인 위 치 를 표시 합 니 다.배열 의 0 분 의 1 은 두 결점 으로 볼 수 있 고 지침 역 은 링크 의 첫 번 째 결점 을 가리킨다.이러한 저장 구 조 는 비교적 큰 공간 을 미리 분배 해 야 하지만 선형 표 의 삽입 과 삭제 작업 을 할 때 이동 요 소 를 필요 로 하지 않 고 지침 만 수정 해 야 하기 때문에 체인 식 저장 구조의 주요 장점 을 가진다.S 가 SlinkList 형 변수 라 고 가정 하면 S [0]. cur 는 첫 번 째 노드 가 배열 에 있 는 위 치 를 표시 합 니 다. i = 을 설정 하면
S [0]. cur 는 S [i]. data 는 선형 표 의 첫 번 째 데이터 요 소 를 저장 하고 S [i]. cur 는 두 번 째 노드 가 배열 에 있 는 위 치 를 가리킨다.일반적인 상황 에서 i 번 째 분량 이 링크 의 첫 번 째 k 번 째 노드 를 나타 내 면 S [i]. cur 는 k + 1 번 째 노드 의 위 치 를 가리킨다.따라서 정적 링크 에서 선형 표 의 조작 과 동적 링크 가 비슷 하고 전체 커서 i 로 동적 포인터 p, i = s [i]. cur 의 조작 을 포인터 로 한 후 이동 (p = p - > next 와 유사) 합 니 다.
정적 링크 초기 화:
void InitSpace(SlinkList &S)// S ,S[0].cur
//“0”
{
for(i=0;i
정적 링크 에서 포 지 셔 닝 작업 실현:
정적 단일 링크 L 에서 첫 번 째 값 이 e 인 요 소 를 찾 습 니 다.찾 으 면 L 에 있 는 위 치 를 되 돌려 줍 니 다. 그렇지 않 으 면 0 으로 돌아 갑 니 다.
int LocateElem(SlinkList &S,ElemType e)
{
i=S[0].cur;
while(i&&S[i].data!=e)
i=S[i].cur;
return i;
}
4. 순서 표 와 링크 의 비교
1. 순서 표 의 특징
2. 링크 의 특징
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
선형 표 (1) - 기초 지식선형 표 (Linear List) 는 선형 데이터 구조 로 데이터 요소 의 비 공 유한 집합 에서 유일 하 게 '첫 번 째' 라 고 불 리 는 데이터 요소 가 존재 하 는 것 이 특징 이다.'마지막' 이 라 고 불 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.