#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;
}
数据结构4-静态链表
最新推荐文章于 2024-07-24 19:35:30 发布