用數組實現線性表

來源:互聯網
上載者:User

對於線性結構,有兩種儲存的方法,一種是使用C語言中內建的數組,這樣的結構成為順序表;另一種使用指標,這樣的結構成為鏈表。

對於線性結構,有12種基本的操作,分別是:初始化、刪除、清空、判斷是否為空白、遍曆、求表的長度、求某個元素在表中的位置、返回特定序號的元素、求某個元素的前一個元素、求某個元素的後一個元素、插入一個元素、刪除一個元素。

這一小節介紹如何利用數組實現線性表。

先看程式:

 

#include <stdio.h>#include <malloc.h>typedef int ElemType;typedef struct arraylist{//實際存放元素的數組ElemType *Array;//數組中已經使用了多少元素int length;//數組的容量int size;}arrayList;//初始化順序表:給出初始化長度bool initialArray(arrayList *arrLst,int len){arrLst->length = 0;arrLst->size = len;arrLst->Array = (ElemType*)malloc(len*sizeof(ElemType));if(NULL == arrLst->Array)return false;elsereturn true;}//刪除順序表void deleteArray(arrayList *arrLst){arrLst->length = 0;arrLst->size = 0;free(arrLst->Array);arrLst->Array = NULL;}//清空順序表void clearArray(arrayList *arrLst){arrLst->length = 0;}//判斷是否為空白bool is_empty(arrayList *arrLst){if(0 == arrLst->length){printf("the arrayList is empty!\n");return true;}else{printf("the arrayList is not empty!\n");return false;}}//求有多少個元素int arrayLength(arrayList *arrLst){return arrLst->length;}//取出某個元素bool getElem(arrayList *arrLst,int index,ElemType *e){if(index < 0 || index > arrayLength(arrLst)-1)return false;else{*e = arrLst->Array[index];return true;}}//遍曆順序表,並列印void printArray(arrayList *arrLst){printf("array elements are: ");for(int i = 0; i < arrayLength(arrLst);++i){printf("%d\t",arrLst->Array[i]);}printf("\n");}//判斷某個元素的位置int locateElem(arrayList *arrLst,ElemType e){for(int i = 0; i < arrayLength(arrLst);++i){if(e == arrLst->Array[i])return i;}return -1;}//求某個元素的前驅:如果沒找到返回-2;如果是第一個元素。返回-1;否則返回前驅元素的下標int preElement(arrayList *arrLst,ElemType e,ElemType *preElem){for(int i = 0 ; i < arrayLength(arrLst); ++i){//如果找到了if(e == arrLst->Array[i]){//如果是第一個元素if(0 == i){return -1;}else{*preElem = arrLst->Array[i-1];return i-1;}}}return -2;}//求某個元素的後繼:如果沒找到,返回-2,如果是最後一個元素,返回-1;否則返回後繼元素的下標int nextElement(arrayList *arrLst,ElemType e,ElemType *nxtElem){for(int i = 0; i < arrayLength(arrLst); ++i){if(e == arrLst->Array[i]){if(arrayLength(arrLst) -1 == i){return -1;}else{*nxtElem = arrLst->Array[i+1];return i+1;}}}return -2;}//將元素插入到指定位置bool insertElem(arrayList *arrLst,int index ,ElemType e ){//先判斷插入位置是否合法if(0 > index ||  arrayLength(arrLst) < index)return false;//如果順序表格儲存體空間已滿,則需要重新分配記憶體if(arrLst->length == arrLst->size){arrLst->Array = (ElemType*)realloc(arrLst->Array,2*arrLst->size*sizeof(ElemType));if(NULL == arrLst->Array)//分配失敗,程式退出return false;else//分配成功,擴容arrLst->size *= 2;}//將插入點之後的元素後移for(int i = arrayLength(arrLst); i > index; --i)arrLst->Array[i] = arrLst->Array[i-1];//插入元素arrLst->Array[index] = e;//順序表長度自增++arrLst->length;return true;}bool deleteElem(arrayList *arrLst,int index ,ElemType *e){if(index < 0 || index > arrayLength(arrLst)-1)return false;*e = arrLst->Array[index];//將刪除點的元素依次左移for(int i = index; i < arrayLength(arrLst);++i){arrLst->Array[i] = arrLst->Array[i+1];}--arrLst->length;;return true;}

 

大部分程式都很簡單,唯一需要說明的是,再插入元素時,如果線性表已滿,需要重新分配記憶體空間,新分配的記憶體空間設定為原來的2倍。這個倍數也不是我隨便給出的,我是參考C++中STL裡面的vector給出的。相信那些專家,肯定考慮了倍數過小而導致多次分配記憶體與記憶體配置太大的折中,我也就照貓畫虎的這樣做了。

其他的複雜的操作,大多數都能通過這些基本操作來完成,這裡就不在列出了。

我們可以看出,利用數組來表示線性結構,最大的優點在於由於數組是連續儲存的,所以隨機訪問速度非常快,只需要用數組的首地址+下標*sizeof(結構體)就能計算指定元素的地址了。而它的缺點也很明顯:就是插入、刪除時效率很低,因為要移動大量的元素,甚至需要重新分配記憶體。

最後說一句,程式是沒有標準答案的,我自己寫的程式也難免有各種錯誤,如果指出錯誤,我將不勝感激。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.