数据结构4-静态链表

#include <iostream>
using namespace std;

/*实现静态链表的无参构造,有参构造,析构,
插入,删除,求表长,按位查找,按值查找,
判空,遍历,菜单操作*/
const int MAXSIZE = 100;
struct People
{
	int id;
	string name;
	int age;
};
template <class Element>
struct SNode
{
	Element data;
	int next;

};
template <class Element>
class StaList
{
public:
	StaList();
	StaList(Element a[], int n);
	~StaList();
	void insert(Element x, int i);
	Element remove(int i);
	int getLength();
	Element getElement(int i);
	int getLocate(Element x);
	bool ifEmpty();
	void printList();
	void menu();
private:
	SNode<Element> sList[MAXSIZE];
	int head;
	int avail;
};

template <class Element>
StaList<Element>::StaList()
{
	head = 0;
	sList[head].next = -1;
	avail = 1;
	for (int i = 0; i < MAXSIZE - 2; i++)
	{
		sList[i + 1].next = i + 2;
	}
	sList[MAXSIZE - 1].next = -1;

}
template <class Element>
StaList<Element>::StaList(Element a[], int n)
{
	head = 0;
	avail = 1;
	sList[head].next = 1;
	
	for (int i = 0; i < MAXSIZE - 2; i++)
	{
		sList[i + 1].next = i + 2;
	}
	sList[MAXSIZE - 1].next = -1;
	if (n > MAXSIZE-1)throw "溢出";
	for (int i = 0; i < n; i++)
	{
		sList[avail].data.id = a[i].id;
		sList[avail].data.name = a[i].name;
		sList[avail].data.age = a[i].age;

		avail = sList[avail].next;
	}
	sList[n].next = -1;
}
template <class Element>
StaList<Element>::~StaList() {}
template <class Element>
void StaList<Element>::insert(Element x, int i)
{
	int p = 1;
	int count = 1;
	while (sList[p].next != -1 && count < i - 1)
	{
		p = sList[p].next;
		count++;
	}
	if (sList[p].next == -1) throw"插入位置异常";
	if (avail == -1)throw "溢出";
	else {
		int s = avail;
		sList[s].data = x;
		avail = sList[avail].next;
		sList[s].next = sList[p].next;
		sList[p].next = s;
	}
}
template <class Element>
Element StaList<Element>::remove(int i)
{
	int p = 1;
	int count = 1;
	while (sList[p].next != -1 && count < i - 1)
	{
		p = sList[p].next;
		count++;
	}//p指向待删元素的前一个
	if (sList[p].next == -1||p==-1) throw"删除位置异常";
	int q = sList[p].next;
	Element x = sList[q].data;
	sList[p].next = sList[q].next;
	sList[q].next = avail;
	avail = q;
	return x;

}
template <class Element>
int StaList<Element>::getLength()
{
	int p = 1;
	int count = 1;
	while (sList[p].next != -1)
	{
		count++;
		p = sList[p].next;
	}
	return count;

}
template <class Element>
Element StaList<Element>::getElement(int i)
{
	int p = 1;
	int count = 1;
	while (sList[p].next != -1 && count < i - 1)
	{
		p = sList[p].next;
		count++;
	}
	if (sList[p].next == -1) throw"查找位置异常";
	return sList[sList[p].next].data;

}
template <class Element>
int StaList<Element>::getLocate(Element x)
{
	int p = 1;
	int count = 1;
	while ((x.id != sList[p].data.id || x.name != sList[p].data.name || x.age != sList[p].data.age)&&sList[p].next == -1)
	{
		p = sList[p].next;
		count++;
	}
	if (sList[p].next == -1)
	{
		cout << "未找到该元素" << endl;
	}
	else return count;
}
template <class Element>
bool StaList<Element>::ifEmpty()
{
	if (sList[head].next == -1) return true;
	else return false;
}
template <class Element>
void StaList<Element>::printList()
{
	int p = 1;
	while (sList[p].next != -1)
	{
		cout << sList[p].data.id << " " << sList[p].data.name << " " << sList[p].data.age << " " << endl;
		p = sList[p].next;
	}
	cout << sList[p].data.id << " " << sList[p].data.name << " " << sList[p].data.age << " " << endl;

}
template <class Element>
void StaList<Element>::menu()
{
	
	int choice=0;
	int pId = 0;
	int pAge = 0;
	string pName;
	People p1 = { pId, pName, pAge };
	int pos = 0;

	/*实现静态链表的无参构造,有参构造,析构,
	插入,删除,求表长,按位查找,按值查找,
	判空,遍历,菜单操作*/

	cout <<"-----菜单-----"<< endl;
	cout <<"1.打印链表\t2.判断是否为空"<< endl;
	cout <<"3.插入元素\t4.删除元素"<< endl;
	cout <<"5.按值查找\t6.按位查找"<< endl;
	cout << "7.求表长\t8.其余功能敬请期待"<< endl;
	cout <<"请输入你要实现的操作:";
	cin >> choice;
	cout << endl;
	switch (choice)
	{
	case 1:
		printList();
		break;
	case 2:
		if (ifEmpty())
		{
			cout << "此表为空表" << endl;
		}
		else
		{
			cout << "此表非空" << endl;
		}
		break;
	case 3:
		pId=0; 
		pAge=0;
		pos=0;
		
		cout << "请输入你要插入的人物的id:";
		cin >> pId;
		cout << endl;
		cout << "请输入你要插入的人物的name:";
		cin >> pName;
		cout << endl;
		cout << "请输入你要插入的人物的age:";
		cin >> pAge;
		cout << endl;
		p1={ pId, pName, pAge };
		cout << "请输入你要插入的位置:";
		cin >> pos;
		cout << endl;
		insert(p1, pos);
		break;
	case 4:
		pos=0;
		cout << "请输入你要删除的元素序号:";
		cin >> pos;
		cout << endl;
		remove(pos);
		break;
	case 5:
		pId=0, pAge=0;
		
		cout << "请输入你要查找的人物id:";
		cin >> pId;
		cout << endl;
		cout << "请输入你要查找的人物name:";
		cin >> pName;
		cout << endl;
		cout << "请输入你要查找的人物age:";
		cin >> pAge;
		cout << endl;
		p1={ pId, pName, pAge };
		cout << "该人物在第 " << getLocate(p1) << " 位" << endl;
		break;
	case 6:
		pos=0;
		cout << "请输入你要查找的人物位置:";
		cin >> pos;
		cout << endl;
		cout<<"第 "<<pos<<" 位上的人物为:"<<getElement(pos).id<<" "<< getElement(pos).name<<" "<< getElement(pos).age;
		cout << endl;
		break;
	case 7:
		cout << "表长为:" << getLength() << endl;
		break;
	default:
		cout << "你输入的数字有误,请重新输入" << endl;
		break;
	}

}
int main()
{

	People p[3] = { {1,"Sam",18},{2,"Kevin",19},{3,"Ben",17} };
    StaList<People> l(p, 3);
	while (1)
	{
		l.menu();
	}

	


	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值