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