徹底搞懂線性表建表和逆置操作


指針:
聲明時,A *a表示a是指向A類型的指針,A &a表示a是A類型的引用;
調用時,*a表示取a指向的內容,&a表示取a的地址。

一、建表

順序表建表

在這裏插入圖片描述

單鏈表(帶頭結點)建表

尾插法:(從尾部開始建表)

在這裏插入圖片描述

頭插法:

在這裏插入圖片描述
真題舉例:
鍵盤輸入n個英文字母,輸入格式爲n、c1、c2……、cn,其中n表示字母的個數。請編程以這些輸入數據建立一個單鏈表,並要求將字母不重複的存入鏈表;
題目解讀:
輸入一個單詞,掃描其在鏈表中是否出現,如果出現,就什麼都不做;否則,根據這個單詞構造結點插入鏈表中。
代碼實現:

void createLinkNoSameElem(LNode *&head){
    head = (LNode*)malloc(sizeof(LNode));
    head->next = NULL;
    LNode *p;
    int n;
    char ch;
    std::cin>>n;
    for(int i = 0; i< n; ++i){
        std::cin>>ch;
        p = head->next;
        while (p !=NULL) {
            if (p->data == ch)
                break;
            p =p->next;
            
        }
        if(p == NULL){
            p=(LNode*)malloc(sizeof(LNode));
            p->data =ch;
            p->next =head-next;
            head-next=p;
        }
    }
}

二、逆置

順序表逆置操作

線性表逆置操作就是把線性表順序完全顛倒,如下圖所示:

逆置前:
在這裏插入圖片描述
逆置後:
在這裏插入圖片描述
上述過程實現代碼:
在這裏插入圖片描述

鏈表逆置操作

逆置前:
在這裏插入圖片描述
逆置後:
在這裏插入圖片描述
上述過程實現代碼:
在這裏插入圖片描述
其中t->next=q->next是因爲下圖:
在這裏插入圖片描述

經典例題:

1.將一個長度爲n的數組的前端k(k<n)個元素 逆序後移動到數組後端,要求原數組中數據不丟失。
在這裏插入圖片描述
移動後變成:
在這裏插入圖片描述
實現代碼:
在這裏插入圖片描述
2.將一個長度爲n的數組的前端k(k<n)個元素 保持原序移動到數組後端,要求原數組中數據不丟失。
在這裏插入圖片描述
移動後變成:
在這裏插入圖片描述
實現代碼:
調用兩次上方的reverse函數即可。
在這裏插入圖片描述
3.在這裏插入圖片描述
先把0-p的元素逆置,然後把p-n-1的元素逆置,最後再把整個表逆置。
在這裏插入圖片描述
實現代碼:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章