C語言中的鏈表

參考自:http://data.biancheng.net/view/5.html

如何創建鏈表

首先創建一個結構體表示節點:

typedef struct Link{
    int  elem;
    struct Link *next;
}link;

接下來編寫初始化函數。由一維數組初始化鏈表。

link * initLink(int *num,int length){
    link * p=(link*)malloc(sizeof(link));//創建一個頭結點
    link * temp=p;//聲明一個指針指向頭結點,用於遍歷鏈表
    //生成鏈表
    for (int i=0; i<length; i++) {
        link *a=(link*)malloc(sizeof(link));
        a->elem=num[i];
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
    }
    return p;
}

在每次循環中,首先將值賦給當前節點,將當前節點的指針指向NULL,然後移動一位,到下一個節點。依次賦值,直到完成,於是最後一個節點的next域保持NULL。

插入小tip:通過傳遞數組名或數組指針參數到子函數中,以獲得數組長度是不可行的。因爲num是函數參數,到了本函數中,只是一個指針(地址,系統在本函數運行時,是不知道其所表示的地址有多大的數據存儲空間,這裏只是告訴函數一個數據存儲空間首地址)。

而在數組定義所在的代碼區中就可以使用以下方法獲取數組大小。

double num[] = {1,2,3,4};
int length;
length=sizeof(num)/sizeof(num[0]);

接下來定義遍歷所有元素輸出鏈接的函數。只要temp指針指向的結點的next不是Null,就執行輸出語句,否則跳出循環。

void display(link *p){
    link* temp=p;//將temp指針重新指向頭結點
    while (temp->next) {
        temp=temp->next;
        printf("%d -> ",temp->elem);
    }
    printf("NULL\n");
}

測試如下:

int main() {
    int a[6] = {10,5,3,2,1,6};
    link *p=initLink(a,6);
    display(p);

    return 0;
}

如何插入新節點

鏈表插入的函數,p是鏈表,elem是插入的結點的數據域,add是插入的位置。

link * insertElem(link * p,int elem,int add){
    link * temp=p;//創建臨時結點temp
    //首先找到要插入位置的上一個結點
    for (int i=1; i<add; i++) {
        if (temp==NULL) {
            printf("插入位置無效\n");
            return p;
        }
        temp=temp->next;
    }
    //創建插入結點c
    link * c=(link*)malloc(sizeof(link));
    c->elem=elem;
    //向鏈表中插入結點
    c->next=temp->next;
    temp->next=c;
    return  p;
}

如何移除節點

刪除結點的函數,p代表操作鏈表,add代表刪除節點的位置。

link * delElem(link * p,int add){
    link * temp=p;
    //遍歷到被刪除結點的上一個結點
    for (int i=1; i<add; i++) {
        temp=temp->next;
    }
    link * del=temp->next;//單獨設置一個指針指向被刪除結點,以防丟失
    temp->next=temp->next->next;//刪除某個結點的方法就是更改前一個結點的指針域
    free(del);//手動釋放該結點,防止內存泄漏
    return p;
}

查找節點元素

查找結點的函數,elem爲目標結點的數據域的值,返回找到的位置。

int selectElem(link * p,int elem){
    link * temp=p;
    int i=1;
    while (temp->next) {
        temp=temp->next;
        if (temp->elem==elem) {
            return i;
        }
        i++;
    }
    return -1;
}

測試:

int main() {
    int a[6] = {10,5,3,2,1,6};
    link *p=initLink(a,6);
    display(p);

    printf("在第4的位置插入元素5:\n");
    p=insertElem(p, 5, 4);
    display(p);

    printf("刪除第2位置的元素:\n");
    p=delElem(p, 2);
    display(p);

    printf("查找元素2的位置爲:\n");
    int address=selectElem(p, 2);
    if (address==-1) {
        printf("沒有該元素\n");
    }else{
        printf("元素2的位置爲:%d\n",address);
    }
    return 0;
}

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