선형 표 (단일 체인 표, 더 블 링크, 정적 링크 와 순환 링크) 를 상세 하 게 서술 합 니 다.

323320 단어 데이터 구조
선형 표: 0 개 또는 여러 개의 데이터 요소 로 구 성 된 유한 한 서열.
   
 관건:
유한 시퀀스 첫 번 째 요 소 는 하나의 전구 결점 만 있 고 마지막 요 소 는 하나의 후계 결점 만 있 으 며 중간 요 소 는 하나의 전구 결점 과 하나의 후계 결점 이 있다.
선형 표 는 0 개의 데이터 요 소 를 가 질 수 있 는데 빈 표 라 고 부른다.
선형 표 는 순서 저장 구조 와 체인 저장 구조 로 나 뉜 다.
순차 기억 구조:
    주소 연속 저장 공간 으로 선형 표 의 데이터 구 조 를 순서대로 저장 합 니 다.
    
물리 적 관계 상:
    
    메모리 에서 초기 주 소 를 찾 은 다음 에 자 리 를 차지 하 는 방식 으로 일정한 메모리 공간 을 점령 한 다음 에 같은 데이터 형식의 데이터 요 소 를 순서대로 이 메모리 에 저장 하 는 것 입 니 다.
 
    
 속성:
저장 공간의 시작 위치, 배열 data, 그의 저장 위 치 는 선형 표 저장 공간의 저장 위치 이다.
선형 표 의 최대 저장 용량: 배열 의 길이 MAXSIZE 선형 표 의 현재 길이: length      주의:
            배열 의 길이 와 선형 표 의 현재 길 이 는 구분 해 야 한다. 배열 의 길 이 는 선형 표를 저장 하 는 저장 공간의 총 길이 이 고 보통 초기 화 된 후에 변 하지 않 으 며 선형 표 의 현재 길 이 는 선형 표 에서 요소 의 개수 로 변화 할 것 이다.
 
    
순서 링크 삽입 동작:
        생각:
삽입 위치 가 불합리 하면 이상 던 지기 선형 표 길이 가 배열 길이 보다 크 면 이상 또는 동적 확장 을 던 집 니 다.
마지막 요소 부터 i 번 째 위치 로 옮 겨 다 니 며 각각 한 자 리 를 뒤로 이동 합 니 다             
     메모: 선형 표 는 1 부터 시작 합 니 다.
  
  순서 링크 삭제 작업:
         생각:
