線性表-LinkList(單鏈表)


知識點
1:順序存儲結構需要預分配存儲空間。單鏈表不需要分配存儲空間,元素限制不受控制
2:選擇順序存儲結構-線性表需要頻繁查找,很少進行插入和刪除操作。使用單鏈表結構-元素個數變化較大或者根本不知道有多大時
3:鏈表改不改變,應該准確理解為鏈表頭指針地址是否改變。
增、刪、改的是非頭結點時,加不加&符號,原鏈表都會相應改變;但一旦頭指針改變,沒加&符號的函數會導致程序出錯;
所以一般寫增加、刪除、插入節點的函數時,為了保證涉及到頭指針的修改不出錯(尤其是不帶頭結點的鏈表),都需要加上&。
鏈表的第一個結點明確知道是不會改變的,故頭指針地址不會改變,所以不用加&。
4:
1)傳值方式傳參
①傳地址:
在函數中如果傳遞的是指針,那么只能修改指針指向的內容,不能修改指針本身;如果想要修改指針本身,要么在再加一級指針,要么用引用&。
②引用傳參:
引用傳參往往要比值傳參高效,因為它是直接將x作為參數傳入進去,而少了對x進行復制這部分的開銷,既然傳入進去的是x,那么對x的修改肯定也生效
2)引用方式傳參引用可以被理解為變量的一個別名,但這依舊是原變量,如果在函數內對該變量進行修改的話,在外部該變量也會相應被修改。
總結
在傳值方式傳參時,對於基本類型:函數參數為int x,調用函數傳入x;對於指針:函數參數為LNode *,調用函數時傳入L
在地址傳遞時,對於基本類型:函數參數為int *x,調用函數傳入&x;對於指針:函數參數為LNode **,調用函數時傳入&L。
在引用方式傳參,對於基本類型:函數參數為int &x,調用函數傳入x;對於指針:函數參數為LNode* &L(或LinkList &L ),調用函數時傳入&L。
typedef struct Link
{
    int elem;
    struct Link *next;//指針域
}LinkNode,*LinkList;
//以下新建節點等價
//LinkNode *tnode1 = (linkNode *)malloc(sizeof(linkNode));
//LinkList tnode = (LinkList)malloc(sizeof(linkNode));

創建頭結點

LinkList createLinkListHead() {
    LinkList head = (LinkList) malloc(sizeof(LinkNode));
    head->next = NULL;
    return head;
}

帶頭結點的頭插法

void insertHeadLinkList(LinkList head, int value) {
    LinkList node = (LinkList) malloc(sizeof(LinkNode));
    node->elem = value;
    node->next = head->next;
    head->next = node;
}

尾插法

void insertLastLinkList(LinkList head, int value) {
    LinkList temp = head;
    while (temp->next != NULL) //找到末尾結點
        temp = temp->next;
    LinkList node = (LinkList) malloc(sizeof(LinkNode));
    node->elem = value;
    temp->next = node;
    node->next = NULL;
}

插入指定位置

void insertPositionLinkList(LinkList head, int position, int value) {
    if (position < 0) //-1 從末尾添加,采用尾插法
        insertLastLinkList(head,value);
    else if (position == 0) //從第一個結點插入,采用頭插法
        insertHeadLinkList(head,value);
    else { //
        LinkList temp = head->next;
        while (temp != NULL && --position > 0) { //找到合適的位置結點
            temp = temp->next;
        }
        LinkList node = (LinkList) malloc(sizeof(LinkNode));
        node->elem = value;
        node->next = temp->next;
        temp->next = node;
    }
}

 

刪除指定位置節點

void deletePositionLinkList(LinkList head, int position) {
    if (position < 0) {
        printf("指定下標值不正確\n");
        return;
    }
    LinkList node = head;
    int i = 0;
    while (!node->next || i < position) { //尋找指定下標的節點,結束循環時,i==position
        node = node->next;
        i++;
    }
    if (i == position) { //找到指定節點
        LinkList temp = node->next; //temp 是要被刪除的節點
        node->next = temp->next;
        temp->next = NULL;
        printf("該位置值為%d\n",temp->elem);
        free(temp);
    } else { //沒找到
        printf("沒找到指定下標的值");
    }
}

刪除指定數據節點

void deleteValueLinkList(LinkList head, int value) {
    LinkList node = head;
    while (!node->next) {
        if (node->next->elem == value)break;//找到前節點
        node = node->next;
    }
    if (node->next != NULL) { //找到要刪除的節點
        LinkList temp = node->next; //temp 是要被刪除的節點
        node->next = temp->next;
        temp->next = NULL;
        free(temp);
    } else {
        printf("沒找到要刪除的節點\n");
    }
}

銷毀鏈表

void destoryLinkList(LinkList head) {
    while (head->next != NULL) {
        LinkList node = head->next;
        head->next = node->next;
        free(node);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM