線性表就是一對一的關係。線性表分為,順序表和煉表(即是按物理結構劃分的)。
順序表是實體地址相鄰的,看起來像是陣列的定義。不過,順序表和陣列也有不同。
順序表的屬性是:
——有儲存空間的起始位置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個學時。三 實驗...