삭제 위치 가 불합리 하면 이상 던 지기 삭제 요소 추출 요소 의 위 치 를 삭제 할 때 부터 마지막 요소 의 위 치 를 옮 겨 다 니 며 각각 한 위 치 를 앞으로 이동 합 니 다 .
시계 길이 1 감소
      
      
      
      
  1. /* : L ,1<=i<=ListLength(L)*/
  2. /* : L i , e ,L -1*/
  3. Status ListDelete(Sqlite *L, int i, ElemType *e)
  4. {
  5. int k;
  6. if(L -> length == 0)
  7. {
  8. return ERROR;
  9. }
  10. if(i < 1 || i > L -> length)
  11. {
  12. return ERROR;
  13. }
  14. *e = L -> data(i - 1);
  15. if(i < L -> length)
  16. {
  17. for(k = i; k < L -> length; k++)
  18. {
  19. L -> data(k - 1) = L -> data(k);
  20. }
  21. }
  22. L -> length --;
  23. return OK;
  24. }

        : , , O(1);
        : , , O(n);

         , 、 , , O(1), , O(n)。
        , ,
         
        
        :
  • ” ”

    , —— 。

    ?
        , , , 。

    :
  •  
  • , , , ( )
 
    :
               , , 。 , 。

        ?
            :
  • , ,
  • , ( )
            :
  • , , ( )
  • , 。
 
    
        :
  1. p , j 1
  2. j < i , , p , , j + 1
  3. p , i
  4. , p
      
      
      
      
  1. /* : L ,1<=i<=ListLength(L)*/
  2. /* : L i , e ,L -1*/
  3. Status GetElem(LinkList *L, int i, ElemType *e)
  4. {
  5.     int k;
  6.    LinkList p;
  7.     p = L -> next;
  8.    j = 1;
  9.    while(p && j < 1)
  10.    {
  11.      p = p -> next;
  12.     ++j;
  13.    }
  14.     if(!p || j > i)
  15.     {
  16.         return ERROR;
  17.     }
  18.     *e = p -> data;
  19.     return OK;
  20. }
     
    
        :
  1. p , j 1
  2. j < i , , p , , j ++
  3. p , i
  4. , s
  5. e s -> data
  6.   

         

       
       
       
       
  1. /* : L ,1<=i<=ListLength(L)*/
  2. /* : L i , e ,L -1*/
  3. Status GetElem(LinkList *L, int i, ElemType *e)
  4. {
  5. int k;
  6. LinkList p,s;
  7. p = *L;
  8. j = 1;
  9. while(p && j < 1)
  10. {
  11. p = p -> next;
  12. j++;
  13. }
  14. if(!p || j > i)
  15. {
  16. return ERROR;
  17. }
  18. s = (LinkList)malloc(sizeof(Node));
  19. s -> data = e;
  20. s -> next = p -> next;
  21. p -> next = s;
  22. return OK;
  23. }

    
        :
  1. p , j = 1
  2. j < 1 , , p , , j++
  3. p , i
  4. , p -> next q
  5. :p -> next = q -> next
  6. q e,
  7. q
 
     
     
     
     
  1. /* : L ,1<=i<=ListLength(L)*/
  2. /* : L i , e ,L -1*/
  3. Status GetElem(LinkList *L, int i, ElemType *e)
  4. {
  5. int k;
  6. LinkList p,q;
  7. p = *L;
  8. j = 1;
  9. while(p && j < 1)
  10. {
  11. p = p -> next;
  12. j++;
  13. }
  14. if(!p || j > i)
  15. {
  16. return ERROR;
  17. }
  18. q = p -> next;
  19. p -> next = q -> next;
  20. *e = q -> data;
  21. free(q);
  22. return OK;
  23. }

  • , , : i , :
  • O(n)
  • i , ,
  • i , , O(1)( )

    
        :
  1. p i
  2. L
  3. L NULL ,

     
        , , , ,
        :
  1. next
  2. next
 
     
     
     
     
  1. /* */
  2. void CreateListHead(LinkList *L, int n)
  3. {
  4. LinkList p;
  5. int i;
  6. srand(time(0));
  7. *L = (LinkList)malloc(sizeof(Node));
  8. (*L) -> next = NULL;
  9. for(i = 0; i < n; i++)
  10. {
  11. p = (LinkList)malloc(sizeof(Node));
  12. p -> data = rand() % 100 + 1;
  13. p -> next = (*L) -> next;
  14. (*L) -> next = p;
  15. }
  16. }

      
      
      
      
      
  1. /* */
  2. void CreateListTail(LinkList *L, int n)
  3. {
  4. LinkList p, r;
  5. int i;
  6. srand(time(0));
  7. *L = (LinkList)malloc(sizeof(Node));
  8. r = *L;
  9. for(i = 0; i < n; i++)
  10. {
  11. p = (LinkList)malloc(sizeof(Node));
  12. p -> data = rand() % 100 + 1;
  13. r -> next = p;
  14. r = p;
  15. }
  16. r -> next = NULL;
  17. }

      
        :
  1. p q
  2. p, q
  3. p q p

      
      
      
      
  1. Status ClearList(LinkList *L)
  2. {
  3. LiskList p, q;
  4. p = (*L) -> next;
  5. while(p)
  6. {
  7. q = p -> next;
  8. free(p);
  9. p = q;
  10. }
  11. (*L) -> next = NULL;
  12. return OK;
  13. }

    
           2.  
                (1) 
  • :O(1)
  • :O(n)
                (2)
  • , :O(n)
  • , , :O(1)
          3.  

      
        
6 5 3 4 5 2 7 …… 1
  A C D E B   ……  
