数据结构之线性表

关于数据结构的文字性描述同学们可以去看书,在这里我不再赘述,直接上代码,大家有需要的可以从其中得到一些思路和具体实现方法。
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;
}

本人系大一非科班菜鸟,水平有限,如果错误欢迎评论区指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值