一,線性表的概念以及數學定義
1.線性表的概念
零個或多個數據元素的有限序列。首先說明這是一個序列,也就是說數據元素之間是有順序的,若元素存在多個,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且僅有一個前驅和後繼。
2.數學定義
若將線性表記為(a1...ai-1,ai,ai+1....an),則線性表中,ai-1領先於ai,ai領先於ai+1,則稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素,當i=1,2....n-1的時候,ai有且僅有一個直接後繼元素,當i=2,3...n的時候,ai有且僅有一個直接前驅元素。
二,線性表的順序存儲結構
1.順序存儲結構的概念
線性表的順序存儲結構,指的是利用一段地址連續的存儲單元依次存儲線性表的數據元素。
2.順序存儲方式的實現
我們利用數組這個數據類型,來表示一段地址連續的存儲單元。
三,線性表之順序存儲結構的的實現
1.線性表基本功能:
1.創建線性表 ==> List * createList(int capacity);
2.銷毀線性表 ==> void destoryList(List * list);
3.清空線性表 ==> void clearList(List * list);
4.獲取線性表長度 ==> int length(List * list);
5.獲取線性表容量 ==> int capacity(List * list);
6.線性表的插入 ==> void insert(List * list,int pos,Node * node);
7.線性表的刪除 ==> Node * delete(List * list,int pos);
8.線性表的修改 ==> Node * update(List * list,int pos,Node * node);
9.線性表的獲取 ==> Node * get(List * list,int pos);
2.線性表基本功能的代碼實現:
# include<stdio.h> # include<stdlib.h> # include<string.h> typedef void Node; typedef struct SeqList { int capacity; int length; int * array; }List; /* 創建指定容量大小的線性表 */ List * createList(int capacity) { // 在堆上分配線性表對象 List * list = (List *)malloc(sizeof(List)); // 初始化線性表對象的容量 list->capacity = capacity; // 初始化線性表當前長度 list->length = 0; // 初始化線性表的數組 list->array = malloc(capacity*sizeof(void *)); // 返回線性表 return list; } /* 銷毀線性表 */ void destoryList(List * list) { if (list != NULL) { if (list->array != NULL) { // 釋放線性表中的數組 free(list->array); list->array = NULL; } // 釋放線性表對象 free(list); list = NULL; } } /* 清空線性表 */ void clearList(List * list) { if (list != NULL) { // 線性表的數組清空 memset(list->array, 0, sizeof(list->array)/list->capacity); // 線性表的長度清空 list->length = 0; } } /* 線性表的長度 */ int length(List * list) { return list->length; } /* 線性表的容量 */ int capacity(List * list) { return list->capacity; } /* 線性表的插入 */ void insert(List * list, int pos, Node * node) { if (list == NULL) { printf("線性表為NULL\n"); return; } if (pos > list->capacity) { printf("插入位置超過線性表的容量\n"); return; } if (list->length > list->capacity) { printf("線性表容量已滿,無法插入\n"); return; } // 容錯機制 6個長度,容量20,插入10,則自動插入到7這個位置 if (pos>list->length) { list->array[list->length] = node; // 線性表長度加一 list->length++; return; } // 移動pos之後的數據 for (int i = list->length; i > pos-1; i--) { list->array[i] = list->array[i-1]; } // 插入數據 list->array[pos - 1] = node; // 線性表長度加一 list->length++; } /* 線性表的刪除 */ Node * delete(List * list, int pos) { if (list == NULL) { printf("線性表為NULL\n"); return NULL; } if (pos > list->length) { printf("刪除位置不存在\n"); return NULL; } // 返回的元素 Node * node = list->array[pos - 1];; // 刪除元素後線性表長度減一 list->length--; // 刪除最後一個 if (pos == list->length) { list->array[pos - 1] = NULL; return node; } // 刪除 for (int i = pos - 1; i < list->length; i++) { list->array[i] = list->array[i + 1]; } return node; } /* 線性表的修改 */ Node * update(List * list, int pos, Node * node) { if (list == NULL) { printf("線性表為NULL\n"); return NULL; } // 返回修改前的對象 Node * result = list->array[pos - 1]; // 修改 list->array[pos - 1] = node; return result; } /* 線性表的獲取 */ Node * get(List * list, int pos) { if (list == NULL) { printf("線性表為NULL\n"); return NULL; } return list->array[pos - 1]; }
3.測試程序實現
/* 測試程序 */ typedef struct Student { char name[64]; int age; }Student; int main() { // 創建線性表 List * list = createList(20); // 創建學生對象並初始化 Student s1 = { "劉備",42 }; Student s2 = { "關羽",38 }; Student s3 = { "張飛",32 }; Student s4 = { "趙雲",36 }; Student s5 = { "馬超",26 }; Student s6 = { "黃忠",59 }; // 頭插法插入 insert(list, 1, &s1); insert(list, 2, &s2); insert(list, 3, &s3); insert(list, 4, &s4); insert(list, 5, &s5); insert(list, 19, &s6); // 獲取長度 printf("############線性表長度############\n"); printf("length = %d\n", length(list)); // 獲取容量 printf("############線性表容量############\n"); printf("capacity = %d\n", capacity(list)); // 遍歷 printf("############線性表遍歷############\n"); for (int i = 1; i <= length(list); i++) { Student * s = get(list, i); printf("name = %s,age = %d\n", s->name, s->age); } // 刪除第一個元素 delete(list, 3); printf("############刪除第三個元素############\n"); // 遍歷 for (int i = 1; i <= length(list); i++) { Student * s = get(list, i); printf("name = %s,age = %d\n", s->name, s->age); } // 修改第一個元素 printf("############修改第一個元素############\n"); Student sss = { "劉備-漢中王",50 }; update(list, 1, &sss); // 遍歷 for (int i = 1; i <= length(list); i++) { Student * s = get(list, i); printf("name = %s,age = %d\n", s->name, s->age); } // 清空線性表 printf("############清空線性表############\n"); clearList(list); // 遍歷 for (int i = 1; i <= length(list); i++) { Student * s = get(list, i); printf("name = %s,age = %d\n", s->name, s->age); } // 銷毀線性表 printf("############銷毀線性表############\n"); destoryList(list); return 0; }
四,線性表順序存儲結構的總結
1.順序存儲結構的優點
1.無需為線性表中的邏輯關系增加額外的空間。
2.可以快速獲取線性表中合法位置的數據元素。
2.順序存儲結構的缺點
1.插入和刪除操作需要移動大量元素。
2.當線性表長度變化較大時難以確定存儲空間的容量。
3.總結
線性表順序存儲結構適用於查詢多,增刪少,數據長度變化小的場景。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2017-01/139260p2.htm