1. 程式人生 > >資料結構--連結串列2

資料結構--連結串列2

今天繼續介紹資料結構中的連結串列這塊這塊內容,前面介紹了建立資料鏈表採用頭插法,尾插法,今天主要介紹的是有序插法。

在介紹有序插法前先進行頭插法與尾部插法的總結。

新建連結串列主要有三種方法:頭插法,尾插法,有序插法

頭插法的主要思路:

連結串列為空的時候,新節點變為頭結點、尾部節點。

連結串列不為空的時候,新節點的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");

}