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에 따라 라이센스가 부여됩니다.