線性表是具有相同資料型別的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...