順序表學習:參考《大話數據結構》數據結構
涉及到順序表的基本操做有以下:函數
int initList(SqList *L); /** 初始化操做,創建一個空的線性表 **/
int printList(SqList L); /** 打印線性表中的每個元素 **/
int getlength(SqList L); /** 返回線性表元素的個數 **/
int createList(SqList *L,int length); /** 建立一個鏈表長度爲length的線性表 **/
int insertList(SqList *L, int pos,ElemType elem); /** 在線性表的第pos個位置插入 一個新元素elem **/
int getElem(SqList L, int pos, ElemType *e); /** 將線性表中第pos個位置的元素返回,保存在*e中 **/
int locateElem(SqList L, ElemType e); /** 在線性表中查找與給定元素e相等的元素,若是有相同的返回狀態值1,若是沒有,返回狀態值0 **/
int deleteList(SqList *L, int pos,ElemType *elem); /** 從線性表中刪除pos位置處的元素,並將其存放在elem中; **/
int clearList(SqList L,SqList *pL); /** 清空順序表 **/
(一)ADT學習
1 typedef int ElemType; 2 typedef struct{ // 線性表中共有length個元素,是data[0]——data[length-1] 3 int data[MAXSIZE]; 4 int length; 5 }SqList;
(二)初始化一個順序表測試
1 int initList(SqList *L) 2 { 3 L->length=0; 4 return 1; 5 }
(三)打印一個順序表,方便測試操做結果是否正確spa
1 int printList(SqList L) 2 { 3 if(L.length==0) 4 { printf("鏈表爲空\n"); 5 return 0; 6 } 7 int i; 8 for(i=0;i<L.length;i++){ 9 printf("data[%d] = %d\n",i,L.data[i]); 10 } 11 printf("\n"); 12 return 1; 13 }
(四)獲取順序表的長度code
1 int getlength(SqList L){ 2 return L.length; 3 }
(五)建立一個順序表,每一個元素的值隨機賦值blog
1 int createList(SqList *L,int length){ 2 srand(time(0)); 3 int i; 4 for(i=0;i<length;i++){ 5 L->data[i]=rand()%100; 6 L->length++; 7 } 8 return 1; 9 }
(六)在指定位置處插入一個新的元素 內存
1 int insertList(SqList *L, int pos,ElemType elem){ 2 int i; 3 if(pos<1 || pos>L->length) 4 { 5 printf("插入的位置有誤,沒法插入數據\n"); 6 return 0; 7 } 8 for (i=L->length-1;i>=pos-1;i--) 9 { 10 L->data[i+1]=L->data[i]; 11 } 12 L->data[pos-1] = elem; 13 L->length++; 14 return 1; 15 }
(七)獲取順序表中指定位置處的元素值 get
1 int getElem(SqList L, int pos, ElemType *e){ 2 if(pos<1 || pos>L.length) 3 { 4 printf("查找位置有錯誤,沒法獲取指定位置的數據\n"); 5 *e=99999999; 6 return 0; 7 } 8 *e = L.data[pos-1]; 9 return 1; 10 }
(八)查找在線性表中是否含有指定元素it
1 int locateElem(SqList L, ElemType e){ 2 int i; 3 for(i=0;i<L.length;i++) 4 { 5 //printf("在%d層循環...\n",i); 6 if(L.data[i] == e) 7 { 8 printf("在pos[%d]位置處,查找到了元素elem:%d\n",i+1,e); 9 return 1; 10 } 11 } 12 return 0; 13 }
(九)刪除順序表中指定位置處的元素
1 int deleteList(SqList *L, int pos,ElemType *elem){ 2 int i; 3 if(pos<1 || pos>L->length) 4 { 5 printf("刪除的位置有誤,沒法從該位置刪除數據\n"); 6 *elem=99999999; 7 return 0; 8 } 9 *elem = L->data[pos-1]; 10 for(i=pos;i<L->length;i++){ 11 L->data[i-1]=L->data[i]; 12 } 13 L->length --; 14 return 1; 15 }
(十)清空一個順序表,將順序表的length置爲0;
1 int clearList(SqList L,SqList *pL){ 2 printf("In clearList function: %d\n",&L); 3 printf("In clearList function: %d\n",pL); 4 L.length=0; 5 pL->length=0; 6 return 1; 7 }
說明:
一、在上面順序表操做函數中,有的入參是SqList類型的,有的是SqList*類型的,二者是有區別的,經過clearList()函數進行說明;
二、入參有兩種類型,這是爲了測試在函數內部,處理的順序表在內存中的位置是什麼,在函數內部,會把順序表的位置以%d的方式打印出來;同時在調用函數以前,會把傳入的入參順序表L的地址打印出來;
經過測試發現,若是入參爲SqList L,在函數內部地址同外部的順序表L地址不相同,若是入參爲SqList *pL,在函數內部地址同外部的順序表L地址相同;當入參爲SqList L時,執行L.length=0;無效,根本沒有將順序表的唱的長度置爲0;
三、綜上所述,若是要修改順序表中的值(包括長度,以及各個元素的值),好比建立順序表、插入元素、刪除元素等等操做,是對順序表內的數據有改動的,就要傳入SqList *類型的入參,不然達不到修改的目的;【這其實就是函數的值傳遞和地址傳遞】