C語言實現鏈表之雙向鏈表(二)結點內存申請及數據初始化

C語言實現鏈表之雙向鏈表(二)結點內存申請及數據初始化


    在上一篇文章中已經給出了整體的設計框架,現在講逐一給出每一個函數的實現,爲了一一講解,清晰一點,將分開介紹。


    本篇文章將給出MyList_Bidirection.c---實現文件的第一個函數,即對鏈表中的一個結點申請內存並對其內部的數據進行初始化的函數。程序如下,由於是第一個函數,所以會給出整個文件的前面部分。


/*
*****************************************************************************************
*                                       UART Block
*
*                                      (c) Copyright
*                                   All Rights Reserved
*
* Filename :    MyList_Bidirection.c
*
* Function :    雙向非循環鏈表的操作函數定義
*
* History  :    1. wangyi  2015-4-19  17:47  Version 1.0  creat	
*
*****************************************************************************************
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "MyList_Bidirection.h"

/*============================================================================== 
*   操作  :爲鏈表的結點分配內存,並初始化數據元素
*   操作前:pListNode爲鏈表的結點
*   操作後:返回分配內存並初始化後的結點,操作失敗返回NULL
==============================================================================*/
MyListNode* MallocMemInitNode(MyListNode* pListNode)
{
    // 爲結點分配存儲空間
    pListNode = (MyListNode*)malloc(sizeof(MyListNode));

    if(pListNode == NULL)
    {
        // 內存分配失敗
        fprintf(stderr, "The allocating memory defeat.\n");
        return NULL;
    } 
    else
    {
        // 結點數據初始化
        strcpy(pListNode->sNodeData.cName, "");
        pListNode->sNodeData.iAge = 0;
        pListNode->pNextNodeAddr  = NULL; 
        pListNode->pPrevNodeAddr  = NULL;
    }
    return pListNode; 
}

     該程序給出了實現文件的所有頭信息,大家可以清晰可見,此處不再贅述。下面只對該函數進行簡單解釋。

    該函數爲傳入的結點申請內存,在內存申請成功以後對其內部的數據進行初始化,然後返回申請內存後的結點。這裏一定要注意,傳入的一級指針雖然分配了內存,但是不能直接傳出函數,因爲其是值傳遞,所以必須採用return的方法將申請內存後的指針返回,外部才能使用,至於具體的原因,在我的博客文章《C語言中“指針”作爲“函數參數”時的注意事項》中有十分詳細的解釋,大家可以看一下那篇文章,鏈接是:點擊打開鏈接


    這個函數對於一些庫並不是很推薦使用,因爲考慮到哪裏分配哪裏釋放的緣故,在此函數內部申請的內存沒有在內部釋放,所以在頂層一定要對其內存進行釋放,否則會帶來內存泄露的惡果,在後面的測試用例中會有介紹。總之,這個函數大家可以考慮不使用,直接在頂層分配內存、初始化、釋放內存即可。


    最後,注意雙向鏈表是有一個前向指針需要處理的。

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