【資料結構】線性表(1)順序表基礎及簡單操作
阿新 • • 發佈:2021-09-15
【資料結構】線性表
線性表是n個數據元素的有限序列。
線性表是一種邏輯結構,表是元素之間一對一的相鄰關係。
順序表和連結串列是指儲存結構。
特點
- 表中元素個數有限
- 表中元素具有邏輯上的順序性,表中元素有其先後次序
- 表中元素都是資料元素,每個元素都是單個元素
- 每個元素佔有相同大小的儲存空間
順序表
線性表的順序儲存又稱為順序表。用一組地址連續的儲存單元一次儲存線性表中的資料元素。邏輯上相鄰的兩個元素在物理位置上也相鄰
一維陣列空間分配
靜態分配
陣列的大小和空間已經固定,一旦空間站慢,再加入新的資料將會產生溢位,程式就會崩潰。
動態分配
儲存陣列的空間是在程式執行過程中通過動態儲存分配語句分配的,一旦資料空間佔滿,就另外開闢一塊更大的儲存空間,用來替換原來的儲存空間。
⚠️:動態分配仍然是順序儲存結構,物理結構沒有變化,依然是隨機存取方式,只是分配的空間大小可以在執行時決定。
特點
- 隨機訪問,通過首地址和元素序號可在時間O(1)內找到指定的元素。
- 儲存密度高,每個節點只儲存資料元素。
- 邏輯上相鄰的元素物理上也相鄰,當執行插入刪除操作時,需要移動大量的元素。
基本操作的實現
插入操作
由於表中元素的物理位置是相鄰的,所以當插入新元素的時候就需要對錶中的元素進行整體移動。
操作描述:在順表L的第i個位置插入新元素e。若i的輸入不合法,則返回原表並顯示錯誤提示,表示插入失敗;否則,將順序表的第i個元素及其後的所有元素向右移動一個位置,騰出一個空位置插入新元素e,順序表長度增加1,插入成功返回已插入的表。
//插入操作 sqlist addlist (sqlist &l,int elem,int add)//插入操作,傳入表、插入的數字和第add個位置 { if (add>l.length+1||add<1) {//判斷選擇插入的位置是否在表內 printf("插入位置有問題"); return l; } for (int i=l.length-1; i>=add-1; i--) { //設定int型變數i來記錄陣列下標,初始設定i為3,當i大於等於指定位置的陣列下標時,i-1.直到i小於指定位置的下標時,結束迴圈 //注意傳入的是第幾個位置,而不是陣列下標 l.head[i+1]=l.head[i];//陣列下標i+1存i的數值 } l.head[add-1]=elem;//最後插入正確位置 l.length++; return l; }
刪除操作
刪除順序表L中第i個位置的元素,若成功則返回刪除後的表,並列印被刪除的元素,否則返回false
//刪除操作 sqlist delList(sqlist &l,int i){ if(i>l.length||i<1){ printf("erro"); exit(0); } int e=l.head[i-1]; printf("%d",e); printf("\n"); for(int j=i;j<l.length;j++){ l.head[j-1]=l.head[j]; } l.length--; return l; }
按值查詢(順序查詢)
在順序表中查詢第一個數值為e的元素,並返回其位序。
//按值查詢
int locateElem(sqlist l,int e){
for(int i=0;i<l.length;i++){
if(l.head[i]==e){
int j=i+1;
printf("在第%d個位置",j);
return i+1;
}
}
return 0;
}
//插入刪除操作全部可執行程式碼
#include <stdio.h>
#include <stdlib.h>
#define InitSize 4//初始長度
typedef struct{
int *head;//指示動態陣列分配的指標
int length;
int Size;
}sqlist;
sqlist initList(){
sqlist l;
l.head=(int*)malloc(InitSize*sizeof(int));//初始化動態分配
if(!l.head){
printf("erro\n");
exit(0);
}
l.length=0;
l.Size=InitSize;
return l;
}
void DispalyList(sqlist l){
for(int i=0;i<l.length;i++){
printf("%d",l.head[i]);
};
printf("\n");
}
sqlist addlist (sqlist &l,int elem,int add)
{
if (add>l.length+1||add<1) {
printf("插入位置有問題");
return l;
}
for (int i=l.length-1; i>=add-1; i--) {
l.head[i+1]=l.head[i];
}
l.head[add-1]=elem;
l.length++;
return l;
}
sqlist delList(sqlist &l,int i){
if(i>l.length||i<1){
printf("erro");
exit(0);
}
int e=l.head[i-1];
printf("%d",e);
printf("\n");
for(int j=i;j<l.length;j++){
l.head[j-1]=l.head[j];
}
l.length--;
return l;
}
int locateElem(sqlist l,int e){
for(int i=0;i<l.length;i++){
if(l.head[i]==e){
int j=i+1;
printf("在第%d個位置",j);
return i+1;
}
}
return 0;
}
int main()
{
sqlist l=initList();
for(int i=1;i<=InitSize;i++){
l.head[i-1]=i;
l.length++;
};
DispalyList(l);
addlist(l,0,1);
DispalyList(l);
delList(l,2);
DispalyList(l);
locateElem(l,0);
return 0;
}
一往無前虎山行,撥開雲霧見光明。