資料結構(二) 線性表的順序表

2021-09-12 02:54:33 字數 3999 閱讀 7700

線性表就是一對一的關係。線性表分為,順序表和煉表(即是按物理結構劃分的)。

順序表是實體地址相鄰的,看起來像是陣列的定義。不過,順序表和陣列也有不同。

順序表的屬性是:

——有儲存空間的起始位置data,即是乙個陣列的首位址(這也就是陣列了);

——線性表有乙個變數標記最大儲存容量,maxsize;

——有乙個變數標記當前的長度,length。

後兩個屬性,恰恰體現了順序表和陣列的本質區別。順序表需要的不只是乙個能存放一排資料的空間,它需要的是,這個空間可以變動大小(maxsize)、能夠實際地得到當前被利用的情況(length)、可以被外界簡單地插入、刪除等等操作,這是乙個固定的陣列所不能做到的。

所以,順序表體現出來一般是陣列+maxsize+length進行malloc-free記憶體管理。

順序錶用結構體來表示:

#define initsize 20

#define addsize 5

typedef int elementype;

typedef structsqlist;

順序表的運算一般有:

void initlist(sqlist * list);

void clearlist(sqlist * list);

void locateelem(sqlist * list,elementype n);

void sertlist(sqlist * list,int n,elementype temp);

int listlength(sqlist * list);

void deleteelem(sqlist * list,int n);

void destroylist(sqlist * list);

為什麼這些傳的引數 list,是求位址,因為只有傳的是位址,才能真正地修改main函式裡,生成的那個list的屬性,比如data裡的值、length、maxsize。不然如果傳的是結構體型別,只是在函式裡修改了,返回到主函式裡,其實是沒變化的。

以下是各個函式的定義(雖然可能有些不同,但原理知道,都可以寫出自己想要的)。

void initlist(sqlist * list):

(乙個健壯的程式,是要考慮異常情況的,分配記憶體失敗,是一定要考慮的)

void initlist(sqlist * list)

else

}

void clearlist(sqlist * list):

void clearlist(sqlist * list)

list->length = 0;

printf(" data is empty\n");

}

void sertlist(sqlist * list,int n,elementype temp):

支援拓展size,是elementype * newbase = (elementype *) realloc(list->data,(list->listsize+addsize)*sizeof(elementype));的作用。

realloc函式,可以申請乙個更大的空間,並將原空間的資料複製到新空間裡去。

//支援擴充size,記錄了length 

void sertlist(sqlist * list,int n,elementype temp)

list->listsize += addsize;

list->data = newbase; }

list->data[n-1] = temp;

list->length ++;

printf("list_data[%d] = %d\n",n-1,list->data[n-1]);

}

int listlength(sqlist * list):

int listlength(sqlist  * list)

void destroylist(sqlist * list):

void destroylist(sqlist * list)

void locateelem(sqlist * list,elementype n):

void locateelem(sqlist * list,elementype n)

} if(status == 0)

}

void deleteelem(sqlist * list,int n):

void deleteelem(sqlist * list,int n)

} if(status == 0)

}

附上全部的程式:

#include#include#define initsize 20

#define addsize 5

typedef int elementype;

typedef structsqlist;

/*******

對程式的說明:

最重要是struct的建立吧,其實相對於資料,就是多了個listsize和length,但這恰恰是線性表和陣列的區別。

list傳參 ,一定是傳位址,不然是不可能有效的,即是在函式裡做好了,返回main還是空的list

destroylist是要用free函式。

做到拓展listsize

侷限性 :

沒有乙個完整列印data的函式,但實現起來不難;

查詢、刪除函式,傳入的是data裡的值(就算有多個重複的,也可以一起刪掉,挺周全的),

還有另外一種是傳入data的序號來查詢刪除,不難實現

起名字不規範

******/

void initlist(sqlist * list);

void clearlist(sqlist * list);

void locateelem(sqlist * list,elementype n);

void sertlist(sqlist * list,int n,elementype temp);

int listlength(sqlist * list);

void deleteelem(sqlist * list,int n);

void destroylist(sqlist * list);

int main(void)

void deleteelem(sqlist * list,int n)

} if(status == 0)

}void locateelem(sqlist * list,elementype n)

} if(status == 0)

}void initlist(sqlist * list)

else

}void clearlist(sqlist * list)

list->length = 0;

printf(" data is empty\n");

}//支援擴充size,記錄了length

void sertlist(sqlist * list,int n,elementype temp)

list->listsize += addsize;

//list->data = newbase; }

list->data[n-1] = temp;

list->length ++;

printf("list_data[%d] = %d\n",n-1,list->data[n-1]);

}int listlength(sqlist * list)

void destroylist(sqlist * list)

測試結果:

資料結構(二) 線性表

線性表是最簡單最常用的資料結構,是一種典型的線性儲存結構。定義 線性表是由n n 0 個資料元素 結點 a1 a 2 an 組成的有限序列。n為表的長度。當n 0,為 空表 n 0時,為 a1,a 2,an 邏輯特徵 非空的線性表只有乙個頭結點,也只有乙個終結點,頭結點只有乙個直接後繼結點,而沒有直...

資料結構複習(二)線性表(1)順序表

0.1 線性表定義 具有相同資料型別的n個資料元素的有限序列 一般表示為l a1,a2,a3 an 注意點 儲存資料型別都是相同的 是有限的 是乙個序列,即儲存的內容是有次序的 0.2前驅與後繼 除第乙個元素 表頭元素 外,每個元素都有且僅有乙個前驅。除最後乙個元素 表尾元素 外,每隔元素都有且僅有...

《資料結構》實驗二 線性表的實驗(順序表)

一 實驗目的 鞏固線性表的資料結構,學會線性表的應用。1.回顧線性表的邏輯結構,線性表的物理儲存結構和常見操作。2.學習運用線性表的知識來解決實際問題。3.進一步鞏固程式除錯方法。4.進一步鞏固模板程式設計。二 實驗時間 準備時間為第2周到第4周,具體集中實驗時間為第4週第2次課。2個學時。三 實驗...