資料結構(C實現)------- 順序表

來源:互聯網
上載者:User

標籤:線性表   順序表的實現   

            線性表是由n(n>=0)個具有相同資料類型的資料元素組成的有限序列,通常記為:(a1,a2,..,ai-1,ai,ai+1,...,an),表中相鄰元素之間存在著序偶關係,即<ai-1,ai>,其中ai-1稱為ai的前驅,ai稱為ai-1的後繼,2<=i<=n。表中資料元素的個數n,稱為線性表的長度,長度為0的線性表稱為空白表。在非空的線性表中,每個資料元素都有一個確定的位置,如a1是第一個元素,an是最後一個元素,ai是第i個元素,稱i 為資料元素ai線上性表上的位序.

           順序表是線性表的順序儲存結構,是指用一組連續的儲存單元依次儲存線性表的資料元素。在順序表中,邏輯關係相鄰的兩個元素在物理位置上也相鄰,元素之間的邏輯關係是通過下標反映出來的。

           數組可以用來描述順序表,但考慮到順序表的長度是不斷變化的,所以通常將一維資料和順序表的長度封裝成一個結構體來描述順序表。如下所示:

// 定義順序表#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ElemType inttypedef struct{ElemType *elem;//儲存空間基址int length;//當前長度 int listsize; //當前分配的儲存容量}SqList;
        

         針對線性表,有初始化,插入,刪除,清空,得到表長度,列印順序表,銷毀,定位等操作,分另如下:

       

//宏定義#define Status int #define OK 1#define OVERFLOW 1#define ERROR 0#define TRUE 1#define FALSE 0
      

         順序表的各種操作:

// 初始化Status InitList_Sq(SqList *L){L->elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L->elem)exit(OVERFLOW);L->length = 0;L->listsize = LIST_INIT_SIZE;return OK;}// 在指定位置插入元素Status ListInsert_Sq(SqList *L,int i,ElemType e){//在順序表L中的第i個位置之前插入新的元素eElemType *q,*p;if(i < 1 || i > L->length+1){printf("位置不合法\n");return ERROR;}if(L->length >= L->listsize){ElemType *newbase = (ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));if(!newbase)exit(OVERFLOW);L->elem = newbase;L->listsize = L->listsize+LISTINCREMENT;}q = &(L->elem[i-1]);// 插入位置 for (p = &(L->elem[L->length - 1]);p>=q;p--)*(p+1) = *p;*q = e;L->length++;printf("元素%d已被插入到順序表中\n",e);return OK;}//  列印順序表Status ListPrint_Sq(SqList *L){ElemType *p,*q;if(L->length == 0){printf("順序表為空白\n");return ERROR;}p = L->elem;//取出順序表的首地址q = L->elem + L->length - 1;//取出順序表的末地址printf("順序表元素為:");while(p <= q ){printf("%d\t",*p);p++;}printf("\n");return OK;}// 刪除順序表中的第i個元素 Status ListDelete_Sq(SqList *L,int i){ElemType *p,*q,e;if(i < 1 ||  i > L->length){printf("位置不合法\n");return ERROR;}p = &(L->elem[i-1]);//取出被刪除元素的地址e = *p;//取出被刪除元素q = L->elem + L->length -1;while(p < q){*p = *(p+1);p++;}L->length--;printf("元素%d已被刪除\n",e);return OK;}//得到順序表的長度int  ListLength_Sq(SqList *L){return L->length;}//判斷是否為空白表Status ListEmpty_Sq(SqList *L){if(L->length == 0){printf("表為空白\n");return TRUE;}else{printf("表不空\n");return FALSE;}}//清空順序表Status ClearList_Sq(SqList *L){L->length = 0;}//銷毀順序表Status DestroyList_Sq(SqList *L){free(L->elem);L->length = 0;return OK;}//尋找指定位置的元素Status GetListElem_Sq(SqList *L,int i){ElemType *p;if( i < 1 || i > L->length){printf("位置不合法\n");return ERROR;}p = &(L->elem[i-1]);printf("尋找成功,順序表的第i個元素為%d",*p);return OK;}// 尋找滿足條件的元素,並返回尋找到第一個的位置int LocateList_Sq(SqList *L,ElemType e){ElemType *p,*q;int l=0,flg=0;p = L->elem;q = L->elem + L->length -1;while(p  <= q){if( e == *p){flg = 1;break;}l++;p++;}if(flg == 0){printf("順序一中沒有這個元素\n");return 0;}printf("尋找成功,該元素在順序表中的第%d個位置",l);return l;}

      測試時,在主函數裡先定義一個結構體SqList L,然後就可以測試相關的函數了,如InitList_Sq(&L);或ListPrint_Sq(&L);


資料結構(C實現)------- 順序表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.