線性表-順序表

        課本上基本都是僞代碼,涉及到程序語言的細節又不能真正運行,又具體又抽象。不管怎樣,先把程序實際跑起來,等有了實際的體會後再抽象就好理解了。

上機實現代碼:

先看使用:

 void main()
 
...{
   SqList L;
//定義L爲順序線性表
   int j;
   
   printf(
"  begin test sqList  ");
   InitList(
&L);//初始化L
   printf("  after init L: L.elembase=%u L.length=%d L.size=%d:",L.elembase,L.length,L.size);
   
   
for(j=1;j<=6;j++)
     ListInsert(
&L,1,j);//在第1個位置前插入j
   printf("  after insert 1~6:");
   printf(
"L.elembase=%u L.length=%d L.size=%d ",L.elembase,L.length,L.size);
   display(L);
//打印L中的值
   
   ListDelete(&L,
3);
   printf(
"  after delete 3:  ");
   display(L);
}
//類型定義
 typedef struct StSqList
 
...{
     ElemType
* elembase;
     
int length;
     
int size;
 }
SqList;
struct StSqList//結構名
...{
     ElemType
* elembase;
     
int length;
     
int size;
}
;
typedef  SqList 
struct StSqList ;
/**//*
SqList爲類型名,以後使用的時候SqList L; 這樣聲明即可,否則 struct StSqList L;
*/

再來說明理論上爲什麼要這樣定義,因爲一個順序線性表需要有這三個元素來定義。1:elembase:數組的起始地址,由此地址可找到整個線性表的內容。2:length:當前表中已經存的數據個數(注意和數組的下標區分開,相差1)。3:size:此線性表的容量大小,因爲順序表是一次分配一塊連續內存(元素之間的先後順序是內存地址的順序,不象鏈式表是通過指針指向下一個元素地址),如果一次分配太大的一塊內存可能就浪費,如果太小可能就不夠用,所以就使用length和size兩個屬性來動態確定順序表的大小(如果length==size了,重新分配一塊更大的內存給這個順序表)。

 

 //初始化順序表
 void InitList(SqList *sqList)
 ...
...{
    ElemType
* elembase;
    elembase
=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
    
if (!elembase)  exit(ERROR);
    
else
    ...
...{

    sqList->elembase=elembase;
        sqList->length=0;
    sqList
->size=LIST_INIT_SIZE;
    }

 }

 
/**//**//**//*
 1:SqList *sqList 爲什麼傳指針參數:因爲需要修改形參的值(後面的display函數就沒有傳指針,因爲display函數不改變順序表的值)。
 
 2:爲什麼要通過malloc動態分配內存:只有這樣才能內存不夠時另外分配一塊合適的內存,
                                   不像類似靜態數組elemarr[100],如果容量不夠沒有辦法,
                                       需要動態創建的情形:
                                           1.對象很大
                                           2.對象需要在某個特定的時刻構造或析夠
                                           3.類只允許對象動態創建,比如VCL的大多數類
                                           詳細參考 http://www.yoese.com/read.php?tid=1922&page=e
                                                        http://zhidao.baidu.com/question/7759808.html?si=3
                                   
 3:malloc函數:  返回值類型爲 void *,調用格式爲:malloc(size),size的類型爲unsigned int 。 
                malloc函數用來分配size個字節的存儲區,返回一個指向存儲區首地址的基類型爲void的地址,
                若沒有足夠的內存單元供分配,函數返回空(NULL)。
                通過調用malloc函數所分配的動態存儲單元中沒有確定的初值,這個存儲單元也沒有名字,只能靠指針來引用它。 
                因爲malloc函數的返回的地址爲void *,在調用函數時,必須使用強制類型轉換將其轉換爲所需要的類型。

 
*/
 
 //在第i個位置前插入data到順序表sqList中,
 Status ListInsert(SqList* sqList,int i,int data)
 
...{
   
int j;
   
if (i<1||i>sqList->length+1return ERROR;//i>=1&&i<=sqList->length+1時合法,任何位置的前面或最後一個數的後面,i<=sqList->length不對,最開始length=0,i=1
   if (sqList->length==sqList->size)//如果容量不夠,重新分配
   ...{
    ElemType
* newBase=(ElemType *)realloc(sqList->elembase,sqList->size+sizeof(ElemType)*LIST_INCREMENT);
    
if (!newBase) return ERROR;
    
else
    
...{
        sqList
->elembase=newBase;
        sqList
->size=sqList->size+LIST_INCREMENT;
    }

   }


   
for(j=sqList->length-1;j>=i-1;j--)
   
...{
     sqList
->elembase[j+1]=sqList->elembase[j];//注意length和數組index的關係
   }

   sqList
->elembase[i-1]=data;
   sqList
->length++;
   
return OK;
 }

 
/**//*
 因爲sqList是struct指針類型,所以訪問結構體內元素的方法爲 sqList->length或(*sqList).length
 
*/

 
  void display(SqList sqList)
  
...{
    
int i;
    
for(i=0;i<=sqList.length-1;i++) printf("sqList.elembase[%d]=%d",i,sqList.elembase[i]);
  }


發佈了18 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章