順序儲存的原理:
1.首先,什麼是線性表?顧名思義,線性表就是由零個或多個資料元素的有限序列。
2.所謂順序儲存,就是在儲存器中分配一段連續的儲存空間,邏輯上相鄰的資料元素,其物理儲存位址也是相鄰的。
3.應該注意的是,表的長度未必與容量相同,表的長度要小於等於表的容量。
4.在順序儲存中,只要確定了線性表在儲存空間裡的起始位置,線性表中的任意元素就都可隨機訪問,所以線性表的順序儲存結構是一種隨機訪問的結構,在高階語言中,順序儲存就是用陣列來實現的。
5.在順序儲存中,系統不需要為表元素之間的邏輯關係增加額外的儲存空間,而且在訪問元素時,它可以根據給出的下標快速計算出元素的儲存位址,從而達到隨機讀取的目的。
6.一般,不建議在順序表中插入或刪除元素,因為效率會很低。
順序儲存的實現:
1.建立順序表:
首先需要建立乙個頭結點來存放順序表的長度,大小和位址等資訊,然後再建立順序表,同時將順序表的位址儲存在頭結點中:
具體實現思路如下:
(1)定義乙個struct來儲存順序表資訊;
(2)為頭結點分配空間;
(3)為順序表分配空間,將順序表空間位址儲存在頭結點中;
(4)將頭結點位址返回給呼叫者。
**實現如下:
typedef
struct _tag_seqlist //頭結點,記錄表的資訊
tseqlist;
//建立順序表
seqlist *seqlist_create(int capacity) //返回值為seqlist *型別,即順序表的位址
memset(temp, 0, sizeof(tseqlist));
temp->capacity = capacity;
temp->length = 0;
temp->node = (int *)malloc(sizeof(void*)*capacity);//分配乙個指標陣列
if (temp->node == null)
return temp; //將分配好的順序表的位址返回
}
2.求順序表容量:
在實現順序表時,一般將順序表資訊儲存在頭結點中,因此求順序表容量時,可以直接從頭結點中獲取。
**實現如下:
int seqlist_capacity(seqlist *
list)
temp = (tseqlist *)list;
return temp->capacity;
}
3.求順序表長度:
和求順序表的容量一樣,求順序表大小也是從頭結點中獲取資訊
**實現如下:
int seqlist_length(seqlist *
list)
temp = (tseqlist *)list;
return temp->length;
}
4.插入元素:
增刪改修是資料結構的核心操作,每種資料結構都要實現這幾種最基本的操作。
當順序表已滿時,表中的元素無法向後移動,需要作出特別處理(例如不插入,或者新開闢一塊更大的空間來儲存這些元素)。
當插入的位置在空閒區域時,需要作出相應處理。
**實現如下:
int seqlist_insert(seqlist *list, seqlistnode* node, int pos)//引數為順序表位址,要插入的元素位址,插入位置
temp = (tseqlist*)list;
//如果順序表已滿
if (temp->length >= temp->capacity)//如果順序表為空,或者結點為空
//容錯
if (pos > temp->length) //如果給出的pos在長度後,即中間有空餘,就修正到最後乙個元素後面
for (i = temp->length; i > pos; i--) //將插入位置的元素依次後移
temp->node[i] = (int)node; //然後在騰出來位置插入新元素結點
temp->length++; //插入成功後,長度加1
return
0;}
5.刪除元素:
從順序表中刪除某個元素,則將元素刪除後,需要將後面的元素依次向前移動來補齊空位。
**實現如下:
seqlist *seqlist_delete(seqlist *list, int
pos)
temp = (seqlistnode *)tlist->node[pos];
for (i = pos + 1; i < tlist->length; i++)
tlist->length--;
return temp;
}
6.查詢某個位置上的元素:
因為順序表在底層是以陣列來實現的,每個儲存單元都有索引標註,要查詢某個位置上的元素,直接按索引來查詢即可。
**實現如下:
seqlist *seqlist_get(seqlist *list, int
pos)
temp = (seqlistnode *)tlist->node[pos]; //將表中pos位置的結點指標賦給temp
return temp;
}
7.清空表:
清空順序表是將表中的內容全部置為0.
**實現如下:
void seqlist_clear(seqlist*
list)
temp = (tseqlist *)list;
temp->length =
0; memset(temp->node, 0, (temp->capacity*sizeof(void
*)));//將順序表全部歸0
return;
}
8.銷毀表:
銷毀順序表是將表整個銷毀。
**實現如下:
void seqlist_destory(seqlist *
list)
temp = (tseqlist *)list;
if (temp->node !=
null)
free(temp); //再釋放頭結點
return;
}
線性表的順序儲存 順序表
一丶順序表 概念 採用順序儲存的線性表稱為順序表,順序表中邏輯上相鄰的資料元素在物理儲存位置上也是相鄰的。二丶定義順序表 用一維陣列來描述順序表的資料儲存。由於順序表有插入刪除等操作,即順序表的表長會發生改變。因此是陣列長度足夠大,加入整型變數length來記錄此時線性表中資料元素的個數,順序表的結...
線性表的順序儲存 順序表
線性表,簡稱表,是n n 0 個具有相同型別的資料元素的有限序列。1 線性表是乙個相當靈活的資料結構,對線性表的資料元素不僅可以進行訪問訪問,還可以進行插入和刪除等操作。2 a1稱為第1個元素,an稱為最後乙個元素,任意一對相鄰的資料元素a i 1 和a i 1序偶關係 且a i 1 稱為a i 的...
線性表的順序儲存 順序表
線性表可以按照其儲存結構劃分為順序表 鍊錶。如下圖 順序表 順序表的描述 1 陣列靜態分配 define maxsize 30 typedef int elemtype typedef structsqlist 2 陣列動態分配 define maxsize 30 typedef int elemt...