0 1 2 3 4 5 6 …… 999

      
      
      
      
  1. #define MAX_SIZE = 1000
  2. typedef struct
  3. {
  4. ElemType data ;
  5. int cur ;
  6. }Component , StaticLinkList[MAX_SIZE];
  7. Status InitList(StaticLinkList L)
  8. {
  9. for(int i= 0 ; i < MAX_SIZE-1 ; ++i)
  10.     {  
  11.         space[i].cur = i+1 ;
  12.     }
  13.     space[MAX_SIZE-1].cur = 0 ;
  14.     return OK ;
  15. }
  16. //
  17. int Malloc_SSL(StaticLinkList L )
  18. {
  19. int i = space[MAX_SIZE-1].cur ; //
  20. if(space[0].cur) //
  21.        {
  22. i = space[0].cur ; //
  23. }
  24. space[0].cur = space[i].cur ; // ,
  25.         
  26.       return i ;
  27. }
  28. // :
  29. Status InserList(StaticLinkList L , int i , ElemType e)
  30. {
  31. int k = MAX_SIZE-1 ;
  32. if( i < 1 || i >Length(L)+1)
  33.           return ERROR ;
  34.       int j = Malloc_SSL(L) ; //
  35. if (j) //
  36.       {
  37.             L[j].data = e ;  
  38.             for(int m = 1 ; m < i ; ++m) // i-1
  39.                 k = L[k].cur
  40.             
  41.             L[j].cur = L[k].cur ; // i-1 cur , i-1 cur
  42.             L[k].cur = j ;
  43. return OK ;
  44. }
  45. return ERROR ;
  46. }
  47. // :
  48. Status DeleteLinkList(StaticLinkList L , int i )
  49. {
  50.     if(i < 1 || i > ListLength(L))
  51.         return ERROR ;
  52.     
  53.     int k = MAX_SIZE - 1 ;
  54.     for(int j = 1 ; j < i ; ++j) // i-1
  55.     {
  56.         k = L[k].cur ;
  57.     }
  58. j = L[K].cur ; // i
  59. L[k].cur = L[j].cur ; // i cur i-1 cur
  60. Free_SSL(L , j); // i , i j
  61. return OK;
  62. }
  63. // Free_SSL
  64. void Free_SSL(StaticLinkList L , int i )
  65. {
  66.     L[i].cur = space[0].cur ; // L[i] cur
  67. space[0].cur = i ; // i
  68. }
    :
    :
        , , ,
    :
  • ( )
 
    :

     : L,  L / 2
    :
        *search, *mid , *search *mid 2 。 *search ,*mid 。
      
      
      
      
  1. Status GetMidNode(LinkList L, ElemType *e)
  2. {
  3. LinkList search, mid;
  4. mid = search = L;
  5. while(search -> next != NULL)
  6. {
  7. if(search -> next -> next != NULL)
  8. {
  9. search = search -> next -> next;
  10. mid = mid -> next;
  11. }
  12. else
  13. {
  14. search = search -> next;
  15. }
  16. }
  17. *e = mid -> data;
  18. return OK;
  19. }

  :
         
 
