《算法筆記》—— 數組模擬鏈表

之前也花了一點時間去學習數據結構和算法,但沒有沉下心去學 . . .
從現在開始,我會更新一些好玩的算法,大家多多支持,雖然也沒多少人看 . . .


數組模擬鏈表

鏈表的優點就是對數據的增加與刪除比較方便,而數組的優點就是對數據的查找與修改 . . .
那我們可不可以想到一個方法,讓數組能夠幹鏈表的事呢 ?
接下來就讓我們來體驗一下這思想上愉悅的感覺吧 ^ _ ^

我們都知道鏈表的結點之間都是通過一個指針有相連的,數組的索引方式是通過下標的進行的,所以我們就 用數組的下標來完成鏈表的結點相連操作 . . .

模擬鏈表的大概樣子如下圖所示:

在這裏插入圖片描述

第一個數組是用來存放數據的,它最後多出的一個空間是用來存儲插入的數據
第二個數組是第一個數據數組索引的下一個索引,比如數據1,它的索引是1,所以它的下一個索引是 2,大體思路就是通過這下一個索引來訪問數據 . . .

.

我們要完成的是插入一個數據,最後通過這個類似鏈表指針的數組來完成簡單訪問排序的例子 . . .

.


大體的思路如下:

  1. 將插入的數據放在最後一個元素中
  2. 插入的數據與前面的數據逐個比較,找到合適的位置
  3. 找到合適位置之後,將他們的數據索引的下一個索引交換位置

思路圖如下:

  • 插入數據
    在這裏插入圖片描述
  • 逐個比較,找到合適位置

在這裏插入圖片描述

  • 數據索引的下一個索引交換位置

在這裏插入圖片描述

最後我們通過這個 right數組來訪問 arr中的元素,這樣我們訪問到的元素就是排序好的數據了. . .

.


下面我們來用代碼來測試一下吧

#include <stdio.h>

int main()
{
    int arr[11] = {0, 1, 2, 3, 5, 6, 7, 8, 9, 10};	// 存儲的數據
    int right[11] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 0};	// 與arr對應的數據索引的下一個索引
    
    arr[10] = 4;	// 插入的數據
    int i = 9;		// 與之比較的第一個索引下標
    	
    while(i >= 0)	// 開始尋找合適的位置
    {
        if(arr[10] > arr[i])
    	{
            right[10] = right[i];	// 開始交換 right中的下標索引
 	    right[i] = 10;
   	    break;
  	}
        
        i--;
    }
    
    i = 1;
    while(i != 0)
    {
        printf("%d ", arr[i]);
  	i = right[i]; 		// 利用 right中的數據來輸入arr的數據
    }  
    
    return 0;
}

程序的結果如下圖所示:

在這裏插入圖片描述

.


作者:浪子花夢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章