標題: 解析uc/os-ii操作系統(tǒng)--之創(chuàng)建一個單向鏈表 [打印本頁]

作者: 愛51hei    時間: 2015-10-29 15:31
標題: 解析uc/os-ii操作系統(tǒng)--之創(chuàng)建一個單向鏈表
文章目錄:
解析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
單向鏈表之--添加結點的程序詳解:http://www.torrancerestoration.com/bbs/dpj-39834-1.html
什么是“堆”和“�!�? 動態(tài)內存分配? :http://www.torrancerestoration.com/bbs/dpj-39835-1.html
C語言函數指針,函數動態(tài)回調:http://www.torrancerestoration.com/bbs/dpj-39836-1.html

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

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

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

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

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

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

}

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

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

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

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

}

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







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1