【數據結構】C語言實現鏈表節點的插入和刪除


今天又學了下鏈表,發上來和菜鳥一起學習,歡迎大神指點···········

今天我實現的是插入鏈表節點和刪除鏈表節點。

看代碼吧,注釋寫的不好的就見諒吧················· 

 

/*
            鏈表節點的插入與刪除

       編譯環境:VC++ 6.0
       編譯系統:windows XP SP3
*/

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

//     定義鏈表中的節點
typedef  struct node
{
     int member;                 //     節點中的成員
     struct node *pNext;         //     指向下一個節點的指針
}Node,*pNode;

//     函數聲明
pNode CreateList();                  //   創建鏈表函數
void TraverseList(pNode );             //   遍歷鏈表函數
bool Insert_Node(pNode , int , int);     //     鏈表節點插入函數,第一個參數是頭節點,第二個參數是要在第幾個節點前插入,第三個參數是要插入的數據
int Del_Node(pNode, int );         //     刪除鏈表節點,第一個參數是頭節點,第二個參數是刪除第幾個節點,第三個作為
int main()
{
    pNode pHead = NULL;                 //   定義初始化頭節點,等價於 struct Node *pHead == NULL
     int data;                         //  作為Insert_Node函數的第三個參數
     int num;                         //     作為Inset_Node函數第二個參數
     int choose;    
     int return_val;
    pHead = CreateList();             //   創建一個非循環單鏈表,並將該鏈表的頭結點的地址付給pHead
    printf( " 你輸入的數據是: ");
    TraverseList(pHead);     //   調用遍歷鏈表函數
    printf( " 是否還要進行如下操作:\n ");
    printf( " 1.插入數據      2.刪除數據\n ");
    printf( " 請輸入: ");
    scanf( " %d ",&choose);
     switch (choose)
    {
         case  1:
            {
                printf( " 請輸入要在第幾個節點前插入數據: ");
                scanf( " %d ",&num);
                printf( " 請輸入要插入的數據: ");
                scanf( " %d ",&data);
                 if(Insert_Node(pHead,num,data) ==  true)
                {
                    printf( " 插入成功\n插入后的數據是:\n ");
                    TraverseList(pHead);
                }
                 else
                {
                    printf( " 插入失敗\n ");
                }
                printf( " 操作完成后的數據是: ");
                TraverseList(pHead);
                 break;
            }
         case  2:
            {
                printf( " 請輸入要刪除第幾個節點的數據: ");
                scanf( " %d ",&num);
                return_val = Del_Node(pHead,num);
                 if (return_val ==  0)
                {
                    printf( " 刪除失敗。\n ");
                }
                 else
                {
                    printf( " 刪除成功。刪除的元素是:%d\n ",return_val);
                }
                printf( " 操作完成后的數據是: ");
                TraverseList(pHead);
            }
    }
     return  0;
}

//     創建鏈表函數
pNode CreateList()
{
     int i;                                             //     用於下面循環
     int len;                                         //     用來存放有效節點的字數
     int val;                                         //     用於臨時存放用戶輸入的數據
    pNode pHead = (pNode)malloc( sizeof(Node));         //   分配一個不存放有效數據的頭結點
    pNode pTail = pHead;                             //     鏈表的最后一個節點
    pTail->pNext = NULL;                             //     最后一個節點的指針置為空
    printf( " 請輸入節點個數: ");
    scanf( " %d ",&len);
     for(i =  0; i < len; i++)
    {
        printf( " 第 %d 個節點的數值: ",i+ 1);
        scanf( " %d ",&val);
        pNode pNew = (pNode)malloc( sizeof(Node));     //     為節點分配空間
        pNew->member = val;                             // 將用戶輸入的數據賦給節點的成員
        pTail->pNext = pNew;                         // 將最后一個節點的指針指向下一個新的節點
        pNew->pNext = NULL;                             // 將新節點中的指針置為空
        pTail = pNew;                                 // 將新節點賦給最后的一個節點
    }
     return pHead;                                     // 返回頭節點

}

//     遍歷鏈表函數
void TraverseList(pNode pHead)
{
    pNode p = pHead->pNext;                             // 將頭節點的指針給予臨時節點p
     while(NULL != p)                                 // 節點p不為空,循環    
    {
        printf( " %d  ",p->member);                    
        p = p->pNext;                                
    }
    printf( " \n ");
     return ;
}

//     鏈表節點插入函數
//     第一個參數是頭節點,第二個參數是要在第幾個節點前插入,第三個參數是要插入的數據
bool Insert_Node(pNode pHead,  int front, int data)
{
     int i =  0;
    pNode _node = pHead;
    pNode pSwap;                                 //     用於交換
     if ((front <  1) && (NULL != _node))         // 判斷用戶輸入的數據是否大於等於1,及_node是否為空
    {
         return  false;
    }
     while (i < front -  1)                     // 通過循環使指針指向要插入哪個節點前的節點。說的自己都不懂了,還是看下面的圖吧。    
    {
        _node = _node->pNext;
        ++i;
    }
    pNode pNew = (pNode)malloc( sizeof(Node));

    pNew->member = data;                         //     把輸入的數據賦給要插入的節點
    pSwap = _node->pNext;                         //     把下一個節點的地址,給用於交換的pSwap
    _node->pNext = pNew;                         //     把要插入的節點的地址,給上個節點的指針域
    pNew->pNext = pSwap;                         //     把插入節點的下一個節點的地址,給插入節點的指針域
     return  true;

}

//     刪除鏈表節點函數
//     第一個參數是頭節點,第二個參數是要刪除第幾個節點·······和上面的插入函數是不是很像
int Del_Node(pNode pHead, int back)
{
     int i =  0;
     int data;
    pNode _node = pHead;
    pNode pSwap;
     if ((back <  1) && (NULL == _node->pNext))
    {
        printf( " 刪除失敗!\n ");
         return  0;
    }
     while(i < back- 1)
    {
        _node = _node->pNext;
        ++i;
    }
    pSwap = _node->pNext;
    data = pSwap->member;
    _node->pNext = _node->pNext->pNext;
    free(pSwap);
     return data;


我自己也畫了兩張圖片,幫助理解,反正我是這么理解的,有錯的歡迎指出

先看下向鏈表中插入節點

 

 

下面這個是刪除鏈表節點

 

歡迎各路神仙指正批評·············· 


免責聲明!

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



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