Abstraction
使用C語言簡單的實現linked list,並用C++的std::vector實作出相同的功能作比較。
Introduction
學習資料結構,第一個要學的就是linked list,本文示範最簡單的linked list實現,包含建立與顯示,可把它當成linked list的標準範本,畢竟步驟都差不多。
一個基本的問題:為什麼需要linked list?若要將大量資料存到記憶體,你會想到什麼?第一個想到的就是array,但C語言是個靜態語言,array必須事先宣告大小,這樣compiler才能進行最佳化,若到時候沒用這麼多記憶體,就白白浪費記憶體了。或許你會說array可以配合malloc()變成動態array,但前提是你必須告訴malloc()要建立多大的array,若連要建立多大的陣列也不確定,而是在run-time看有多少資料就建立多大,這時連malloc()的動態array也不能用了,此時就得靠linked list。
linked list是資料結構的基礎,基本上就是靠struct如火車車廂那樣連在一起,run-time有需要時,在動態掛一個struct上去。
For C語言:
執行結果:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define SLEN 255
- struct list {
- int no;
- char name[SLEN];
- struct list *next;
- };
- int main() {
- int no;
- char s[255];
- struct list *head = NULL;
- struct list *current = NULL;
- struct list *prev = NULL;
- while(1) {
- printf("No. = ");
- scanf("%d", &no);
- if (no == 0)
- break;
- printf("Name = ");
- scanf("%s", s);
- current = (struct list *)malloc(sizeof(struct list));
- if (current == NULL)
- exit(EXIT_FAILURE);
- current->next = NULL;
- current->no = no;
- strncpy(current->name, s, SLEN -1);
- current->name[SLEN -1] = '\0';
- if (head == NULL)
- head = current;
- else
- prev->next = current;
- prev = current;
- }
- // display linked list
- current = head;
- while(current != NULL) {
- printf("No. = %d, Name = %s\n", current->no, current->name);
- current = current->next;
- }
- // free linked list
- current = head;
- while(current != NULL) {
- prev = current;
- current = current->next;
- free(prev);
- }
- return 0;
- }
好吧,我承認怪怪的,可以Work了!
- 1
- ssss
- 2
- kkkk
- 3
- gggg
- 4
- llll
- 0
- No. = Name = No. = Name = No. = Name = No. = Name = No. = No. = 1, Name = ssss
- No. = 2, Name = kkkk
- No. = 3, Name = gggg
- No. = 4, Name = llll
For C++:
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- class List {
- public:
- int no;
- string name;
- };
- int main() {
- vector<list> vec;
- while(1) {
- List list;
- cout << "No. = ";
- cin >> list.no;
- if (list.no == 0)
- break;
- cout << "Name = ";
- cin >> list.name;
- vec.push_back(list);
- }
- vector<list>::iterator iter = vec.begin();
- for(; iter != vec.end(); ++iter)
- cout << "No. = " << iter->no << ", Name = " << iter->name << endl;
- return 0;
- }
C++看起來簡單多了!
0 意見:
張貼留言