數據結構:線性表的基本操做

順序表學習:參考《大話數據結構》數據結構

涉及到順序表的基本操做有以下:函數

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 *類型的入參,不然達不到修改的目的;【這其實就是函數的值傳遞和地址傳遞】

相關文章
相關標籤/搜索