鏈結串列(Linked List)

鏈結串列是由許多相同資料型態的項目,所組成的有限序列,這邊使用單向鏈結串列,串列每個節點除了要儲存原本的資料,還必須要儲存下一筆資料的位址,大概為以下的流程:
1.建立新節點,並另一流動指標指向頭節點(ptr=head)。
2.建立另一個新節點,並把兩個節點串起來(ptr->next=newnode)。
3.將流動指標指向剛剛建立的節點(ptr=ptr->next)。
4.重複上面2和3的步驟。

#include <iostream> 
using namespace std;

struct List{
    char *name;
    int age;
    List *next;
};

List *createList(char*name, int age);
void addANode(List *&ptr, char*name, int age); //要用參考才能改變ptr引數的指向位址
void deleteList(List *head);
void printfList(List *head);

int main(){
    List *head = createList("Mike", 18);
    List *ptr = head;
    addANode(ptr, "Bill", 20);
    addANode(ptr, "Lisa", 15);

    ptr = head;
    printfList(ptr);

    deleteList(head);
    return 0;
}

List *createList(char*name, int age){
    List *head = new List;
    if (!head){
        cout << "配置記憶體失敗" << endl;
        exit(1);
    }
    head->name = name;
    head->age = age;
    head->next = NULL;
    return head;
}
void addANode(List *&ptr, char*name, int age){
    List *newnode = new List;
    if (!newnode){
        cout << "配置記憶體失敗" << endl;
        exit(1);
    }
    newnode->name = name;
    newnode->age = age;
    newnode->next = NULL;
    ptr->next = newnode;
    ptr = ptr->next;
}

void printfList(List *ptr){
    while (ptr != NULL){
        cout << "姓名:" << ptr->name << '\t' << "年齡:" << ptr->age << endl;
        ptr = ptr->next;
    }
}

void deleteList(List *head){
    while (head != NULL){
        List *delptr = head;
        head = head->next;
        delete delptr;
    }
}