关于数据结构的文字性描述同学们可以去看书,在这里我不再赘述,直接上代码,大家有需要的可以从其中得到一些思路和具体实现方法。
1、用结构体实现
下述代码均在VS2017上编译通过。
#include "pch.h"
#include <iostream>
#include<string>
#include<stdlib.h>
using namespace std;
struct Data
{
string name;
string ID;
int grade;
};
struct Ranked_list
{
Data *data;
int maxlen;
int length;
};
void init(Ranked_list *,int);
bool isempty(Ranked_list *);
bool is_full(Ranked_list *);
void add_list(Ranked_list *,Data);
void insert(Ranked_list *, Data, int);
void delete_(Ranked_list *,int);
void get_length(Ranked_list *);
Data* find_bynum(Ranked_list *, int);
Data* find_bycont(Ranked_list *, string);
void display(Ranked_list *);
int main()
{
Ranked_list list;
Data *data;
Data data1 = { "张三", "2018212114", 100 };
Data data2 = { "李四", "2019212110", 60 };
Data data3 = { "王五", "2017212103", 87 };
Data data4 = { "元芳", "2019212119", 99 };
Data data5 = { "人杰", "2018212100", 100 };
init(&list,10);
add_list(&list, data1);
add_list(&list, data2);
add_list(&list, data3);
add_list(&list, data4);
cout << "输出初始化数据:" << endl;
display(&list);
insert(&list, data5, 1);
cout << "输出插入后的数据:" << endl;
display(&list);
cout << endl;
data=find_bynum(&list, 2);
cout << "输出查找数据:" << endl;
cout << (*data).name << "\t" << (*data).ID << "\t" << (*data).grade << endl;
data=find_bycont(&list, "2019212119");
cout << endl;
cout << (*data).name << "\t" << (*data).ID << "\t" << (*data).grade << endl;
delete_(&list, 3);
cout << "输出删除数据结点后的数据:" << endl;
display(&list);
delete []data;
return 0;
}
void init(Ranked_list *ptr,int leng)
{
ptr->data = new Data[leng+1];
if (ptr->data == NULL)
exit(-1);
ptr->maxlen = leng;
ptr->length = 0;
}
bool isempty(Ranked_list *ptr)
{
if (ptr->length == 0)
return true;
return false;
}
bool is_full(Ranked_list *ptr)
{
if (ptr->length == ptr->maxlen)
return true;
return false;
}
void add_list(Ranked_list *ptr, Data dat)
{
if (is_full(ptr))
{
cout << "链表已满,不能再添加数据!" << endl;
return;
}
int leng = ptr->length;
ptr->data[leng+1] = dat;
ptr->length++;
}
void insert(Ranked_list *ptr, Data dat, int n)
{
if (is_full(ptr))
{
cout << "链表已满,不能再添加数据!" << endl;
return;
}
if (n<1 || n>ptr->length)
return;
int i;
for (i = ptr->length; i >= n; i--)
{
ptr->data[i + 1] = ptr->data[i];
}
ptr->data[n] = dat;
ptr->length++;
}
void delete_(Ranked_list *ptr, int n)
{
if (is_full(ptr))
{
cout << "链表已满,不能再添加数据!" << endl;
return;
}
if (n<1 || n>ptr->length)
return;
int i;
for (i = n + 1; i <= ptr->length; i++)
{
ptr->data[i - 1] = ptr->data[i];
}
ptr->length--;
}
void get_length(Ranked_list *ptr)
{
cout << "顺序表长度为:" << ptr->length << endl;
}
Data *find_bynum(Ranked_list *ptr, int n)
{
if (n<1 || n>ptr->length)
return NULL;
return (&ptr->data[n]);
}
Data *find_bycont(Ranked_list *ptr, string id)
{
for (int i = 1; i <= ptr->length; i++)
{
if (id == ptr->data[i].ID)
return(&ptr->data[i]);
}
return NULL;
}
void display(Ranked_list *ptr)
{
if (isempty(ptr))
return;
for (int i = 1; i <= ptr->length; i++)
{
cout << ptr->data[i].name << "\t" << ptr->data[i].ID << "\t" << ptr->data[i].grade << endl;
}
}
2、用类实现
#include "pch.h"
#include <iostream>
#include<string>
using namespace std;
const int maxlen = 20;//线性表最大长度
class Data
{
public:
string name;
string ID;
int grade;
public:
friend class Ranked_list;
Data() { name = '0'; ID = '0'; grade = 0; }
Data(string na, string id, int gra);
// Data&operator = (const Data &d);
friend ostream& operator<<(ostream &out, const Data &d)
{
out << d.name << "\t" << d.ID << "\t" << d.grade << endl;
return out;
}
};
class Ranked_list
{
private:
Data Listdata[maxlen+1] ;//线性表所保存的数据
static int length;//线性表已保存结点的数量
public:
Ranked_list() {}
bool is_empty(Ranked_list *ptr);//判断是否为空
bool is_full(Ranked_list *ptr);//判断是否为满
bool add_list(Ranked_list *ptr, Data data);//末尾追加结点
bool insert(Ranked_list *ptr, Data data, int n);//插入结点
bool delete_(Ranked_list *ptr, int n);//删除结点
int get_length(Ranked_list *ptr);//返回长度
Data *find_bynum(Ranked_list *ptr, int n);//根据序号返回数据元素
Data *find_bycont(Ranked_list *ptr, string Name);//根据关键字返回数据元素,此处将关键字设为姓名
void display(Ranked_list *ptr);//显示顺序表所有元素
};
int Ranked_list::length = 0;
Data::Data(string na, string id, int gra) :name(na), ID(id), grade(gra) {}
//Data& Data::operator = (const Data &d)
//{
// name = d.name; ID = d.ID; grade = d.grade;
// return *this;
//}
bool Ranked_list::is_empty(Ranked_list *ptr)
{
if (ptr->length == 0)
return true;
else
return false;
}
bool Ranked_list::is_full(Ranked_list *ptr)
{
if (ptr->length == maxlen)
return true;
else
return false;
}
bool Ranked_list::add_list(Ranked_list *ptr, Data data)
{
if (is_full(ptr))
return false;
int leng = ptr->length;
ptr->Listdata[leng+1] = data;
ptr->length++;
return true;
}
bool Ranked_list::insert(Ranked_list *ptr, Data data,int n)
{
if (is_full(ptr))
return false;
if (n<1 || n>length)
return false;
int i;
int leng = ptr->length;
for (i = leng; i >= n; i--)
ptr->Listdata[i + 1] = ptr->Listdata[i];
ptr->Listdata[n] = data;
ptr->length++;
return true;
}
bool Ranked_list::delete_(Ranked_list *ptr, int n)
{
if (is_empty(ptr))
return false;
int i;
int leng = ptr->length;
if(n<1 || n>leng)
return false;
for (i = n; i < leng; i++)
ptr->Listdata[i] = ptr->Listdata[i + 1];
ptr->length--;
return true;
}
int Ranked_list::get_length(Ranked_list *ptr)
{
return ptr->length;
}
void Ranked_list::display(Ranked_list *ptr)
{
int i;
for (i = 1; i <=ptr->length; i++)
{
cout << ptr->Listdata[i].name << "\t" << ptr->Listdata[i].ID << "\t" << ptr->Listdata[i].grade<< endl;
}
}
Data* Ranked_list::find_bynum(Ranked_list *ptr, int n)
{
if (n<1 || n>ptr->length)
return NULL;
return (&ptr->Listdata[n]);
}
Data* Ranked_list::find_bycont(Ranked_list *ptr, string Name)
{
int i;
for (i = 1; i <= ptr->length; i++)
{
if (ptr->Listdata[i].name == Name)
return (&ptr->Listdata[i]);
}
return NULL;
}
int main()
{
Ranked_list arr;
Data *data;
Data data1("张三", "2018212114", 100);
Data data2("叶媛", "2018212134", 80);
Data data3("陈方", "2018212110", 90);
Data data4("李四", "2018212079", 60);
Data data5("王五", "2018212070", 66);
arr.add_list(&arr,data1);
arr.add_list(&arr, data2);
arr.add_list(&arr, data3);
arr.add_list(&arr, data4);
arr.insert(&arr, data5, 1);
cout << "顺序表中数据结点个数为:" << arr.get_length(&arr) << endl;
arr.display(&arr);
cout <<"经过关键词查找后:"<< endl;
data = arr.find_bycont(&arr, "张三");
cout << *data;
cout << "经过序号查找后:" << endl;
data = arr.find_bynum(&arr, 3);
/*cout << (*data).name << "\t" << (*data).ID << "\t" << data->grade << endl;*/
cout << *data;
arr.delete_(&arr,3);
cout << "顺序表中数据结点个数为:" << arr.get_length(&arr) << endl;
arr.display(&arr);
return 0;
}
本人系大一非科班菜鸟,水平有限,如果错误欢迎评论区指正。