久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4482|回復(fù): 0
收起左側(cè)

單向鏈表之--添加結(jié)點(diǎn)的程序詳解

[復(fù)制鏈接]
ID:91442 發(fā)表于 2015-10-29 15:32 | 顯示全部樓層 |閱讀模式
文章目錄:
解析uc/os-ii操作系統(tǒng)之-寫在前面:http://m.zg4o1577.cn/bbs/dpj-39350-1.html
解析uc/os-ii操作系統(tǒng)--之創(chuàng)建一個(gè)單向鏈表:http://m.zg4o1577.cn/bbs/dpj-39833-1.html
單向鏈表之--添加結(jié)點(diǎn)的程序詳解:http://m.zg4o1577.cn/bbs/dpj-39834-1.html
什么是“堆”和“!保 動(dòng)態(tài)內(nèi)存分配? :http://m.zg4o1577.cn/bbs/dpj-39835-1.html
C語言函數(shù)指針,函數(shù)動(dòng)態(tài)回調(diào):http://m.zg4o1577.cn/bbs/dpj-39836-1.html

    上一個(gè)例程是創(chuàng)建并從頭指針開始遍歷鏈表的每一個(gè)結(jié)點(diǎn);今天是在此基礎(chǔ)上添加或者說插入結(jié)點(diǎn)。能看懂本例程并能獨(dú)自敲出來,說明C語言水平已經(jīng)達(dá)到一定境界了,這是一個(gè)大牛人說的。

    C源碼:

#include"stdio.h"
#include"malloc.h"

struct node
{
   int num;
   node *next;

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

  scanf("%d",&p1->num);//通過PC鍵盤給結(jié)點(diǎn)數(shù)據(jù)域變量賦值,p1用來連接結(jié)點(diǎn),因?yàn)橹挥衟1已經(jīng)有明確的指向
  head=p2=p1;//3個(gè)指針指向相同的node空間,能不能寫成head=p1=p2?
  while(p1->num!=0)
  {
    p1=new node;//通過循環(huán)不斷開辟新的結(jié)點(diǎn)p1,
    scanf("%d",&p1->num);//給新的結(jié)點(diǎn)p1數(shù)據(jù)域變量賦值,該句決定while循環(huán)何時(shí)結(jié)束
    p2->next=p1;//讓p2成為鏈表連接的橋梁,循環(huán)剛開始時(shí)“ head=p2=p1”所以p2指向第一個(gè)結(jié)點(diǎn),有所指向!
    p2=p1;//這兩句是本程序的核心思想所在,讓p2也指向新開辟出來的結(jié)點(diǎn)空間,此時(shí)p2有了新的指向!

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

}
void display(node* head)//鏈表頭指針作為傳遞參數(shù)
{
   node *p=head;
   while(p->next!=NULL)//
   {
     printf("%d\t",p->num);
p=p->next;//這一步很關(guān)鍵!要理解!將下一個(gè)結(jié)點(diǎn)的指針傳遞給p,此時(shí)p就指向了下一個(gè)結(jié)點(diǎn)。

   }
   if(p->num!=0)//不輸出0
   printf("%d\t",p->num);
}

node * insert(node *head)//傳入的是頭結(jié)點(diǎn)的指針變量,以傳入的頭結(jié)點(diǎn)num變量大小作為插入操作的位置參考
{
   node *p=head;  //生成p保存head結(jié)點(diǎn)
   node *newnode=new node;//生成一個(gè)新對(duì)象或class(類),感覺有點(diǎn)java的意思
   printf("請(qǐng)輸入要插入的新結(jié)點(diǎn)的值:\n");
   scanf("%d",&newnode->num);//給新結(jié)點(diǎn)數(shù)據(jù)域變量賦值
   newnode->next=NULL;//給新開辟的結(jié)點(diǎn)指針域指針賦值NULL,相當(dāng)于初始化,生成的指針都應(yīng)該初始化,這樣安全!
      //為下一步給它賦值做準(zhǔn)備,相當(dāng)于給新開辟的結(jié)點(diǎn)數(shù)據(jù)域和指針域都初始化
     //判斷插入的元素是否是第一個(gè)
   if(p->num>newnode->num)//這是本例程的思想,新結(jié)點(diǎn)變量賦值與傳入的頭結(jié)點(diǎn)變量做比較
   {
    printf("要插入的結(jié)點(diǎn)應(yīng)該放在第一個(gè)上面!\n");
    newnode->next=p;//保存后續(xù)結(jié)點(diǎn);將傳入的頭指針賦值給插入的結(jié)點(diǎn)指針域,也就是說newnode成為頭指針
    head=newnode;//更新head的值,這一步很值得思考!

   }
   else//如果插入的位置是其他位置的話
   {
bool flag=false;//記錄是中間結(jié)點(diǎn)還是最后結(jié)點(diǎn)
      p=head;
//循環(huán)查找
while(p->next->next!=NULL)//p->next->next指的是head后的第二個(gè)結(jié)點(diǎn),即判斷后續(xù)第二個(gè)結(jié)點(diǎn)是否是尾結(jié)點(diǎn)
{
if(p->next->num>newnode->num)
{
printf("插入的是中間位置");
newnode->next=p->next;
    p->next=newnode;
         flag=true;
         break;

}
       p=p->next;
}
if(flag==false)//如果最后一個(gè)結(jié)點(diǎn)
{
        p->next=newnode;

}
  }


  return head;
}


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

}
//這個(gè)程序一定要搞懂,通過仿真現(xiàn)象分析代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品久久久久久久酒店 | 欧美一区二区三 | 日韩一区二区免费视频 | 欧美色图在线观看 | 毛片视频免费 | 日韩av免费看| 日日操天天操 | 久久国产精| 中文字幕国产视频 | 五月婷婷综合网 | 九九视频免费观看 | 久久精品国产亚洲 | 国内精品久久久久 | 日韩a级片 | 国产午夜精品久久久久久久 | www.粉色视频在线观看 | 一区二区三区国产视频 | 自拍偷拍福利视频 | 成人免费看片视频 | 美女视频福利 | 中文天堂在线观看 | 天天操天天做 | 在线观看黄色av | 四虎最新地址 | 欧美在线视频一区二区 | 欧美日韩综合网 | 美日韩在线视频 | jlzzjlzz欧美大全 | www国产亚洲精品久久网站 | 久久福利网 | 一区免费视频 | 国产日韩综合 | 国产在线天堂 | 久久久久久穴 | a级片网址 | 国产小视频网站 | 中文字幕第一区综合 | 日本不卡一区二区三区 | 国产免费一级片 | 久久观看 | 夜色在线影院 |