課本上基本都是僞代碼,涉及到程序語言的細節又不能真正運行,又具體又抽象。不管怎樣,先把程序實際跑起來,等有了實際的體會後再抽象就好理解了。
上機實現代碼:
先看使用:
...{
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;
...{
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->size=LIST_INIT_SIZE;
}
}
/**//**//**//*
1:SqList *sqList 爲什麼傳指針參數:因爲需要修改形參的值(後面的display函數就沒有傳指針,因爲display函數不改變順序表的值)。
2:爲什麼要通過malloc動態分配內存:只有這樣才能內存不夠時另外分配一塊合適的內存,
不像類似靜態數組elemarr[100],如果容量不夠沒有辦法,
2.對象需要在某個特定的時刻構造或析夠
3.類只允許對象動態創建,比如VCL的大多數類
3:malloc函數: 返回值類型爲 void *,調用格式爲:malloc(size),size的類型爲unsigned int 。
malloc函數用來分配size個字節的存儲區,返回一個指向存儲區首地址的基類型爲void的地址,
若沒有足夠的內存單元供分配,函數返回空(NULL)。
通過調用malloc函數所分配的動態存儲單元中沒有確定的初值,這個存儲單元也沒有名字,只能靠指針來引用它。
因爲malloc函數的返回的地址爲void *,在調用函數時,必須使用強制類型轉換將其轉換爲所需要的類型。
*/
Status ListInsert(SqList* sqList,int i,int data)
...{
int j;
if (i<1||i>sqList->length+1) return 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
*/
...{
int i;
for(i=0;i<=sqList.length-1;i++) printf("sqList.elembase[%d]=%d",i,sqList.elembase[i]);
}