C語言描述鏈表的實現及操作


 

一.鏈表的創建操作

//    操作系統 win 8.1
//    編譯環境 Visual Stuido 2017

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef int ElementType;        //    定義數據類型,可根據需要進行其他類型定義
                                //    鏈表節點的定義
typedef struct ListNode {
    ElementType  Element;        //    數據域,存放數據
    ListNode* Next;        //    指向下一個鏈表節點
}Node, *PNode;

//    鏈表創建函數定義
PNode CreateList(void) {
    int len ;    //    用於定義鏈表長度
    int val ;    //    用於存放節點數值
    PNode PHead = (PNode)malloc(sizeof(Node));    //    創建分配一個頭節點內存空間
//頭節點相當於鏈表的哨兵,不存放數據,指向首節點(第一個節點)
if (PHead == NULL) // 判斷是否分配成功 { printf("空間分配失敗 \n"); exit(-1); } PNode PTail = PHead; // 鏈表的末尾節點,初始指向頭節點 PTail->Next = NULL; // 最后一個節點指針置為空 printf("請輸入節點個數:"); scanf_s("%d", &len); // 輸入節點個數 for (int i = 0; i < len; i++) { PNode pNew = (PNode)malloc(sizeof(Node)); // 分配一個新節點 if (pNew == NULL) { printf("分配新節點失敗\n"); exit(-1); } printf("請輸入第 %d 個節點的數據:", i + 1); scanf_s("%d", &val); // 輸入鏈表節點的數據 pNew->Element = val; // 把數據賦值給節點數據域 PTail->Next = pNew; // 末尾節點指針指向下一個新節點 pNew->Next = NULL; // 新節點指針指向為空 PTail = pNew; // 將新節點復制給末尾節點 } printf("創建鏈表成功\n"); return PHead; // 返回頭節點 } // 主函數 int main() { PNode List = CreateList(); //創建一個指針,使其指向新創建的鏈表的頭指針 return 0; }

運行結果

 

二.鏈表的遍歷操作

//    定義鏈表遍歷函數
void TraverseList(PNode List) {
    PNode P = List->Next;    //    首節點賦值給臨時節點P
    printf("遍歷鏈表的值為:");
    if (P == NULL)
        printf("鏈表為空");
    while (P != NULL)        //當臨時節點P不為尾節點時,輸出當前節點值 
    {
        printf("%d ", P->Element);
        P = P->Next;
    }
    printf("\n");
}

 

三.鏈表的查詢操作 

//    定義鏈表查詢函數
PNode FindList(PNode List) {
    PNode P = List->Next;    //    定義臨時指針P指向首節點的地址
    int num = 0;    //    用於記錄鏈表節點位置
    int val = 0;    //    用於存放要查詢的值
    printf("請輸入要查詢的數:");
    scanf_s("%d", &val);    //    輸入要查詢的數值
    while (P != NULL&&P->Element != val) {
        P = P->Next;
        ++num;
    }
    if (P != NULL)
        printf("找到的節點為:%d", num + 1);
    else
        printf("找不到該節點");
    printf("\n");
    return P;
}

 

四.鏈表的插入操作

//     定義鏈表插入函數
//    在鏈表位置第pos節點前插入包含數據val的節點
void InsertList(PNode List, int pos, int val) {
    int position = 0;
    PNode P = List;    //    定義節點p指向頭節點
                    //    尋找pos節點的前驅結點
    while (P != NULL&&position<pos - 1)
    {
        P = P->Next;
        ++position;
    }
    PNode Tmp = (PNode)malloc(sizeof(Node));    //    分配一個臨時節點用來存儲要插入的數據
    if (Tmp == NULL)
    {
        printf("內存分配失敗!");
        exit(-1);
    }
    //    插入節點
    Tmp->Element = val;
    Tmp->Next = P->Next;
    P->Next = Tmp;
}

 

五.鏈表的刪除操作

刪除整個鏈表操作

//定義刪除整個鏈表函數
void DeleteTheList(PNode List) {
    PNode P, Tmp;
    P = List->Next;    //定義指針P指向鏈表要刪除的鏈表List的第一個點節點
    List->Next = NULL;
    while (P != NULL) {
        Tmp = P->Next;        //臨時Tmp指向要刪除的節點的下個節點
        free(P);    //釋放指針P指向的節點
        P = Tmp;    //重新賦值
    }
    printf("刪除鏈表成功!\n");
}

 

刪除鏈表中的元素

//   定義刪除鏈表元素函數
//    刪除鏈表中的第pos節點
void DeleteList(PNode List, int pos) {
    int position = 0;
    PNode P = List;    //    定義一個指針p指向鏈表頭節點
                    //    尋找pos節點位置的前驅節點
    while (P != NULL&&position < pos - 1) {
        P = P->Next;
        ++position;
    }

    //    刪除節點
    PNode Tmp = P->Next;    //    定義臨時指針Tmp指向要刪除的節點
    P->Next = Tmp->Next;    //    使要刪除節點的前驅結點指向其后驅節點
    free(Tmp);    //    釋放刪除節點的內存空間,防止內存泄漏
    Tmp = NULL;    //    使q指向空指針,防止產生野指針
}

六.完整代碼實現

//    操作系統 win 8.1
//    編譯環境 Visual Stuido 2017

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef int ElementType;        //    定義數據類型,可根據需要進行其他類型定義
                                //    鏈表節點的定義
typedef struct ListNode {
    ElementType  Element;        //    數據域,存放數據
    ListNode* Next;        //    指向下一個鏈表節點
}Node, *PNode;

//    函數聲明
PNode CreateList(void);    //    聲明創建鏈表函數
void TraverseList(PNode List);    //    聲明遍歷鏈表函數
void InsertList(PNode List, int pos, int val);        //    聲明鏈表插入函數
void DeleteTheList(PNode List);    //    聲明刪除整個鏈表函數
void DeleteList(PNode List, int pos);    //    聲明刪除鏈表元素函數
PNode FindList(PNode List);    //    聲明鏈表查詢函數

//    主函數 
int main() {
    PNode List = CreateList();    //    創建一個指針,使其指向新創建的鏈表的頭指針    
    TraverseList(List);        //    遍歷鏈表
    FindList(List);        //    鏈表查詢    
    InsertList(List, 3, 100);    //    鏈表插入,在第三個位置插入數值100
    TraverseList(List);
    DeleteList(List, 3);    //    刪除鏈表第三個節點
    TraverseList(List);
    DeleteTheList(List);    //    刪除整個鏈表
    TraverseList(List);
    return 0;
}

//    創建鏈表函數定義
PNode CreateList(void) {
    int len ;    //    用於定義鏈表長度
    int val ;    //    用於存放節點數值
    PNode PHead = (PNode)malloc(sizeof(Node));    //    創建分配一個頭節點內存空間
    if (PHead == NULL)    //    判斷是否分配成功
    {
        printf("空間分配失敗 \n");
        exit(-1);
    }

    PNode PTail = PHead;    //    鏈表的末尾節點,初始指向頭節點
    PTail->Next = NULL;    //    最后一個節點指針置為空
    printf("請輸入節點個數:");
    scanf_s("%d", &len);        //    輸入節點個數
    for (int i = 0; i < len; i++) {

        PNode PNew = (PNode)malloc(sizeof(Node));    //    分配一個新節點
        if (PNew == NULL) {
            printf("分配新節點失敗\n");
            exit(-1);
        }
        printf("請輸入第 %d 個節點的數據:", i + 1);
        scanf_s("%d", &val);    //    輸入鏈表節點的數據

        PNew->Element = val;    //    把數據賦值給節點數據域
        PTail->Next = PNew;    //    末尾節點指針指向下一個新節點
        PNew->Next = NULL;        //    新節點指針指向為空
        PTail = PNew;    //    將新節點復制給末尾節點        
    }
    printf("創建鏈表成功\n");
    return PHead;    //    返回頭節點
}

//    定義鏈表遍歷函數
void TraverseList(PNode List) {
    PNode P = List->Next;    //    首節點賦值給臨時節點P
    printf("遍歷鏈表的值為:");
    if (P == NULL)
        printf("鏈表為空");
    while (P != NULL)        //當臨時節點P不為尾節點時,輸出當前節點值 
    {
        printf("%d ", P->Element);
        P = P->Next;
    }
    printf("\n");
}

//    定義鏈表查詢函數
PNode FindList(PNode List) {
    PNode P = List->Next;    //    定義臨時指針P指向首節點的地址
    int num = 0;    //    用於記錄鏈表節點位置
    int val = 0;    //    用於存放要查詢的值
    printf("請輸入要查詢的數:");
    scanf_s("%d", &val);    //    輸入要查詢的數值
    while (P != NULL&&P->Element != val) {
        P = P->Next;
        ++num;
    }
    if (P != NULL)
        printf("找到的節點為:%d", num + 1);
    else
        printf("找不到該節點");
    printf("\n");
    return P;
}
//     定義鏈表插入函數
//    在鏈表位置第pos節點前插入包含數據val的節點
void InsertList(PNode List, int pos, int val) {
    int position = 0;
    PNode P = List;    //    定義節點p指向頭節點
                    //    尋找pos節點的前驅結點
    while (P != NULL&&position<pos - 1)
    {
        P = P->Next;
        ++position;
    }
    PNode Tmp = (PNode)malloc(sizeof(Node));    //    分配一個臨時節點用來存儲要插入的數據
    if (Tmp == NULL)
    {
        printf("內存分配失敗!");
        exit(-1);
    }
    //    插入節點
    Tmp->Element = val;
    Tmp->Next = P->Next;
    P->Next = Tmp;
}

//定義刪除整個鏈表函數
void DeleteTheList(PNode List) {
    PNode P, Tmp;
    P = List->Next;    //定義指針P指向鏈表要刪除的鏈表List的第一個點節點
    List->Next = NULL;
    while (P != NULL) {
        Tmp = P->Next;        //臨時Tmp指向要刪除的節點的下個節點
        free(P);    //釋放指針P指向的節點
        P = Tmp;    //重新賦值
    }
    printf("刪除鏈表成功!\n");
}
//    定義刪除鏈表元素函數
//    刪除鏈表中的第pos節點
void DeleteList(PNode List, int pos) {
    int position = 0;
    PNode P = List;    //    定義一個指針p指向鏈表頭節點
                    //    尋找pos節點位置的前驅節點
    while (P != NULL&&position < pos - 1) {
        P = P->Next;
        ++position;
    }

    //    刪除節點
    PNode Tmp = P->Next;    //    定義臨時指針Tmp指向要刪除的節點
    P->Next = Tmp->Next;    //    使要刪除節點的前驅結點指向其后驅節點
    free(Tmp);    //    釋放刪除節點的內存空間,防止內存泄漏
    Tmp = NULL;    //    使q指向空指針,防止產生野指針
}

運行結果

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com