文章目錄:
解析uc/os-ii操作系統之-寫在前面:http://www.zg4o1577.cn/bbs/dpj-39350-1.html
解析uc/os-ii操作系統--之創建一個單向鏈表:http://www.zg4o1577.cn/bbs/dpj-39833-1.html
單向鏈表之--添加結點的程序詳解:http://www.zg4o1577.cn/bbs/dpj-39834-1.html
什么是“堆”和“棧”? 動態內存分配? :http://www.zg4o1577.cn/bbs/dpj-39835-1.html
C語言函數指針,函數動態回調:http://www.zg4o1577.cn/bbs/dpj-39836-1.html
上一個例程是創建并從頭指針開始遍歷鏈表的每一個結點;今天是在此基礎上添加或者說插入結點。能看懂本例程并能獨自敲出來,說明C語言水平已經達到一定境界了,這是一個大牛人說的。
C源碼:
#include"stdio.h"
#include"malloc.h"
struct node
{
int num;
node *next;
};
/*通過3個指針變量*head,*p1,*p2,創建一個若干長的單向鏈表*/
node* creat()
{
node *head,*p1,*p2;//聲明3個指向結點空間的指針,注意,這里沒有賦值指針指向的可能是亂碼
p1=new node; //給p1賦值,p1先行開辟空間
scanf("%d",&p1->num);//通過PC鍵盤給結點數據域變量賦值,p1用來連接結點,因為只有p1已經有明確的指向
head=p2=p1;//3個指針指向相同的node空間,能不能寫成head=p1=p2?
while(p1->num!=0)
{
p1=new node;//通過循環不斷開辟新的結點p1,
scanf("%d",&p1->num);//給新的結點p1數據域變量賦值,該句決定while循環何時結束
p2->next=p1;//讓p2成為鏈表連接的橋梁,循環剛開始時“ head=p2=p1”所以p2指向第一個結點,有所指向!
p2=p1;//這兩句是本程序的核心思想所在,讓p2也指向新開辟出來的結點空間,此時p2有了新的指向!
}
p2->next=NULL;//當程序跳出while循環后,說明創建鏈表已經結束;此時就將最后一個結點指針域指向NULL!
return head;//返回鏈表頭指針,為什么返回頭指針?有了這個鏈表的頭指針,就可以遍歷任意一個結點
}
void display(node* head)//鏈表頭指針作為傳遞參數
{
node *p=head;
while(p->next!=NULL)//
{
printf("%d\t",p->num);
p=p->next;//這一步很關鍵!要理解!將下一個結點的指針傳遞給p,此時p就指向了下一個結點。
}
if(p->num!=0)//不輸出0
printf("%d\t",p->num);
}
node * insert(node *head)//傳入的是頭結點的指針變量,以傳入的頭結點num變量大小作為插入操作的位置參考
{
node *p=head; //生成p保存head結點
node *newnode=new node;//生成一個新對象或class(類),感覺有點java的意思
printf("請輸入要插入的新結點的值:\n");
scanf("%d",&newnode->num);//給新結點數據域變量賦值
newnode->next=NULL;//給新開辟的結點指針域指針賦值NULL,相當于初始化,生成的指針都應該初始化,這樣安全!
//為下一步給它賦值做準備,相當于給新開辟的結點數據域和指針域都初始化
//判斷插入的元素是否是第一個
if(p->num>newnode->num)//這是本例程的思想,新結點變量賦值與傳入的頭結點變量做比較
{
printf("要插入的結點應該放在第一個上面!\n");
newnode->next=p;//保存后續結點;將傳入的頭指針賦值給插入的結點指針域,也就是說newnode成為頭指針
head=newnode;//更新head的值,這一步很值得思考!
}
else//如果插入的位置是其他位置的話
{
bool flag=false;//記錄是中間結點還是最后結點
p=head;
//循環查找
while(p->next->next!=NULL)//p->next->next指的是head后的第二個結點,即判斷后續第二個結點是否是尾結點
{
if(p->next->num>newnode->num)
{
printf("插入的是中間位置");
newnode->next=p->next;
p->next=newnode;
flag=true;
break;
}
p=p->next;
}
if(flag==false)//如果最后一個結點
{
p->next=newnode;
}
}
return head;
}
void main()
{
node *head=creat();//創建鏈表頭指針
display(head);//打印結果
node *head2=insert(head);
display(head2);//打印結果
}
//這個程序一定要搞懂,通過仿真現象分析代碼
|