找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5256|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

解析uc/os-ii操作系統(tǒng)--之創(chuàng)建一個單向鏈表

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91442 發(fā)表于 2015-10-29 15:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
文章目錄:
解析uc/os-ii操作系統(tǒng)之-寫在前面:http://www.torrancerestoration.com/bbs/dpj-39350-1.html
解析uc/os-ii操作系統(tǒng)--之創(chuàng)建一個單向鏈表:http://www.torrancerestoration.com/bbs/dpj-39833-1.html
單向鏈表之--添加結(jié)點的程序詳解:http://www.torrancerestoration.com/bbs/dpj-39834-1.html
什么是“堆”和“!保 動態(tài)內(nèi)存分配? :http://www.torrancerestoration.com/bbs/dpj-39835-1.html
C語言函數(shù)指針,函數(shù)動態(tài)回調(diào):http://www.torrancerestoration.com/bbs/dpj-39836-1.html

       操作系統(tǒng)最核心的部分就是任務(wù)或曰線程(個人認(rèn)為叫線程Thread更好),當(dāng)用戶創(chuàng)建好了各個線程并啟動系統(tǒng)之后就交給操作系統(tǒng)內(nèi)核去調(diào)度了。uc/os-ii操作系統(tǒng)的每個線程都對應(yīng)一個任務(wù)控制塊TCB,實際上TCB就是鏈表的一個結(jié)點node;將每個結(jié)點鏈接成雙向鏈表,再對結(jié)點進行插入,刪除,遍歷等操作是uc/os-ii操作系統(tǒng)源碼中最常見的部分。為此,本人非常愿意學(xué)習(xí)一下如何創(chuàng)建一個鏈表,并表示要真正的理解和學(xué)會創(chuàng)建一個簡單的單向鏈表的方法和技巧。鏈表應(yīng)該是c語言的較為復(fù)雜的部分了;沒有較好的c語言功底,感覺真的很難去理解uc/os-ii操作系統(tǒng)原理。

  創(chuàng)建一個單向鏈表的思想:
通過3個指向結(jié)點的指針變量head,p1,p2,可以創(chuàng)建一個任意長的單向鏈表(理論上如果內(nèi)存足夠大的話),鏈表的優(yōu)點就是插入,刪除,生成,遍歷操作很方便。本例程中:通過PC鍵盤給每個結(jié)點數(shù)據(jù)域變量賦值,當(dāng)鍵盤輸入“0”則退出鏈表創(chuàng)建程序。也就是說當(dāng)鍵盤每輸入一個值本例就可以生成一個結(jié)點并鏈接成一個單向鏈表,然后是遍歷每個結(jié)點。具體在源碼中有詳細(xì)注釋。

  本例程以徐彤老師C語言鏈表例程為藍(lán)本編寫,本人敲了3遍。下面的程序可以在VS2013和VC++6.0編譯平臺運行:直接復(fù)制即可。

#include "stdafx.h"
#include"stdio.h"
//#include"malloc.h"
//#define _CRT_SECURE_NO_WARNINGS
struct node
{
        int num;
        node *next;

};  //聲明一個結(jié)點
/*通過3個指針變量*head,*p1,*p2,創(chuàng)建一個若干長的單向鏈表*/
node * creat(void)
{
        node *head, *p1, *p2;//聲明3個指向結(jié)點的指針變量,注意,這里指針沒有初始化,指針指向的可能是亂碼  
        p1 = new node; //給p1賦值,p1先行開辟空間

        scanf_s("%d", &p1->num);//通過PC鍵盤給結(jié)點數(shù)據(jù)域變量賦值,因為只有p1已經(jīng)有明確的指向
        head = p2 = p1;//3個指針指向相同的node空間,能不能寫成head=p1=p2?不符合語法
  while (p1->num != 0)  //只要鍵盤輸入的不是0,就循環(huán)生成結(jié)點并鏈接成單向鏈表
  {
        p1 = new node;//通過循環(huán)不斷開辟新的結(jié)點p1,
        scanf_s("%d", &p1->num);//給新的結(jié)點p1數(shù)據(jù)域變量賦值,該句決定while循環(huán)何時結(jié)束
        p2->next = p1;//讓p2成為鏈表連接的橋梁,循環(huán)剛開始時“ head=p2=p1”所以p2指向第一個結(jié)點,有所指向!
        p2 = p1;//這兩句是本程序的核心所在,讓p2也指向新開辟出來的結(jié)點空間,此時p2和p1指向了相同的新結(jié)點!

}

        p2->next = NULL;//當(dāng)程序跳出while循環(huán)后,說明創(chuàng)建鏈表已經(jīng)結(jié)束;此時就將最后一個結(jié)點指針域指向NULL!
        return head;//返回鏈表頭指針,為什么返回頭指針?有了這個鏈表的頭指針,就可以遍歷任意一個結(jié)點

}
void display(node* head)//鏈表頭指針作為傳遞參數(shù)
{
        node *p = head;
        while (p->next != NULL)  //從鏈表頭指針開始遍歷
        {

                printf("%d\n", p->num);
                p = p->next;//這一步很關(guān)鍵!要理解!將下一個結(jié)點的指針傳遞給p,此時p就指向了下一個結(jié)點。
     //不斷的指向后續(xù)結(jié)點,此時p就指向了下一個結(jié)點
        }

}
void main()
{
        node *head = creat();//創(chuàng)建鏈表頭指針
        display(head);//打印結(jié)果

}

鑒于本文公開,可能路遇強人。特聲明:本人只是學(xué)習(xí)者和愛好者,錯誤之處有時難免歡迎指正。謝謝。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表