C - 데이터 구조 - 선형 표
선형 구조의 특징: 데이터 요소 의 비 공 유한 집중 1. 유일한 '첫 번 째' 라 고 불 리 는 데이터 요소 가 존재 합 니 다. 2. 유일한 '마지막' 이 라 고 불 리 는 데이터 요소 가 존재 합 니 다. 3. 첫 번 째 를 제외 하고 집합 중의 모든 데이터 요 소 는 하나의 전구 만 있 습 니 다. 4. 마지막 을 제외 하고 집합 중의 모든 요 소 는 하나의 후속 만 있 습 니 다.
선형 표 의 유형 정의
linear list 는 가장 자주 사용 되 고 가장 간단 한 데이터 구조 이다.n 개의 데이터 요 소 를 나타 내 는 선형 서열
쉽게 말 하면 직선 적 인 데이터 구조 이다.모든 노드 는 하나의 데이터 요소 로 하나의 변수 일 수도 있 고 하나의 구조 체 일 수도 있 지만 그들 사이 에는 직선 적 인 관계 가 존재 한다.
선형 표 는 사실은 데이터 구조 집합 이다. 이런 데이터 구조 집합 은 선형 데이터 구 조 를 많이 포함 하고 순서 표, 링크, 대기 열, 스 택 등에 들어간다.
선형 표 의 순서 표시 와 실현
선형 표 의 순 서 는 한 그룹의 주소 로 연속 적 인 저장 장치 로 선형 표 의 데이터 요 소 를 순서대로 저장 하 는 것 을 말한다.
//
#define LIST_INIT_SIZE 100 //
#define LISTINCREMENT 10 //
typedef struct {
ElemType *elem; //
int length; //
int listsize;// ( sizeof(ElemType) )
}
선형 표 순서 표시 조작 실례 코드
/***
*Arrlist.h
* Copyright © 2016 liuxinming. All rights reserved.
*Purpose:
* 、 、 、 、 、 、
***/
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#define LIST_INIT_SIZE 100 //
#define LISTINCREMENT 10 //
//
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERLOW -2
// Status ,
typedef int Status;
typedef int ElemType;
// ----- -----
typedef struct
{
ElemType * elem; //
int length; //
int listsize; // ( sizeof(ElemType) )
}SqList;
// : L
Status InitList(SqList *L){
//
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(! L->elem) exit(OVERLOW); //
L->length = 0; // 0
L->listsize = LIST_INIT_SIZE; //
return OK;
}// InitList_sq
// : L
// : L
Status DestroyList(SqList *L){
//
if (L == NULL) {
return ERROR;
}
// calloc, malloc, realloc
free(L->elem);
L->elem = NULL;
L->length = 0;
L->listsize = 0;
return OK;
}// DestroyList
// : L
// : L 。
Status ClearList(SqList *L){
//
if (L == NULL) {
return ERROR;
}
L->length = 0;
return OK;
}// ClearList
// : L
// : L , TRUE, FALSE
Status ListEmpty(SqList L){
if (L.length == 0)
return TRUE;
else
return FALSE;
}// ListEmpty
// : L
// : L
Status ListLength(SqList L){
return L.length;
}
// : L , 1<=i<=ListLength(L)
// : e L i
Status GetElem(SqList L, int i, ElemType *e){
if (i<1 || i>L.length)
exit(ERROR);
*e =* (L.elem+i-1);
return OK;
}
// : L ,compare() ( 1, 0)。
// : L 1 e compare() 。 , 0.
Status LocateElem(SqList L, ElemType e, Status(*compare)(ElemType,ElemType)){
ElemType *p;
int i = 1; // i
p = L.elem; // p
while (i <= L.length && !compare(*p++,e)) {
++i;
}
if (i<=L.length)
return i;
else
return ERROR;
}
// : L
// : cur_e L , , pre_e , ,pre_e
Status PriorElem(SqList L, ElemType cur_e, ElemType *pre_e){
int i = 2;
ElemType *p = L.elem + 1;
while (i <= L.length && *p!=cur_e) {
p++;
i++;
}
if (i>L.length)
return INFEASIBLE;
else{
*pre_e = *--p;
return OK;
}
}
// : L
// : cur_e L , , next_e , ,next_e
Status NextElem(SqList L, ElemType cur_e, ElemType *next_e){
int i = 1;
ElemType *p = L.elem;
while (i < L.length && *p!=cur_e) {
i ++;
p ++;
}
if (i == L.length)
return INFEASIBLE;
else{
*next_e = *++p;
return OK;
}
}
// : L ,1<=i<=ListLength(L)+1
// : L i e,L 1
Status ListInsert(SqList *L, int i, ElemType e){
ElemType *newbase,*q,*p;
if(i<1 || i>L->length+1)
return ERROR; // i
if(L->length>=L->listsize) // ,
{
newbase = (ElemType *)realloc(L->elem,(L->listsize + LISTINCREMENT) * sizeof(ElemType));
if(!newbase) exit(OVERLOW); //
L->elem = newbase; //
L->listsize += LISTINCREMENT; //
}
q=L->elem+i-1; /* q */
for(p=L->elem+L->length-1;p>=q;--p) /* */
*(p+1)=*p;
*q=e; /* e */
++L->length; /* 1 */
return OK;
}
// : L ,1,=i<=ListLength(L)
// : L i , e ,L -1
Status ListDelete(SqList *L, int i, ElemType *e){
ElemType *p, *q;
if (i<1 || i>L->length)
return ERROR; // i
p = L->elem+i-1; // p
*e = *p; // e
q = L->elem + L->length - 1; //
for (++p; p<=q; ++p) { //
*(p-1) = *p;
L->length--; // -1
}
return OK;
}
// : L
// : L vi()。 vi() ,
Status ListTraverse(SqList L, void(*vi)(ElemType*)){
ElemType *p;
int i;
p = L.elem;
for (i=1; i<=L.length; i++) {
vi(p++);
}
printf("
");
return OK;
}
테스트 코드:
//
// main.c
// arrlist
//
// Created by liuxinming on 16/9/17.
// Copyright © 2016 liuxinming. All rights reserved.
//
#include
#include "Arrlist.h"
// ,Union()
Status equal(ElemType c1,ElemType c2)
{
if(c1==c2)
return TRUE;
else
return FALSE;
}
// Lb La La
void Union(SqList *La,SqList Lb)
{
ElemType e;
int La_len,Lb_len;
int i;
La_len=ListLength(*La); //
Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e); // Lb i e
if(!LocateElem(*La,e,equal)) // La e ,
{
ListInsert(La,++La_len,e);
}
}
}
void print(ElemType *c)
{
printf("%d ",*c);
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("Testing start!
");
SqList La,Lb;
ElemType t1,t2,t3;
t1 = 10;
t2 = 20;
t3 = 30;
int t1_length,t2_length,t3_length, i;
// La
InitList(&La);
// t1
ListInsert(&La, 1, t1);
//
t1_length = ListLength(La);
// t2
ListInsert(&La, 2, t2);
t2_length = ListLength(La);
// t3
ListInsert(&La, 3, t3);
t3_length = ListLength(La);
// L
printf("t1_length=%d,t2_length=%d,t3_length=%d
",t1_length,t2_length,t3_length);
// La
printf("La= ");
ListTraverse(La,print);
// Lb 5
InitList(&Lb);
for (i=1; i<=5; i++) {
ListInsert(&Lb, i, 2 * i);
}
// Lb
printf("Lb= ");
ListTraverse(Lb, print);
// Lb
printf("Lb length = %d
",ListLength(Lb));
// La U Lb
Union(&La, Lb);
// L
printf("new La= ");
ListTraverse(La,print);
printf("end
");
return 0;
}
실행 결과:
Testing start! t1_length=1,t2_length=2,t3_length=3 La= 10 20 30 Lb= 2 4 6 8 10 Lb length = 5 new La= 10 20 30 2 4 6 8 end Program ended with exit code: 0
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.