資料結構--連結串列2
阿新 • • 發佈:2018-12-20
今天繼續介紹資料結構中的連結串列這塊這塊內容,前面介紹了建立資料鏈表採用頭插法,尾插法,今天主要介紹的是有序插法。
在介紹有序插法前先進行頭插法與尾部插法的總結。
新建連結串列主要有三種方法:頭插法,尾插法,有序插法
頭插法的主要思路:
連結串列為空的時候,新節點變為頭結點、尾部節點。
連結串列不為空的時候,新節點的pnext指向原有的頭節點,新的節點就會變成頭結點。
尾插法的主要思路:
連結串列為空的時候,新節點變為頭節點,尾節點。
連結串列不為空的時候,原有的節點的pnext指向德新的節點,新的節點就會變成了尾節點。
有序插法的主要思路:
- 為新節點開闢新的空間(malloc /calloc)
- pstu ppre,pcur //定義兩個中間百年量,用於節點的中間插入
- ppre pcur 指向頭節點
- 連結串列為空的時候,新節點變為頭節點尾節點
- 連結串列不為空的時候,判斷新節點的值是否小於頭結點所所指向的值,如果小於頭節點的值小於當前插入的值,就進行中間插入
- 通過pcur進行遍歷連結串列,發現某個節點的值大於新節點的值,該節點的pnext就會指向新的節點。新的節點的pnext指向當前的節點。
- pcur指向空對地時候說明需要進行尾部插入,ppre的pnext指向pnew,而
#include <stdio.h> #include <stdlib.h> //定義一個結構作為節點 typedef struct student { int num; struct student *pnext; }pstu; /* 函式功能:實現一個z中間插入的有序插法(從小到大排序) 主要步驟:1.首先為新節點申請記憶體 2.定義兩個中間指標變數 pstu *ppre *pcur 3.ppre,pcur指向頭結點 4.連結串列為空時,新節點變為頭節點,為節點 5.連結串列不為空時,判斷新節點的值是是不是小於頭頭節點的值,如果是小於,就使用頭插法。 如果不小於頭結點的值,就插入到中間,通過pcur進行遍歷連結串列,發現某個節點的值大於 新節點的值,該節點前的pnext指向新節點,新節點的pnext指向當前節點。ppre=pcur, pcur=pcur->next */ void list_sort_insert(pstu **phead,pstu **ptail,int i) { pstu *pnew,*pcur,*ppre;//pnew為帶入在ppre與pcur之間的值 pcur=*phead;//解引用 ppre=*ptail;//一開始都是指向頭節點 //為節點pnew開闢空間neiocun pnew=(pstu*) calloc(1,sizeof(pstu)); //插入數值 pnew->num=i; if(NULL==*phead) { ///如果為為節點,新值就等吧與尾指標和頭指標 *phead=pnew; *ptail=pnew; }else if(i<(*phead)->num) //解引用是去值,*是一個地址。**為一個值 { //實現頭插法 pnew->pnext=*phead;//原來的表頭作為新節點的next *phead=pnew;//新節點作為頭節點 } //完成頭插法判斷就開始進行中間有序插法 //接著開始遍歷pcur,發現某個點值開始大於新節點的值 else { while(pcur!=NULL) { if(i<pcur->num)// { ppre->pnext=pnew; pnew->pnext=pcur; break;//結束要插入的數 } //==確定好要賦的指標在ppre與pcur之間 //開始ppre與pcur站在一起 ppre=pcur; //大哥pcur先走一步 pcur=pcur->pnext;//完成中間插入 } if(NULL==pcur)//pcur為空,說明要插入到表尾 { ppre->pnext=pnew;//新街點賦值給原有的節點 *ptail=pnew;//新節點變為了尾部節點 } } } //列印連結串列 void list_printf(pstu *phead) { while(phead!=NULL) { printf("%d",phead->num); phead=phead->pnext; } } int main() { //宣告頭指標 pstu **phead=NULL,**ptail=NULL; int i; while(scanf("%d",&i)!=EOF) { list_sort_insert(&phead,&ptail,i); } list_printf(phead); system("pause"); }