資料結構課程學習(2)

2021-10-03 02:09:48 字數 3303 閱讀 9233

線性表是具有相同資料型別的n(n>=0)個資料元素的有限序列

表頭元素,表尾元素

除第乙個元素外,每個元素有且僅有乙個直接前驅

除最後乙個元素外,有且有乙個直接後驅

線性表的順序結構儲存是邏輯上相鄰,物理上相鄰

隨機儲存,時間複雜度為o(1)

靜態建表

動態建表

起始位址(陣列名data)

儲存容量(maxsize)

長度(length)

靜態建表

儲存空間大小固定

【例子1】

#define maxsize 50 //定義線性表的最大長度

typedef int elemtype //假定表中元素型別是int

typedef structsqlist; //順序表的型別定義

動態建表

儲存空間動態分配

【例子2】

typedef int elemtype;

typedef struct seqlist;

#define initsize 100

seqlist l;

l.data=(elemtype*)malloc(sizeof(elemtype)*initsize);

優缺點
儲存密度大                插入,刪除需移動大量元素

隨機訪問 產生空間碎片

1.插入

過程在l表的第i(1<=i<=length+1)插入e

不可以,返回bool型別false

可以,右移乙個,表長+1,返回ture

【例子3】

/*

1.i是否正確

2.表長是否超過陣列長大衣

3.元素向後移乙個位置

4.插入位置i,修改表長

*/bool listinsert(sqlist &l , int i , elemtype e)lnode,*linklist;

頭指標,標識乙個單鏈表,例如linklist l,l為乙個單鏈表

頭指標和頭結點的區別

頭指標是指向鍊錶的第乙個結點

頭結點是鍊錶的第乙個結點,通常不放任何資訊,為了統一

單鏈表的操作

頭插法建立單鏈表

建立新結點,分配空間,再將新結點插入當前表頭

【例子5】

linklist creatlist1(linklist &l)

return l;

}

尾插法建立單鏈表

【例子6】

linklist creatlist2(linklist &l)

r->next=null; //尾結點指標置空

return l;

}

1.按序號查詢結點

從第乙個結點,順指標next域逐個往下搜尋,直到找到第i個結點為止,否則返回最後乙個結點指標域null。

【例子7】

lnode * getelem(linklist l,int i)

return p; //返回第i個結點的指標,如果i大於表長,直接返回p即可

}

2.按值查詢結點

從單鏈表第乙個結點開始,依次比較表中各結點資料域的值,若某結點資料域的值等於給定值e,則返回該結點的指標;反之,則返回null。

【例子8】

lnode *locateelem(linklist l,elemtype e)
3.插入

插入操作是將值為x的新結點插入到單鏈表的第i個位置上。先檢查插入位置的合法性,然後找到待插入位置的前驅結點,即第i−1個結點,再在其後插入新結點。

演算法思路:

1.取指向插入位置的前驅結點的指標

① p=getelem(l,i-1);

2.令新結點s的指標域指向p的後繼結點

② s->next=p->next;

3.令結點p的指標域指向新插入的結點s

③ p->next=s;

4.刪除

刪除操作是將單鏈表的第i個結點刪除。先檢查刪除位置 的合法性,

然後查詢表中第i−1個結點,即被刪結點的前驅結點,再將其刪除。

演算法思路:

1.取指向刪除位置的前驅結點的指標 p=getelem(l,i-1);

2.取指向刪除位置的指標 q=p->next;

3.p指向結點的後繼指向被刪除結點的後繼 p->next=q->next

4.釋放刪除結點 free(q);

單鏈表,單個指標,單向火車

雙鏈表,雙指標,電梯

typedef struct dnodednode, *dlinklist;
1.插入

① s->next=p->next;

② p->next->prior=s;

③ s->prior=p;

④ p->next=s;

2.刪除

① p->next=q->next;

② q->next->prior=p;

③ free(q);

迴圈鍊錶

最後乙個結點的指標不是null,而是頭結點,為環

是否為空,front = head

不設頭指標而設定尾指標,效率更高

迴圈雙鏈表

當迴圈雙鏈表為空表時,其頭結點的prior域和next域都等於head

靜態鍊錶是用陣列來描述線性表的鏈式儲存結構

靜態鍊錶仍然包含資料域和指標域(陣列下標),又稱游標。

鍊錶最後乙個元素的指標域值為-1。

#define maxsize 50 //靜態鍊錶的最大長度

typedef int elemtype //靜態鍊錶的資料型別假定為int

typedef struct slinklist[maxsize];

插入和刪除與動態鍊錶相同,只需要修改指標,不需要移動元素

1.順序表的儲存空間是預先分配的,易造成空間浪費或溢位;

鍊錶不預先分配,沒有限制

2.儲存密度上,鍊錶設定指標域和資料域,是不經濟的

為此,線性表長度變化不大易於確定大小,為節省儲存空間,應採取順序表

1.訪問效率,順序表隨機訪問效率更高,而鏈式訪問需遍歷

為此,取值操作,應用順序儲存表

2.插入和刪除,對於鍊錶而言,無需移動大量元素,只修改指標,就行

為此,頻繁刪除和插入,用鍊錶儲存

資料結構課程學習(3)

只允許一端進行插入或刪除的線性表 棧頂,允許進行插入和刪除 棧底,固定不變 按照先進後出的原則棧是線性表的特例,棧的順序儲存結構也叫順序棧 define maxsize 50 定義棧中元素的最大個數 typedef struct sqstack 順序棧的簡寫 注意 1.top值不能超過maxsize...

資料結構課程學習(4)

由二維陣列儲存矩陣 1.行有先 loc i,j loc 0,0 i h 1 j l 2.列有先 loc i,j loc 0,0 i h 1 j l 多個相同元素只分配乙個儲存空間,對零元素不分配儲存空間 對稱矩陣 n階方陣,a i,j a j,i i 1,j n 儲存到陣列b n n 1 2 中 儲...

資料結構 課程總體安排 2

day01 day02 資料結構基本概念 資料結構課程學習方法思路 資料結構概念 演算法基本概念和演算法的度量 鍊錶的設計與實現 順序儲存 seqlist 鏈式儲存 單向鍊錶linklist 迴圈鍊錶circlelist 雙向鍊錶dlinklist 棧seqstack 順序儲存 鏈式儲存 links...