資料結構之線性表的鏈式儲存 鍊錶

2021-09-10 01:38:48 字數 3208 閱讀 3793

為了彌補順序表插入和刪除操作需要移動大量元素的缺點,一般採用鍊錶儲存。通俗理解的話就是讓所有元素不必考慮存放位置,任意位置存放即可,**有空位就存到哪,只是需要每個元素知道其下乙個元素的位置在**就好。這樣我們就可以通過第乙個元素找到第二個元素,從而通過遍歷找到所有元素。

為了表示每個資料元素ai與其直接後繼元素ai+1之間的邏輯關係,對資料元素ai來說,除了儲存本身的資訊之外,還需要儲存乙個指示其直接後繼的資訊(即直接後繼的儲存位置)。我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱為指標或鏈。這兩部分資訊組成資料元素ai的儲存映像,稱為結點。n個結點 鏈結成乙個鍊錶,稱為線性表的鏈式儲存結構。

我們把鍊錶中的第乙個結點的儲存位置叫做頭指標。為了更加方便的對鍊錶進行操作,會在單鏈表的第乙個結點前附設乙個結點,稱為頭結點。頭結點的資料域可以不儲存資訊,頭結點的指標域儲存指向第乙個結點的指標。

頭結點與頭指標的比較:

頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標;

頭指標具有標識作用,所以常用頭指標冠以鍊錶的名字;

無論鍊錶是否為空,頭指標均不為空。頭指標是鍊錶的必要元素。

頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其資料域一般不儲存資訊;

有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作與其他結點的操作就統一了;

頭結點不一定是鍊錶的必須要素。

以不帶頭結點的單鏈表為例,常見的幾種操作為:

1.插入操作

bool linklistinsert(linklist* head, int i, elemtype e)

//頭插

if (i == 0)

//尋找插入位置i的前乙個結點

linklist pos = *head;//宣告乙個結點,從當前結點開始

for (int j = 0; pos != null && j < i - 1; j++)

if (pos == null)

node* s = (node*)malloc(sizeof(node));

s->data = e;

s->next = pos->next;

pos->next = s;

return true;

}

2.刪除操作

bool linklistdelete(linklist* head, int i)

//頭刪

if (i == 0)

else

//如果沒找到

if (pos == null || pos->next == null)

else

}}

3.求單鏈表長度

int lengthlinklist(linklist head)

return len;

}

4.單鏈表反轉

void listreverse(linklist* head)

//定義三個指標,p1,p2,p3

node* p1 = *head;

node* p2 = p1->next;

node* p3 = p2->next;

//p2的next指向p1

p2->next = p1;

while (p3 != null)

(*head)->next = null;

*head = p2;

}

5.找出單鏈表中倒數第i個元素

node* findlast(linklist head, int i)

int j = 0;

for (pfast = head; pfast != null && j < i - 1; j++)

if (pfast == null)

pslow = head;

while (pfast->next != null)

return pslow;

}

6.找出單鏈表的中間元素

node* getmiddle(linklist head)

while (pfast->next != null)

pfast = pfast->next;

pslow = pslow->next;

} return pslow;

}

7.獲取單鏈表中第i個位置的元素

node* getelem(linklist head, int i)

node* pos = head;//宣告乙個結點指向l的第乙個結點

for (int j = 0; j < i && pos != null; j++)

return pos;

}

8.清空操作

void clearlist(linklist* head)

}

9.列印

void showlist(linklist head)

puts("");

}

測試函式和宣告部分:

//shengmingbufen

typedef int elemtype;

typedef struct _node

node;

typedef node* linklist;

//測試函式

int main()

//showlist(head);

//獲取倒數第i個元素,如果找到則將該位置的元素置為88

//node* pos = findlast(head, 1);

//if (pos != null)

// //showlist(head);

//獲取鍊錶中間元素,並將該元素置為88

//node* pos = getmiddle(head);

//if (pos != null)

// //showlist(head);

clearlist(&head);

printf("%d\n", lengthlinklist(head));

showlist(head);

return 0;

}

以上即為我對單鏈表的內容的總結~~

資料結構 線性表之鏈式儲存結構

資料結構定義 common.h ifndef hi comm h define hi comm h include include include include define list init size 100 線性表儲存空間的初始分配量 define list increment 10 線性表...

資料結構 鏈式儲存線性表

鏈式儲存結構的線性表 簡稱為鍊錶 將採用一組位址任意的儲存單元存放線性表中的資料元素,鏈式結構的線性表不會按線性的邏輯順序來儲存資料元素,它需要在每乙個資料元素裡儲存乙個引用下乙個資料元素的引用。優點 插入 刪除元素快,充分利用計算機記憶體空間 缺點 查詢元素需要整體遍歷,空間開銷大 單鏈表 cre...

線性表的鏈式儲存 資料結構

為了表示每個資料元素與其直接後繼資料元素之間的邏輯關係,除了儲存本身的資訊之外,還需儲存乙個指示其直接後繼的資訊 即直接後繼的儲存位置 我們把儲存資料元素資訊的位置稱為資料域,把儲存其直接後繼資訊的位置稱為指標域。這兩部分組成資料元素的結點 node 頭結點頭結點是為了操作的統一和方便而設立的,放在...