|
文章目錄:
解析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í)者和愛好者,錯誤之處有時難免歡迎指正。謝謝。
|
|