簡體   English   中英

C二維數組到鏈接列表

[英]C Two Dimensional Array into Linked List

所以我仍在努力用C語言編寫鏈接列表。它們對我來說真是令人難以置信,因為我還沒有完全理解指針,更不用說指向指針的指針了,以及鏈接列表需要的動態內存分配。

我正在嘗試創建一個具有獨立的高度和寬度值的二維數組。 最多為30x30。 我有一個二維數組,我們稱它為arr [x] [y]。 arr [x] [y]填充了從-2到1的整數值,我如何將這個二維數組傳輸到鏈接列表中? 然后,我怎么會一時興起從此鏈接列表中訪問值? 我很困惑,任何幫助將不勝感激。 我正在瀏覽我們講的教程。

另外,這應該是一種堆棧鏈接列表,我可以在其中調用諸如push(將新值推到鏈接列表的頂部),pop(從鏈接列表的頂部彈出一個值),top(返回最近推送到堆棧上的值),isEmpty(檢查堆棧是否為空)。

我不需要任何完整的代碼,但是這里的代碼會有所幫助。 我只需要了解鏈接列表,以及如何實現這些功能。

此外,這是與此相關的作業作業

這是一個迷宮求解器,我已經完成了將二維圖片解析為整數值的代碼。 如上所述,這就是我需要幫助的地方。

提示:從您的分配來看,堆棧不應該完全表示數組,而是表示您動態構建的路徑,以找到從迷宮的起始位置到迷宮的目標位置的方法。

基本上,您需要創建一個鏈接列表,該列表的每個節點都是作為成員包含的另一個列表(概念上向下增長)的頭部,以及列表中通常的下一個指針。

要訪問諸如arr [3] [4]之類的2D數組之類的元素,需要遍歷第一個列表,同時保持y的計數,然后向下移動x計數,或者反之亦然。

這是一種常見的數據結構分配,其名稱為“多堆棧或多隊列”,如果由列表實現,則將為您提供所需的內容。

struct Node
{
    int data;
    struct Node *next;
    struct Node *head; // This head can be null initially as well as for the last node in a direction
};

首先,您需要定義適當的結構。第一次創建列表時會更容易,該列表在指向下一個節點的指針為NULL時終止,然后您將發現帶有前哨,雙向列表以及現在的東西的列表。可能看起來太復雜了。
例如,這是一個結構:

typedef struct __node
{
    int info;
    struct __node* next;
}node;

typedef node* list;

這次我們假設列表和節點是同一件事,您將發現分隔列表的概念比節點的概念更為精確,例如,您可以將列表的長度存儲在列表中(避免每次計算所有節點時都進行計數) ,但現在讓我們那樣做。
您初始化列表:

list l=NULL;

因此,列表包含零個節點,要測試其是否為空,只需查看指針是否為NULL。
添加一個新元素:

if(NULL==l)
{
    l=(node*)malloc(sizeof(node));
    l->next=NULL;
    l->info=0;
}

現在列表包含零個節點,創建一個函數以添加一個新節點:

void pushBack(list* listPointer, int info)
{
    if(NULL==*listPointer)
    {
        *listPointer=(node*)malloc(sizeof(node));
        (*listPointer)->info=info;
    }
    else
    {
        node* ptr=l;
        while(ptr->next!=NULL)
            ptr=ptr->next;
        ptr->next=(node*)malloc(sizeof(node));
        ptr->info=info;
    }
}

您還可以在前面添加元素來提高效率,或者通過返回添加的元素來優化代碼,這樣就不必每次都找到最后一個元素了,現在我就把它留給您,現在讓我們為每個元素調用pushBack函數的數組:

for(int i=0; i<N; i++)
{
    pushBack(l,arr[i]);
}

就是這樣,了解您實現鏈表的方式。

您不應將整個數組轉換為鏈表,而應僅將最佳路徑轉換為鏈表。 當您遇到死胡同時,您將用蠻力做到這一點,嘗試方向和回溯。

您的路徑(鏈接列表)需要看起來像這樣:

struct PathNode
{
    int coordX, coordY;
    PathNode * next, * prev;
}

如果我以后記得,我會畫一張圖片或這種結構的東西,並將其添加到帖子中。 請在幾個小時后對此信息發表評論,以吸引我的注意力。

該列表將始終包含一個起點,該起點將是列表中的第一個節點。 當您一個接一個地移到其他位置時,可以將它們推到列表的末尾。 這樣,您可以簡單地按順序從列表中逐個彈出元素,從而遵循從當前位置到迷宮開始的路徑。

此特定的鏈表的特殊之處在於它有兩種方式:它具有指向下一個元素和上一個元素的指針。 只有兩個列表之一的列表稱為單鏈接列表,而這兩個列表都稱為雙鏈接列表。 單鏈列表只是一種方式,只能在一個方向上遍歷。

可以將鏈接列表視為一堆巨大的字符串,每個字符串都有一個起始端和一個結束端。 在迷宮中穿行時,您要在訪問的每個節點上系一根繩子,並隨身帶到下一個廣場。 如果必須回溯,可以將字符串帶回去,這樣它就不再指向錯誤的正方形。 一旦找到迷宮的盡頭,就可以通過跟隨字符串來跟蹤步伐。

您能解釋一下->到底是什么意思嗎?

->是多合一指針取消引用和成員訪問運算符。 說我們有:

PathNode * p = malloc(sizeof(*p));
PathNode q;

我們可以通過以下任意方式訪問p和q的成員:

(*p).coordX;
q.coordX;
p->coordX;
(&q)->coordX;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM