1. 程式人生 > >資料結構之順序儲存結構線性表

資料結構之順序儲存結構線性表

順序儲存結構:元素按順序連續儲存。

一般它的定義儲存格式為:

//定義資料格式
typedef struct {

    ElemType data[MAXSIZE];   //陣列儲存元素
    int length;               //線性表的長度

}SqList; 

在讀取順序表的元素,不管哪個位置它的演算法時間複雜度都為O(1),當插入或刪除一個元素的時候,它的時間複雜度為O(n).

以下為C語言程式碼的簡單實現:

#include <stdio.h>
#include <stdlib.h>

#include <io.h>
#include <math.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int Status; /* Status是函式的型別,其值是函式結果狀態程式碼,如OK等 */ typedef int ElemType; /* ElemType型別根據實際情況而定,這裡假設為int */ //定義資料格式 typedef struct { ElemType data[MAXSIZE]; int
length; }SqList; //初始化順序線性表 Status InitList(SqList *L){ L->length=0; return OK; } //判斷線性表是否為空 Status ListisEmpty(SqList L){ if(L.length==0){ return TRUE; }else{ return FALSE; } } //重置清空 Status ClearList(SqList *L){ L->length =0; return OK; } //查詢第i個元素,並將元素返回給*e
Status GetEle(SqList L,int i,ElemType *e){ if(L.length==0 || i<1 || i>L.length){ return ERROR; } *e = L.data[i-1]; return OK; } //查詢元素的所在的位置 int LocationEle(SqList L,ElemType e){ int i; if(L.length==0){ return 0; } for(i=0;i<L.length;i++){ if(L.data[i]==e){ break; } } if(i>L.length){ return 0; } printf("元素%d在第%d個位置\n",e,i+1); return 1; } int isLocate( SqList L,ElemType e){ int isLocate = 0; int i; for(i=0;i<L.length;i++){ if(L.data[i]==e){ isLocate = 1; } } return isLocate; } //插入元素操作 Status ListInsert(SqList *L,int i,ElemType e){ int k; if(L->length==MAXSIZE){ return ERROR; } if(i<1 || i>L->length+1){ return ERROR; } if(i<=L->length){ for(k=L->length-1;k>=i-1;k--){ //在i之後的元素全部向後移動一位 L->data[k+1] = L->data[k]; } } //將新元素插入 L->data[i-1] = e; //長度加1 L->length++; return OK; } //刪除元素操作 Status ListDelete(SqList *L,int i,ElemType *e){ int k; if(L->length==0){ return ERROR; } if(i<1 || i>L->length+1){ return ERROR; } *e = L->data[i-1]; printf("被刪除的元素為:%d\n",*e); if(i<=L->length){ for(k=i;k<L->length;k++){ L->data[k-1] = L->data[k]; //刪除的元素後面所有元素向前移動 } } L->length--; return OK; } //遍歷線性表操作 int ListVisit(SqList *L){ int i; if(L->length==0){ printf("該線性表為空\n"); } for(i=0;i<L->length;i++){ printf("%d ",L->data[i]); } printf("\n"); return OK; } //兩個順序線性表的合併操作 void unionL(SqList La,SqList Lb){ int la_len,lb_len,i; ElemType e; la_len = La.length; lb_len = Lb.length; for(i=1;i<=lb_len;i++){ GetEle(Lb,i,&e); if(!isLocate(La,e)){ ListInsert(&La,++la_len,e); } } //合併後的線性表為 printf("合併後的線性表:\n"); ListVisit(&La); } int main(){ SqList L; SqList Lb; ElemType e; Status i; int j,k; i = InitList(&L); printf("初始化的L的長度為L.length = %d\n",L.length); //插入 for(j=1;j<=5;j++){ ListInsert(&L,1,j); } printf("在表頭插入的資料L.data為:\n"); //遍歷插入的資料 ListVisit(&L); printf("\n"); //讀取一個元素 GetEle(L,2,&e); printf("你要查詢的第二個元素為 %d\n",e); //插入一個元素,第二個位置插入6 ListInsert(&L,2,6); printf("插入後的線性表為:\n"); ListVisit(&L); //查詢元素的位置 LocationEle(L,6); //刪除一個元素 ListDelete(&L,2,&e); printf("刪除元素後的線性表為:\n"); ListVisit(&L); //初始化Lb InitList(&Lb); //給Lb賦值,建立一個新的線性表 for(j=6;j<=15;j++){ ListInsert(&Lb,1,j); } //遍歷 printf("Lb的資料為Lb.data:\n"); ListVisit(&Lb); //合併兩個線性表,將第二個線性表 合併到第一個線性表 unionL(L,Lb); //清空重置線性表 ClearList(&L); ClearList(&Lb); ListVisit(&L); ListVisit(&Lb); }

這裡寫圖片描述