在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > C語言的那些小秘密之鏈表(二)

            C語言的那些小秘密之鏈表(二)

            作者: 時(shí)間:2015-04-11 來源:網(wǎng)絡(luò) 收藏

              從main()函數(shù)開始,通過 DList* dlist = dlist_head_create();我們創(chuàng)建了一個(gè)頭節(jié)點(diǎn)。值得注意的是,為了更加通用和符合實(shí)際需求,我們在此創(chuàng)建的存放的是結(jié)構(gòu),因?yàn)楝F(xiàn)實(shí)中在使用時(shí),絕大部分都是存放結(jié)構(gòu)的,而前一篇文章中我們創(chuàng)建單鏈表時(shí)我們存放的是數(shù)據(jù),所以這一點(diǎn)讀者是要引起注意的,接下來是一個(gè)for循環(huán)語句,在for循環(huán)語句中我們首先使用DStu* stu =(DStu*) malloc(sizeof(DStu));為stu分配了空間,這也是很多讀者的一個(gè)易錯(cuò)點(diǎn),不分配就使用下面的stu->score = i;語句,從而導(dǎo)致出錯(cuò),如果讀者對于指針還不是很了解的話可以看看我前面的文章《的那些小秘密之指針》,在往下看dlist_append(dlist, (void*)stu);語句,從函數(shù)名稱我們也可以看出它的功能是在鏈表的末端添加結(jié)點(diǎn)的,在函數(shù)里面我們使用了一個(gè)if判斷語句來看分配的結(jié)點(diǎn)是否成功,如果成功繼續(xù)往下執(zhí)行,如果失敗則返回DLIST_RETURN_FAIL。對于第一次分配的節(jié)點(diǎn)我們使用了 thiz->head = node;語句使其變?yōu)轭^結(jié)點(diǎn),在第二次調(diào)用dlist_append(dlist, (void*)stu)函數(shù)分配結(jié)點(diǎn)之后,由于頭結(jié)點(diǎn)已經(jīng)不再為空,那么跳過if(thiz->head == NULL)語句,執(zhí)行以下語句:

            本文引用地址:http://www.biyoush.com/article/272382.htm

              cursor = thiz->head;

              while(cursor != NULL && cursor->next != NULL)

              { cursor = cursor->next; }

              其功能為查找末端結(jié)點(diǎn),然后使用 cursor->next = node; node->prev = cursor;語句來將剛剛創(chuàng)建的新結(jié)點(diǎn)node作為尾結(jié)點(diǎn)。main()函數(shù)中的for循環(huán)語句執(zhí)行完之后就輪到了調(diào)用dlist_print(dlist, print_int)函數(shù)打印我們創(chuàng)建的雙向鏈表保存的數(shù)據(jù)值了,在這里的時(shí)候我們用了前面我博客中提到的函數(shù)指針作為參數(shù)的使用,如果有對函數(shù)指針不熟悉的讀者可以參考我之前寫的一篇博客《的那些小秘密之函數(shù)指針》,到此讀者應(yīng)該都理解了上面的代碼,但是其中有個(gè)值得注意的地方,那就是main()函數(shù)中使用dlist_append(dlist, (void*)stu);的時(shí)候,我們傳遞的是一個(gè)無類型的指針,在創(chuàng)建新結(jié)點(diǎn)的時(shí)候,我們使用了一句node->data =(DStu*)data;進(jìn)行一個(gè)強(qiáng)制轉(zhuǎn)換,使得鏈表中的數(shù)據(jù)域指向的就是我們使用DStu* stu =(DStu*) malloc(sizeof(DStu));所創(chuàng)建的空間。創(chuàng)建了空間之后當(dāng)然要釋放掉,所以接下來我們就添加一個(gè)釋放功能模塊。新添加的代碼我們用紅色部分來標(biāo)記。以便于讀者的閱讀

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

            typedef enum _DListReturn
            {
            DLIST_RETURN_OK,
            DLIST_RETURN_FAIL
            }DListReturn;

            typedef struct _DStu
            {
            int score;
            }DStu;

            typedef struct _DListNode
            {
            struct _DListNode* prev;
            struct _DListNode* next;

            DStu* data;

            }DListNode;

            typedef struct _DList
            {
            DListNode* head;
            }DList;

            typedef DListReturn (*DListPrintFunction)(void* data);

            DListNode* dlist_node_create(void* data)
            {
            DListNode* node;
            if((node = (DListNode*) malloc(sizeof(DListNode)))==NULL)
            {
            printf("分配空間失敗!");
            exit(0);
            }

            if(node != NULL)
            {
            node->prev = NULL;
            node->next = NULL;
            node->data =(DStu*)data;
            }

            return node;
            }

            DList* dlist_head_create(void)
            {
            DList* thiz;
            if((thiz = (DList*)malloc(sizeof(DList)))==NULL)
            {
            printf("分配空間失敗!");
            exit(0);
            }

            if(thiz != NULL)
            {
            thiz->head = NULL;
            }

            return thiz;
            }

            DListReturn dlist_append(DList* thiz, void* data)
            {
            DListNode* node = NULL;
            DListNode* cursor = NULL;

            if((node = dlist_node_create(data)) == NULL)
            {
            return DLIST_RETURN_FAIL;
            }

            if(thiz->head == NULL)
            {
            thiz->head = node;

            return DLIST_RETURN_OK;
            }

            cursor = thiz->head;
            while(cursor != NULL && cursor->next != NULL)
            {
            cursor = cursor->next;
            }

            cursor->next = node;
            node->prev = cursor;

            return DLIST_RETURN_OK;
            }

            DListReturn dlist_prepend(DList* thiz, void* data)
            {
            DListNode* node = NULL;
            DListNode* cursor = NULL;

            if((node = dlist_node_create(data)) == NULL)
            {
            return DLIST_RETURN_FAIL;
            }

            if(thiz->head == NULL)
            {
            thiz->head = node;

            return DLIST_RETURN_OK;
            }

            cursor = thiz->head;

            if(thiz->head == cursor)
            thiz->head = node;

            node->next = cursor;
            cursor->prev = node;

            return DLIST_RETURN_OK;
            }

            DListReturn dlist_print(DList* thiz, DListPrintFunction print)
            {
            DListNode* iter = thiz->head;

            while(iter != NULL)
            {
            print(iter->data);
            iter = iter->next;
            }
            printf("n");
            return DLIST_RETURN_OK;
            }

            DListReturn print_int(void* data)
            {
            DStu* ss=(DStu*)data;
            printf("%dt ", ss->score);

            return DLIST_RETURN_OK;
            }

            DListReturn dlist_node_destroy(DListNode* node)
            {
            if(node != NULL)
            {
            node->next = NULL;
            node->prev = NULL;
            free(node);
            }

            return DLIST_RETURN_OK;
            }

            DListReturn dlist_destroy(DList* thiz)
            {
            DListNode* iter = thiz->head;
            DListNode* next = NULL;

            while(iter != NULL)
            {
            next = iter->next;
            dlist_node_destroy(iter);
            iter = next;
            }

            thiz->head = NULL;
            free(thiz);

            return DLIST_RETURN_OK;
            }

            int main(int argc, char* argv[])
            {
            int i = 0;
            int n = 10;

            DList* dlist = dlist_head_create();
            DStu* stu[7];

            for(i = 0; i < 7; i++)
            {
            stu[i] =(DStu*) malloc(sizeof(DStu));
            stu[i]->score = i;
            dlist_append(dlist, (void*)stu[i]);
            }

            dlist_print(dlist, print_int);

            for(i = 0; i < 7; i++)
            {
            free(stu[i]);
            }
            return 0;
            }

              在使用dlist_append(dlist, (void*)stu[i]);語句的時(shí)候我們傳遞的是stu[i]的指針,所以在創(chuàng)建結(jié)點(diǎn)的時(shí)候我們使用的node->data =(DStu*)data;語句使得data強(qiáng)制轉(zhuǎn)換為了DStu結(jié)構(gòu)類型指針,即在結(jié)點(diǎn)創(chuàng)建函數(shù)中我們僅僅是使數(shù)據(jù)域的結(jié)構(gòu)指針data指向了stu[i]所分配的存儲(chǔ)空間,和stu[i]指向的是同一個(gè)空間,但是在釋放結(jié)點(diǎn)時(shí),我們僅僅是釋放掉了存放data指針變量的空間,并沒有釋放掉data所指向的空間,所以我們在main函數(shù)中我們最后使用了一個(gè)for循環(huán)語句來釋放data所指向的存儲(chǔ)空間。在此也講講之前我給出的以下代碼和我們雙鏈表釋放方式的區(qū)別。

              #include

              #include

              int main()

              {

              int *pointer_1=(int *)malloc(sizeof(int));

              int *pointer_2=(int *)malloc(sizeof(int));

              pointer_1=pointer_2;

              printf("%dn",pointer_1);

              printf("%dn",pointer_2);

              printf("%dn",&pointer_1);

              printf("%dn",&pointer_2);

              //free(pointer_1);

              free(pointer_2);

              return 0;

              }

              運(yùn)行結(jié)果為:

              

             

              3674136

              3674136

              1245052

              1245048

              Press any key to continue



            關(guān)鍵詞: C語言 鏈表

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