基於C/C++語言資料結構之線性表(一)
資料結構的重要性:資料結構我感覺很重要,不僅僅是考試很重要,而且在以後程式設計師事業上都是尤為重要的,知乎上有網友評價資料結構是最重要的程式設計基本能力,沒有之一。我感覺這個說法很對,並且大家都知道,資料結構與演算法這種說法常常被大家使用,就是因為資料結構是演算法的基本前提,不懂資料結構,演算法肯定學的很毛糙,根本就沒有真正的高效可言,那也自然稱不上是演算法啦。所以大家要重視資料結構,雖然剛開始可能會不理解,從不理解到理解,才是真正的學習過程,如果你看一個會一個,你就根本就不用學習,因為已經是天才啦,這正如我們鍛鍊,鍛鍊的時候真正起作用的不是你輕輕鬆鬆完成幾個俯臥撐,跑了幾圈,而是你最累,最不想繼續運動的階段。總之學習也是欲速則不達吧,堅持學習,一定會從不理解到掌握。
線性表:
線性表安裝儲存結構分為:順序表和鏈式表
順序表在計算機中以陣列的形式儲存是指地址連續的儲存單元一次儲存資料元素的線性結構
線性表中所有元素的資料型別都是相同的
線性表中的元素具有邏輯上的順序性。
受儲存空間限制,線性表只能有限儲存。
線性表中所有元素的資料型別都是相同的。
在順序表中,元素都是一個挨一個儲存,元素都集中在一段區間內,相對儲存密度大
順序表在訪問元素時,可以通過表頭元素的地址和元素的編號(下標)在 \mathcal{O}(1)O(1) 時間內訪問到它。
順序表的建立:
#include <iostream> #include <cstring> class Vector { private: int size,length; int *data; public: Vector(int input_size) { size=input_size; length=0; data=new int [size]; } ~Vector() { delete[] data; } }; int main() { Vector a(100); return 0; }
c++中delete data和delete[ ] data的區別是什麼?
主要差別是 是否呼叫解構函式
delete data[] 會自動呼叫data陣列每個元素的解構函式
delete data則不會
delete data是清除data的記憶體單元,而delete[]data的記憶體單元。
data 為一個指標,而delete[] date中的data為一個指標陣列的首指標
using std::cout;using std::endl; 用法?說明
使用std名稱空間中的cout和endl。如果不這樣的話,每次使用cout和endl都要加上std::
例如:
std::cout<< "Hello World"<<std::endl;
用了名字空間 std 你也可以在入口函式前面 寫 using namespace std;來代替。而在後面 就只要直接用 cout 和endl;
C語言中system("pause")是什麼作用和意思?
system就是呼叫從程式中呼叫系統命令(和shell命令)。
system("pause")就是從程式裡呼叫“pause”命令;
而“pause”這個系統命令的功能很簡單,就是在命令列上輸出一行類似於
“Press any key to exit”
請按任意鍵繼續. . .
的字,等待使用者按一個鍵,然後返回。
插入:
刪除:
順序表構造、插入、擴容、查詢、刪除、遍歷:
#include <iostream>
#include <cstring>
using std::cout;
using std::endl;
class Vector {
private:
intsize, length;
int* data;
public:
Vector(intinput_size) {//建構函式
cout<<"呼叫了建構函式"<<endl;
size= input_size;
length= 0;
data= new int[size];
}
~Vector(){//解構函式
cout<<"呼叫了解構函式"<<endl;
delete[]data;
}
boolinsert(int loc, int value) {//插入元素
cout<<"呼叫了插入元素函式"<<endl;
if(loc < 0 || loc > length) {
returnfalse;
}
if(length >= size) {
returnfalse;
}
for(int i = length; i > loc; --i) {
data[i]= data[i - 1];
}
data[loc]= value;
length++;
returntrue;
}
intsearch(int value) {//查詢元素
cout<<"呼叫了查詢元素函式"<<endl;
for(int i = 0; i < length; ++i) {
if(data[i] == value) {
returni;
}
}
return-1;
}
boolremove(int index) {//刪除元素
cout<<"呼叫了刪除元素函式"<<endl;
if(index < 0 || index >= length) {
returnfalse;
}
for(int i = index + 1; i < length; ++i) {
data[i- 1] = data[i];
}
length= length - 1;
returntrue;
}
voidprint() {//列印元素
cout<<"呼叫了列印元素函式"<<endl;
for(inti=0; i<length; i++) {
if(i>0){
cout<<"";
}
cout<<data[i];
}
cout<<endl;
}
//請在下面實現擴容方法expand
voidexpand() {//擴容函式
cout<<"呼叫了擴容函式"<<endl;
int* old_data=data;
size=size*2;
data=newint[size];
for(inti=0; i<length; ++i) {
data[i]=old_data[i];
}
delete[]old_data;
}
};
int main() {
Vectora(2);
cout<< a.insert(0, 1) << endl;
cout<< a.insert(0, 2) << endl;
a.print();
cout<< a.remove(1) << endl;
a.print();
cout<< a.search(0) << endl;
cout<< a.search(1) << endl;
a.expand();
return0;
system("pause");//如果在返回值之前執行此句,則不能正常執行解構函式,釋放空間
}
例題:迴圈左移或右移
要求:在前面的課程中,我們學習了順序表的構造、插入、擴容、查詢、刪除、遍歷這 6 種操作。然而並不滿足於實現這些基本的操作,於是蒜頭君想到了一種新的操作:迴圈左移。
對於順序表 L=(a_0,a_1, ..., a_{n-1})L=(a0,a1,...,an−1),迴圈左移 kk 位意味著將順序表變為 L^k=(a_k, a_{k+1}, ..., a_{n-1}, a_0, a_1, ...,a_{k-1})Lk=(ak,ak+1,...,an−1,a0,a1,...,ak−1)。
比如:長度為 88 的順序表 (1, 2, 3, 4, 5, 6, 7,8)(1,2,3,4,5,6,7,8),迴圈左移 33 位後的結果為 (4, 5, 6, 7, 8, 1, 2, 3)(4,5,6,7,8,1,2,3)。
輸入格式
第一行輸入兩個整數 n(1\leq n \leq 100)n(1≤n≤100) 和 k(0 \leq k \leq n)k(0≤k≤n),分別表示順序表的元素個數和迴圈左移的位移量。
第二行一共 nn 個整數 a_i(0 \leq a_i \leq10000)ai(0≤ai≤10000),表示順序表中元素的值。
輸出格式
輸出只有一行,輸出 nn 個整數,順序輸出迴圈左移後順序表中每個元素的值,每個元素之間用一個空格分隔。行末不要有多餘空格。
樣例輸入
8 3
1 2 3 4 5 6 7 8
樣例輸出
4 5 6 7 8 1 2 3
程式碼:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
class ver{
private:
int length,size;
int * data;
public:
ver(int input){
size=input;
length=0;
data=new int[size];
}
~ver(){
delete[] data;
}
void expand()
{
int * old_data=data;
size=size*2;
data=new int[size];
for(int i=0;i<length;i++)
{
data[i]=old_data[i];
}
}
int insert(int n)
{
for(int i=0;i<n;i++)
{
cin>>data[i];
}
}
void print(int n)
{
for(int i=0;i<n;i++)
{
if(i>0){
cout<<" ";
}
cout<<data[i];
}
}
void RigntMove(int n,int k)
{
int temp;
for(int j=0;j<k;j++)
{
temp=data[n-1];
for(int i=n-1;i>=1;i--)
{
data[i]=data[i-1];
}
data[0]=temp;
}
}
void LeftMove(int n,int k)
{
int temp;
for(int j=0;j<k;j++)
{
temp=data[0];
for(int i=1;i<n;i++)
{
data[i-1]=data[i];
}
data[n-1]=temp;
}
}
};
int main()
{
int n,k;
cin>>n;
cin>>k;
ver a(n);
a.insert(n);
a.LeftMove(n,k);
a.print(n);
return 0;
}
版權說明
著作權歸作者所有©。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
本文作者:Joe.Smith
來源:CSDN
更多內容:關於visual studio 2010 直接複製貼上會出現亂碼的解決方法
編譯執行環境:dev-c++