資料結構之連結串列篇(單連結串列的常見操作)

糖醋麻辣蝦發表於2018-10-08

單連結串列的常見操作:

  1. 連結串列的定義
  2. 連結串列的初始化
  3. 連結串列的建立
  4. 測表長
  5. 連結串列插入
  6. 連結串列刪除
  7. 列印連結串列
  8. 反轉連結串列
// 連結串列的定義
struct linkList {
    int value;
    linkList *next;
};

// 連結串列的初始化
void initList(linkList *L)
{
    L = nullptr;
}

// 連結串列的建立(頭插入法)
linkList* createList()
{
    linkList * head = new linkList;
    head->next = nullptr;
    if (head == nullptr)
    {
        std::cout << "分配記憶體失敗!" << std::endl;
        return nullptr;
    }

    int input;

    std::cout << "輸入連結串列值:" << std::endl;
    while (cin >> input && input != -1)
    {
        linkList *tmp = new linkList;
        tmp->value = input;
        tmp->next = head->next;
        head->next = tmp;
        tmp = nullptr;
    }

    return head;
}

// 測表長
int listLen(linkList *L)
{    
    int length = 0;
    while (L != nullptr)
    {
        length++;
        L = L->next;
    }
    //std::cout << "表長為:" << length - 1 << std::endl;
    return length-1;
}

// 連結串列插入
void insertList(linkList *L, int pos, int value)
{
    int index = 1;
    linkList *p = L;
    linkList *tmp = new linkList;
    tmp->value = value;
    if (pos <= 0 || pos > listLen(L) + 1)
    {
        printf("輸入的位置不合法,無法插入!");
        return;
    }
    else if (pos == listLen(L) + 1)
    {
        while (p->next != NULL)
        {
            p = p->next;
        }
        tmp->next = nullptr;
        p->next = tmp;
        return;
    }
    else
    {
        while (index < pos)
        {
            index++;
            p = p->next;
        }
        tmp->next = p->next;
        p->next = tmp;
    }
}

// 連結串列刪除
void deleteList(linkList *L, int pos)
{
    int index = 1;
    if (pos <= 0 || pos > listLen(L))
    {
        printf("輸入的位置不合法,無法刪除!\n");
        return;
    }
    else
    {
        while (index < pos)
        {
            index++;
            L = L->next;
        }
        L->next = L->next->next;
    }
}

// 列印連結串列
void print(linkList *L)
{
    if (L->next == nullptr)
    {
        printf("連結串列中無元素!");
        return;
    }
    else
    {
        linkList *tmp = new linkList;
        tmp = L->next;
        while (tmp != NULL)
        {
            printf("%d->", tmp->value);
            tmp = tmp->next;
        }
        printf("NULL\n");
    }
}

// 反轉連結串列
linkList* reverseList(linkList *L)
{
    if (L == nullptr)
        return nullptr;
    linkList *rev = new linkList;
    rev->next = nullptr;
    while (L->next != nullptr)
    {
        L = L->next;
        linkList *tmp = new linkList;
        tmp->value = L->value;
        tmp->next = rev->next;
        rev->next = tmp;
        tmp = nullptr;
    }
    return rev;
}

int main(int argc,int* argv[])
{
    linkList *L = new linkList;
    initList(L);
    L = createList();
    print(L);
    insertList(L, 4, 10);
    print(L);
    deleteList(L, 5);
    print(L);
    linkList *rev = new linkList;
    rev->next = nullptr;
    rev = reverseList(L);
    print(rev);

    while (true)
    {
        getchar();
    }
    return 0;
}

 

相關文章