1. 程式人生 > >春節學習之從入門到放棄學習 ~~~廢材大學幾年沒學,從頭開始系列02

春節學習之從入門到放棄學習 ~~~廢材大學幾年沒學,從頭開始系列02

返回 相同 知識 靜態 定義 == ins color lse

今天還算起的還早,八點差不多就爬了起來了,昨天十點就要睡的,玩了一會手機,又到了十一點啦,只要把手機放到枕頭旁邊肯定會玩的很晚。。。

昨天學完棧,做了做後面的習題,發現前面學的鏈表幾乎全部忘記了233,現實版學了前面忘了後面,連鏈表的概念都有點擠不太清楚了。。。於是今天來把前面鏈表的知識復習一下,要學習鏈表,就不得不講一下前面的線性表

線性表的定義:

線性表是具有相同數據結構n(n>=0)個數據元素的有限序列。其中n為表長,當n=0時,該線性表是一個空表。

線性表可以分為線性存儲-》順序表 和 鏈式存儲-》(單鏈表、雙鏈表、循環鏈表)指針實現、(靜態鏈表)數組實現

線性表的順序存儲又稱為順序表,它是用一組地址連續的存儲單元,依次存儲線性表中的數據元素,從而是得邏輯上相鄰的兩個元素在物理位置上也相鄰。

sizeof(ElemType)是每個數據元素所占用存儲空間的大小

註意:線性表中的元素的位是從1開始的,而數組中元素的下標是從0開始的

#define MaxSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;

一維數組可以是靜態分配的,也可以是動態分配的,在靜態分配時,由於數組的大小和空間事先已經固定,一旦空間占滿,再加入新的數據將產生溢出,就會導致程序崩潰。而動態分配時,存儲數組的空間實在程序執行過程中通過動態存儲分配語句分配的,一旦數據空間占滿,可以另外開辟一塊更大的存儲空間,用以替換原來的存儲看空間,從而達到擴充存儲數組空間的目的,而不需要一次性地劃分所有所需空間給線性表。

#define InitSize 100
typedef struct {
ElemType *data;
int MaxSize,length;
} SeqList;

c語言的初始動態分配語句為

L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);

順序表最主要的特點是隨機訪問,即通過首地址和元素序號可以在O(1)的時間內找到指定元素

順序表上的基本操作的實現

插入操作

bool ListInsert (SqList &L, int i , ElemType e) {
// 本算法實現將元素e插入到順序表L中第i個位置
if (i<1
|| i>L.length+1) return false; if (L.length>=MaxSize) return false; for(int j=L.length; j>i;j--) L.data[j]=L.data[j-1]; L.data[i-1]=e; L.length++; return true; }

刪除操作

bool ListDelete(SqList &L ,int i , int &e) {
//本算法實現刪除順序表L中第i個位置的元素
if(i<1 || i>L.length)
return false;
e=L.data[i-1];
for(int j=i; j<L.length; j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}

按值查找

int LocateElem(SqList L, ElemType e) {
//本算法實現查找順序表中值為e的元素,吐過查找成功,返回元素位序
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}

春節學習之從入門到放棄學習 ~~~廢材大學幾年沒學,從頭開始系列02