資料結構之線性表
阿新 • • 發佈:2018-12-14
線性表的邏輯結構
線性表是由n個型別相同的資料元素組成的有限序列,記為(a1,a2,…,ai-1,ai,ai+1,…,an)。其中,這裡的資料元素可以是原子型別,也可以是結構型別。線性表的資料元素存在著序偶關係,即資料元素之間具有一定的次序。線上性表中,資料元素ai-1在ai的前面,ai又在ai+1的前面,可以把ai-1稱為ai的直接前驅元素,ai稱為ai+1的直接前驅元素。ai稱為ai-1的直接後繼元素,ai+1稱為ai的直接後繼元素。
線性表的順序儲存結構—順序表
順序表:用一段地址連續的儲存單元依次儲存線性表的資料元素。由圖可知資料元素的儲存地址是其序號的線性函式,即計算任意一個儲存結構的時間是相等的,具有這個特點的儲存結構被稱為隨機存取結構
順序表的C語言實現:
#include<stdio.h> #include<stdlib.h> //順序表的定義 //定義順序表的最多存放100個元素 #define MaxSize 100 //定義順序表的元素型別為int typedef int DataType; //定義順序表的結構體 typedef struct{ //存放資料元素的陣列 DataType data[MaxSize]; //順序表的長度 int length; }SeqList; //初始化順序表,設定長度為零 void InitList(SeqList *L){ L->length = 0; } //建立順序表 int CreateList(SeqList * L , DataType a[],int n ){ if (n>MaxSize){ printf("順序表儲存空間不夠,無法建立資料表\n"); return 0; } for (int i = 0 ; i<n ; i++){ L->data[i] = a[i]; } L->length = n; return 1; } //銷燬順序表 //由於順序表是靜態儲存分配,在順序表變數退出作用域的時候自動釋放變數所佔用的記憶體單元 //因此順序表無需銷燬 //判空操作 int Empty(SeqList * L){ if(L->length == 0) return 1; else return 0; } //取長度操作 int Length(SeqList *L){ return L->length; } //遍歷操作 void PrintList(SeqList * L){ for(int i = 0;i<L->length;i++){ printf("%d\t",L->data[i]); } } //按值查詢 int Locate(SeqList * L,DataType x){ for(int i = 0 ; i < L->length ; i++){ if (x == L->data[i]){ return i+1; } } return 0; } //按位查詢 int Get(SeqList * L,int n,DataType * ptr){ if(n>L->length || n< 1){ printf("查詢位置非法,查詢失敗\n"); return 0; }else{ *ptr = L->data[n]; return 1; } } //插入操作 int Insert(SeqList * L,int n ,DataType x){ if(L->length >= MaxSize ) { printf("上溢錯誤,插入失敗\n"); } if( n<1 || n>(L->length+1)) { printf("位置錯誤,插入失敗\n"); } for(int j = L->length;j>=n;j--){ L->data[j] = L->data[j-1]; } L->data[n-1] = x; L->length++; return 1; } //刪除操作 int Delete(SeqList * L,int n,DataType * ptr){ if(L->length == 0){ printf("下溢錯誤,失敗\n"); return 0; } if(n<1 || n > L->length ){ printf("位置錯誤,刪除失敗\n"); return 0; } for(int i = n; i < L->length ; i ++){ L->data[i-1] = L->data[i]; } L->length--; return 1; } //順序表的使用 int main(){ int r[5] = {1,2,3,4,5}; int x,i; SeqList L; printf("建立順序表"); CreateList(&L,r,5); PrintList(&L); printf("執行插入\n"); Insert(&L,2,8); printf("執行插入後的順序表\n"); PrintList(&L); printf("順序表的長度%d:\t" ,Length(&L)); printf("請輸入查詢的值\n"); scanf("%d",&x); i = Locate(&L,x); if(i == 0){ printf("查詢失敗\n"); }else{ printf("元素%d的位置是:%d\n",x,i); } printf("請輸入要查詢第幾個元素值\n"); scanf("%d",&i); if(Get(&L,i,&x) == 1){ printf("第%d個元素的值為%d\n",i,x); } else{ printf("線性表中沒有第%d個元素\n",i); } printf("請輸入要刪除第幾個元素:\n"); scanf("%d",&i); if(Delete(&L,i,&x) == 1){ printf("刪除第%d個元素是%d,刪除資料為:\n",i,x); PrintList(&L); }else{ printf("刪除失敗\n"); } return 0; }