head == head -> next
 
     
     
     
     
  1. #include
  2. #include
  3. /* */
  4. typedef struct CLinkList {
  5. int data ;
  6. struct CLinkList * next ;
  7. }node;
  8. int main()
  9. {
  10. node * pHead = NULL ;
  11. char opp;
  12. int find;
  13. printf("
    1.
    2.
    3.
    4.
    5.
    0.

    "
    );
  14. while(opp != '0'){
  15. scanf("%c",&opp);
  16. switch(opp){
  17. case '1':
  18. ds_init(&pHead);
  19. printf("
    "
    );
  20. ds_traverse(pHead) ;
  21. break;
  22. case '2':
  23. printf(" ?");
  24. scanf("%d", &find);
  25. ds_insert(&pHead,find) ;
  26. printf(" %d :
    "
    , find) ;
  27. ds_traverse(pHead) ;
  28. printf("
    "
    );
  29. break;
  30. case '3':
  31. printf(" ?");
  32. scanf("%d", &find);
  33. ds_delete(&pHead,find) ;
  34. printf(" %d :
    "
    , find) ;
  35. ds_traverse(pHead) ;
  36. printf("
    "
    );
  37. break;
  38. case '4':
  39. printf(" ?");
  40. scanf("%d", &find);
  41. printf(" %d :%d
    "
    , find, ds_search(pHead,find)) ;
  42. //ListTraverse(L);
  43. printf("
    "
    );
  44. break;
  45. case '5':
  46. ds_traverse(pHead) ;
  47. printf("
    "
    );
  48. break;
  49. case '0':
  50. exit(0);
  51. }
  52. }
  53. return 0 ;
  54. }
  55. /************************************************************************/
  56. /* */
  57. /************************************************************************/
  58. /* */
  59. void ds_init(node **pNode) {
  60. int item ;
  61. node *temp ;
  62. node *target ;
  63. printf(" , 0
    "
    );
  64. while(1) {
  65. scanf("%d",&item) ;
  66. fflush(stdin) ;
  67. if(item == 0)
  68. return ;
  69. if((*pNode) == NULL) { /* */
  70. *pNode = (node*)malloc(sizeof(struct CLinkList)) ;
  71. if(!(*pNode))
  72. exit(0) ;
  73. (*pNode)->data = item ;
  74. (*pNode)->next = *pNode ;
  75. }
  76. else {
  77. /* next */
  78. for(target = (*pNode) ; target->next != (*pNode) ; target = target->next) 
  79.                 ;
  80. /* */
  81. temp = (node *) malloc(sizeof(struct CLinkList)) ;
  82. if(!temp)
  83. exit(0) ;
  84. temp->data = item ;
  85. temp->next = *pNode ;
  86. target->next = temp ;
  87. }
  88. }
  89. }
  90. /* */
  91. /* : , */
  92. void ds_insert(node ** pNode ,int i) {
  93. node * temp ;
  94. node * target ;
  95. node * p ;
  96. int item ;
  97. int j = 1 ;
  98. printf(" :");
  99. scanf("%d",&item) ;
  100. if(i == 1) { //
  101. temp = (node *)malloc(sizeof(struct CLinkList)) ;
  102. if(!temp)
  103. exit(0) ;
  104. temp ->data = item ;
  105. /* */
  106. for(target = (*pNode) ; target->next != (*pNode) ; target = target->next) ;
  107. temp->next = (*pNode) ;
  108. target->next = temp ;
  109. *pNode = temp ;
  110. }
  111. else {
  112. target = *pNode ;
  113. for( ; j < (i-1) ; target=target->next,++ j) ;
  114. temp = (node *)malloc(sizeof(struct CLinkList)) ;
  115. if(!temp)
  116. exit(0) ;
  117. temp ->data = item ;
  118. p = target->next ;
  119. target->next = temp ;
  120. temp->next = p ;
  121. }
  122. }
  123. /* */
  124. void ds_delete(node ** pNode,int i) {
  125. node * target ;
  126. node * temp ;
  127. int j = 1 ;
  128. if(i == 1) { //
  129. /* */
  130. for(target = *pNode ; target->next != *pNode ;target = target->next) ;
  131. temp = *pNode ;
  132. *pNode = (*pNode)->next ;
  133. target->next = *pNode ;
  134. free(temp) ;
  135. }
  136. else {
  137. target = *pNode ;
  138. for( ; j < i-1 ; target= target->next,++j) ;
  139. temp = target->next ;
  140. target->next = temp->next ;
  141. free(temp) ;
  142. }
  143. }
  144. /* */
  145. int ds_search(node * pNode,int elem) {
  146. node * target ;
  147. int i = 1 ;
  148. for(target = pNode ; target->data != elem && target->next != pNode ; ++i , target = target->next) ;
  149. if(target->next == pNode) /* */
  150. return 0 ;
  151. else
  152. return i ;
  153. }
  154. /* */
  155. void ds_traverse(node * pNode) {
  156. node * temp ;
  157. temp = pNode ;
  158. printf("*********** ******************
    "
    );
  159. do {
  160. printf("%4d ",temp->data) ;
  161. }while((temp = temp->next) != pNode) ;
  162. printf("
    "
    ) ;
  163. }

  :
    (1)

    (2)

    (3) ,

      
      
      
      
  1. typedef struct _DOUBLE_LINK_NODE
  2. {
  3. int data;
  4. struct _DOUBLE_LINK_NODE* prev;
  5. struct _DOUBLE_LINK_NODE* next;
  6. }DOUBLE_LINK_NODE;
  7. DOUBLE_LINK_NODE* create_double_link_node(int value)
  8. {
  9. DOUBLE_LINK_NODE* pDLinkNode = NULL;
  10. pDLinkNode = (DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));
  11. assert(NULL != pDLinkNode);
  12. memset(pDLinkNode, 0, sizeof(DOUBLE_LINK_NODE));
  13. pDLinkNode->data = value;
  14. return pDLinkNode;
  15. }
  16. void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode)
  17. {
  18. DOUBLE_LINK_NODE* pNode;
  19. if(NULL == *pDLinkNode)
  20. return ;
  21. pNode = *pDLinkNode;
  22. *pDLinkNode = pNode->next;
  23. free(pNode);
  24. delete_all_double_link_node(pDLinkNode);
  25. }
  26. DOUBLE_LINK_NODE* find_data_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int data)
  27. {
  28. DOUBLE_LINK_NODE* pNode = NULL;
  29. if(NULL == pDLinkNode)
  30. return NULL;
  31. pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
  32. while(NULL != pNode){
  33. if(data == pNode->data)
  34. return pNode;
  35. pNode = pNode ->next;
  36. }
  37. return NULL;
  38. }
  39. STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)
  40. {
  41. DOUBLE_LINK_NODE* pNode;
  42. DOUBLE_LINK_NODE* pIndex;
  43. if(NULL == ppDLinkNode)
  44. return FALSE;
  45. if(NULL == *ppDLinkNode){
  46. pNode = create_double_link_node(data);
  47. assert(NULL != pNode);
  48. *ppDLinkNode = pNode;
  49. (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;
  50. return TRUE;
  51. }
  52. if(NULL != find_data_in_double_link(*ppDLinkNode, data))
  53. return FALSE;
  54. pNode = create_double_link_node(data);
  55. assert(NULL != pNode);
  56. pIndex = *ppDLinkNode;
  57. while(NULL != pIndex->next)
  58. pIndex = pIndex->next;
  59. pNode->prev = pIndex;
  60. pNode->next = pIndex->next;
  61. pIndex->next = pNode;
  62. return TRUE;
  63. }
  64. STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)
  65. {
  66. DOUBLE_LINK_NODE* pNode;
  67. if(NULL == ppDLinkNode || NULL == *ppDLinkNode)
  68. return FALSE;
  69. pNode = find_data_in_double_link(*ppDLinkNode, data);
  70. if(NULL == pNode)
  71. return FALSE;
  72. if(pNode == *ppDLinkNode){
  73. if(NULL == (*ppDLinkNode)->next){
  74. *ppDLinkNode = NULL;
  75. }else{
  76. *ppDLinkNode = pNode->next;
  77. (*ppDLinkNode)->prev = NULL;
  78. }
  79. }else{
  80. if(pNode->next)
  81. pNode->next->prev = pNode->prev;
  82. pNode->prev->next = pNode->next;
  83. }
  84. free(pNode);
  85. return TRUE;
  86. }
  87. int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode)
  88. {
  89. int count = 0;
  90. DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
  91. while(NULL != pNode){
  92. count ++;
  93. pNode = pNode->next;
  94. }
  95. return count;
  96. }
  97. void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode)
  98. {
  99. DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
  100. while(NULL != pNode){
  101. printf("%d
    "
    , pNode->data);
  102. pNode = pNode ->next;
  103. }
  104. }

 

좋은 웹페이지 즐겨찾기