1. 程式人生 > >資料結構小結——順序表(陣列版)

資料結構小結——順序表(陣列版)

何為順序表,引用百度百科中的一段話來說

順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的儲存單元中。

假設儲存的資料型別位int型,則線性表的順序儲存型別可以用結構體表示為:

#define MAX 64;

typedef int SeqData;

typedef struct _seqlist
{
    SeqData data[MAX];
    int len;
}SeqList;

這種資料是由陣列來儲存的,陣列的記憶體屬於靜態分配,大小固定,不可以改變,所以一旦陣列存滿,再繼續儲存會記憶體溢位,導致程式崩潰。
當然凡是都有例外,C99中支援了柔性陣列這種東西,不過此篇不做介紹。

順序表具體怎麼操作呢,其實很簡單。下面將簡單介紹,程式碼均只有片段。需要完整程式碼請直接下載(免積分)順序表(陣列版)程式碼

第一步肯定是建立表初始化。由於用的是陣列,所以操作都在棧記憶體上,系統自動分配記憶體,表直接建立就好了SeqList sqlist;初始化其實只需要令表的長度為0即sqlist.len = 0;

第二步由於陣列存在越界風險,所以在進行一些操作之前需要判斷表是否滿或空。

sqlist.len == MAX    //表為滿
sqlist.len == 0      //表為空

第三步進行資料插入,插入前一定要判斷表是否已滿,表滿則無法繼續插入,插入有頭插法,尾插法,中間插法。

//頭插法
//將所有元素向後移一位
int i;
for(i = s->len; i > 0; i--)
{
    s->data[i] = s->data[i-1];
}
//在頭部插入資料
s->data[0] = data;
//表長度加一
s->len++;

尾插法比較簡單,只要表不滿,就能直接插入

//尾插法
//在尾部插入資料
s->data[s->len] = data;
//表長度加一
s->len++;

中間插法即通過下標選擇插入的地點,此方法可以模擬頭插和尾插

//中間插法
//陣列從下標為pos位,所有元素後移一位
int i;
for(i = s->len; i > pos; i--)
{ s->data[i] = s->data[i-1]; } //在下標pos處插入資料 s->data[pos] = data; //表長度加一 s->len++;

第四步刪除資料,同理,在刪除資料之前要先判斷順序表是否為空,刪除就不要搞什麼頭刪尾刪了。在此給兩個例子

//刪除下標為pos的資料,原理差不多。
int i;
for(i = pos; i < s->len; i++)
{
    s->data[i] = s->data[i+1];
}
s->len--;
//刪除所有值為data的資料
int i = 0;
int j;
int len = s->len;
while(len--)
{
    //找到一個刪除一個
    if(s->data[i] == data)
    {
        for(j = i; j < s->len-1; j++)
        {
            s->data[j] = s->data[j+1];
        }
        s->len--;
    }    
    i++;
}

其他還有一些操作可以下載後慢慢研究,比較簡單就不寫下來了。
順序表相對其他的資料結構而言雖然簡單,但是很基礎,不能大意喲。
這裡寫圖片描述