生活随笔
收集整理的這篇文章主要介紹了
数据结构常用常考经典习题【按十大专题总结】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下都是小旭大一下學期在家上網課的時候,根據教授所出的試題,一份份手寫搞成圖片粘進word里面的,現在免費做一個小匯總,主要涵蓋了一些簡單的介紹和10次線下作業及2次思維訓練,涵蓋了幾乎所有的經典習題類型,方便大家借鑒交流~
下面小旭先簡單地介紹下數據結構的定義、研究對象和意義
一、定義: 數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。
二、研究對象:
1.數據的邏輯結構: 指反映數據元素之間的邏輯關系的數據結構,其中的邏輯關系是指數據元素之間的前后件關系,而與他們在計算機中的存儲位置無關。
邏輯結構包括: 集合結構(數據結構中的元素之間除了"同屬一個集合" 的相互關系外,別無其他關系) 線性結構(數據結構中的元素存在一對一的相互關系) 樹形結構(數據結構中的元素存在一對多的相互關系)
圖形結構(數據結構中的元素存在多對多的相互關系)
2.數據的物理結構: 指數據的邏輯結構在計算機存儲空間的存放形式。
數據的物理結構: 數據結構在計算機存儲器中的具體實現,是邏輯結構的表示(又稱存儲映像),它包括數據元素的機內表示和關系的機內表示。由于具體實現的方法有順序、鏈接、索引、散列等多種,所以,一種數據結構可表示成一種或多種存儲結構。
數據元素的機內表示(映像方法): 用二進制位(bit)的位串表示數據元素。通常稱這種位串為節點(node)。當數據元素有若干個數據項組成時,位串中與各數據項對應的子位串稱為數據域(data
field)。因此,節點是數據元素的機內表示(或機內映像)。
關系的機內表示(映像方法): 數據元素之間的關系的機內表示可以分為順序映像和非順序映像,常用兩種存儲結構:順序存儲結構和鏈式存儲結構。順序映像借助元素在存儲器中的相對位置來表示數據元素之間的邏輯關系;非順序映像借助指示元素存儲位置的指針(pointer)來表示數據元素之間的邏輯關系。
3.數據結構的運算(這里就不一一贅述啦)
三、意義:
現在終于可以切入主題內容啦!
第一次線下作業【數據及其結構】
【簡單定義、數據的兩種存儲方式、ADT三元組、二分歸并排序的公式推導及復雜度求解】
typedef int Status
;
typedef int ElemType
;
typedef ElemType
*Triplet
;
Status
InitTriplet(Triplet
&T
,ElemType v1
,ElemType v2
,ElemType v3
){ T
=(ElemType
*)malloc(3 *sizeof(ElemType
)); if(!T
) exit(OVERFLOW
); T
[0]=v1
; T
[1]=v2
; T
[2]=v3
; return OK
;
}
第二次線下作業【表】
【順序表的插入刪除平均移動元素次數、單循環鏈表刪除節點的操作、各表的存儲方式】
第三次線下作業【堆棧】
【已知進棧順序求出棧順序、定義順序棧的數據類型】
SqStack
*s
(s
->top
)-(s
->base
)
s
->top
(s
->top
)++
1
第四次線下作業【隊列】
【循環隊列的優點及判空滿、單循環鏈表表示鏈隊時頭尾指針出入隊的操作時間、定義順序隊列的代碼補充】
第五次線下作業【字符串】
【求串的next函數值、判斷字符串是否對稱】
第六次線下作業【矩陣&廣義表】
【求矩陣的向量copt值、求廣義表深度&長度&表頭表尾、用head()&tail()函數取出LS中原子的運算命令組合】
第七次線下作業【樹】
【求葉子節點、畫二叉樹、畫哈夫曼樹、求二叉樹的遍歷順序】
第八次線下作業【圖】
【連通圖、無向圖、連通分量、最小生成樹(Prim和Krucskal算法)】
第九次線下作業【散列/哈希】
【求二叉排序樹、求散列(在等概率下)的平均查找長度】
第十次線下作業【排序】
【希爾排序、快速排序、堆排序、二路歸并排序、置換選擇排序】
第一次思維訓練【合并新聞列表】
第二次思維訓練【合并有序線性表】
流程圖:
代碼:
#include <bits/stdc++.h>
#include <malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define null 0
using namespace std
;
int i
,j
,k
,n
,m
,t
,status
,a
[10000],b
[10000];typedef struct {int *elem
,length
,size
;
}SqList
; int ListLength(SqList SL
) {if(SL
.elem
!=null
) return SL
.length
;else return 0;
}void GetElem(SqList SL
,int i
,int &e
) {if(i
<0||i
>ListLength(SL
)) return ;e
=SL
.elem
[i
-1];
}int InitList(SqList
&SL
) {SL
.elem
=(int *)malloc(LIST_INIT_SIZE
*sizeof(int));if(SL
.elem
==null
) return 0;SL
.length
=0;SL
.size
=LIST_INIT_SIZE
;return 1;
}
int ListInsert(SqList
&SL
,int i
,int e
) {int *newbase
,*p
,*q
; int len
=ListLength(SL
);if(i
<1||i
>len
+1) return 0;if(SL
.length
>=SL
.size
){newbase
=(int *)realloc(SL
.elem
,(SL
.size
+LISTINCREMENT
)*sizeof(int)); if(newbase
==null
) return 0;SL
.elem
=newbase
;}p
=&SL
.elem
[i
-1];q
=&SL
.elem
[len
-1];for(;q
>=p
;q
--) *(q
+1)=*q
;*p
=e
; SL
.length
++;
} void Merg(SqList La
,SqList Lb
,SqList
&Lc
) {InitList(Lc
); i
=j
=1; k
=0;La
.length
= ListLength(La
);Lb
.length
= ListLength(Lb
); while((i
<=La
.length
)&&(j
<=Lb
.length
)){GetElem(La
,i
,a
[i
]);GetElem(Lb
,j
,b
[j
]);if(a
[i
]<=b
[j
]) {ListInsert(Lc
,++k
,a
[i
]); ++i
;}else {ListInsert(Lc
,++k
,b
[j
]); ++j
;} }while(i
<=La
.length
) {GetElem(La
,i
,a
[i
]); ListInsert(Lc
,++k
,a
[i
]);i
++;}while(j
<=Lb
.length
) {GetElem(Lb
,j
,b
[j
])A
; ListInsert(Lc
,++k
,b
[j
]);j
++;}
}void traverse(SqList SL
) {for(i
=0; i
<SL
.length
; i
++)cout
<<SL
.elem
[i
]<<" ";
}int main()
{SqList La
,Lb
,Lc
;status
=InitList(La
);if(status
==0)cout
<<"SqList Init failed!";status
=InitList(Lb
);if(status
==0)cout
<<"SqList Init failed!";status
=InitList(Lc
);if(status
==0)cout
<<"SqList Init failed!"; cin
>>m
>>n
;for(i
=1; i
<=m
; i
++) {cin
>>t
;ListInsert(La
,i
,t
);}for(i
=1; i
<=n
; i
++) {cin
>>t
;ListInsert(Lb
,i
,t
);}traverse(La
);cout
<<endl
;traverse(Lb
);Merg(La
,Lb
,Lc
);traverse(Lc
);return 0;
}
運行結果:
【大家在掌握理論知識之后,可以結合下方鏈接的文章鞏固應用所學的知識,進入實戰演練,明確不同篇章的具體要求,在自己的編碼能力上更上一個層次 😃】
手把手教你寫數據結構八大實驗報告
總結
以上是生活随笔為你收集整理的数据结构常用常考经典习题【按十大专题总结】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。