数据结构(04)— 线性顺序表实战
1. 設計思路
本實戰的實質是完成對學生成績信息的建立、查找、插入、修改、刪除等功能,可以首先定義項目的數據結構,然后將每個功能寫成一個函數來完成對數據的操作,最后完成主函數以驗證各個函數功能并得出運行結果。
2. 數據結構
本項目的數據是一組學生的成績信息,每條學生的成績信息由學號、姓名和成績組成,這組學生的成績信息具有相同特性,屬于同一數據對象,相鄰數據元素之間存在序偶關系。由此可以看出,這些數據具有線性表中數據元素的性質,所以該系統的數據采用線性表來存儲。
?
順序表是線性表的順序存儲結構,是指用一組連續的內存單元依次存放線性表的數據元素。在順序存儲結構下,邏輯關系相鄰的兩個元素在物理位置上也相鄰,這是順序表的特點。本項目可以采用順序表的線性表順序存儲結構。
?
若一個數據元素僅占一個存儲單元,則其存儲方式參見下圖。
?
從圖中可見,第 i個數據元素的地址為
Loc(ai)=loc(a1)+(i-1)
假設線性表中每個元素占用 k個存儲單元,那么在順序表中,線性表的第 i個元素的存儲位置與第 1 個元素的存儲位置的關系是
Loc(ai)=loc(a1)+(i-1)*k
這里 Loc(ai)是第 i個元素的存儲位置,loc(a1)是第 1 個元素的存儲位置,也稱為線性表的基址。顯然,順序表便于進行隨機訪問,故線性表的順序存儲結構是一種隨機存儲結構。
?
順序表適宜于做查找這樣的靜態操作;順序存儲的優點是存儲密度大,存儲空間利用率高。缺點是插入或刪除元素時不方便。
用結構體類型定義每個學生數據,故該數組中的每個數據的結構可描述為:
typedef struct StudentTag
{std::string id;std::string name;int age;float score;
}Student;
3. 程序清單
project.h文件:
#include <iostream>
#include <string>typedef struct StudentTag
{std::string id;std::string name;int age;float score;// 結構體初始化StudentTag(std::string i="", std::string n="", int a=0, float s=0.0) {id = i;name = n;age = a;score = s;}
}Student;class LinearList
{
public:LinearList(int size);~LinearList();void init_list();void clear_list();bool is_empty();bool is_full();int print_list();int get_list_length();int get_element(int i, Student &data);int insert_element(int i, Student data);int delete_element(int i, Student &data);int update_element(int i, Student data);private:Student *stu;int length;int cap;
};
project.cpp
#include "project.h"LinearList::LinearList(int size)
{stu = new Student[size];if(stu == NULL){std::cout << " new error" << std::endl;}length = 0;cap = size;std::cout << "constructor done" << std::endl;
}LinearList::~LinearList()
{if(stu != NULL){delete[] stu;stu = NULL;length = 0;cap = 0;}std::cout << "destructor done" << std::endl;
}void LinearList::init_list()
{std::cout << "init_list start" << std::endl;stu->id = "00001";stu->name = "Tom";stu->age = 18;stu->score = 99.5;(stu+1)->id = "00002";(stu+1)->name = "Jack";(stu+1)->age = 19;(stu+1)->score = 98;length += 2;std::cout << "init_list done" << std::endl;
}void LinearList::clear_list()
{std::cout << "clear_list start" << std::endl;for(int i=0; i<length; ++i){(stu+i)->id = "";(stu+i)->name = "";(stu+i)->age = 0;(stu+i)->score = 0;}length = 0;cap = 0;std::cout << "clear_list done" << std::endl;
}bool LinearList::is_empty()
{return length == 0 ? true : false;
}bool LinearList::is_full()
{return length == cap && length != 0 ? true : false;
}int LinearList::print_list()
{for(int i=0; i<length; ++i){std::cout << "id:" << (stu+i)->id << " "<< "name:" << (stu+i)->name << " "<< "age:" << (stu+i)->age << " "<< "score:" << (stu+i)->score << " "<< std::endl;}return 0;
}int LinearList::get_list_length()
{return length;
}int LinearList::get_element(int i, Student &data)
{if(i < 1 || i > length){std::cout << "i is not in (1, " << length << ")" << std::endl;return -1;}data = *(stu + i - 1);return 0;
}int LinearList::insert_element(int i, Student data)
{if(i < 1 || i > cap){std::cout << "i is not in (1, " << cap << ")" << std::endl;return -1;}// 要插入的元素在原始線性表最后一個元素之后if(i >= length){*(stu + length) = data; }else // 要插入的元素在原始線性表第一個元素和最后一個元素之間{for(int j=length; j>=i; --j){*(stu + j + 1) = *(stu + j);}*(stu + i) = data;}length += 1;return 0;
}int LinearList::delete_element(int i, Student &data)
{if(is_empty() || (i < 1 || i > length)){return -1;}data = *(stu + i - 1);for(int j=i; j<length; ++j){*(stu + j - 1 ) = *(stu + j);}length -= 1;return 0;
}int LinearList::update_element(int i, Student data)
{if(i < 1 || i >= length){std::cout << "i is not in (1, " << length << ")" << std::endl;return -1;}*(stu + i - 1) = data;return 0;
}
main.cpp
#include "project.cpp"int main()
{LinearList L(10);L.init_list();L.print_list();// L.clear_list();// L.print_list();bool is_empty = L.is_empty();std::cout << "is_empty: " << is_empty << std::endl; bool is_full = L.is_full();std::cout << "is_full: " << is_full << std::endl; std::cout << "length: " << L.get_list_length() << std::endl; Student s;L.get_element(2, s);std::cout << "第 2 個元素為 " << "id:" << s.id << " "<< "name:" << s.name << " "<< "age:" << s.age << " "<< "score:" << s.score << " "<< std::endl;Student si("00003", "wohu", 18, 97);L.insert_element(2, si);std::cout << "插入元素之后的結果" << std::endl;L.print_list();Student sd;L.delete_element(1, sd);std::cout << "要刪除的元素為 " << "id:" << sd.id << " "<< "name:" << sd.name << " "<< "age:" << sd.age << " "<< "score:" << sd.score << " "<< std::endl;std::cout << "刪除元素之后的結果" << std::endl;L.print_list();Student su("00004", "kuku", 20, 94);std::cout << "要更改的元素為 " << "id:" << su.id << " "<< "name:" << su.name << " "<< "age:" << su.age << " "<< "score:" << su.score << " "<< std::endl;L.update_element(1, su);std::cout << "更新元素之后的結果" << std::endl;L.print_list();
}
總結
以上是生活随笔為你收集整理的数据结构(04)— 线性顺序表实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国聚合物气体分离膜
- 下一篇: 2022-2028年中国橡胶板的制造行业