#include
#include
#include
using namespace std;
typedef class lnode {
public:
int serial;
int value;
string name;
class lnode* next;
}lnode, * linklist;
//初始化链表
bool initlist(linklist& L)
{
L = (lnode*)new lnode;//指向头结点
if (L == NULL)
return false;//内存不足,分配空间失败
(*L).next = NULL;//头节点为空
return true;
}
//在第i个节点插入(链表指针,链表序号,序号s,书名n,价格v)
bool listinsert(linklist& L, int i, int s, string n, int v)
{
if (i < 1)
return false;
lnode* p;//当前扫描到的节点指针
int j = 0;//p指向的是第几个节点
p = L;//指向头节点
while (p != NULL && j < i - 1)//使p指向插入节点的前一个节点
{
p = p->next;
j++;
}
if (p == NULL)
return false;
lnode* s1 = (lnode*)new lnode;
s1->serial = s;
s1->name = n;
s1->value = v;
s1->next = p->next;
p->next = s1;
return true;
}
//删除第i个节点
bool listdelete(linklist& L, int i)
{
if (i < 1)
return false;
lnode* p;//当前节点指针
int j = 0;
p = L;
while (p != NULL && j < i - 1)//使p指向i-1节点处
{
p = p->next;
j++;
}
if (p == NULL)
return false;
if (p->next == NULL)
return false;
lnode* q = p->next;
cout << "ceshi";
p->next = q->next;
delete q;
return true;
}
//菜单显示
void menu()
{
cout << "-------------------------------------------------------------------------" << endl;
cout << "请操作:" << endl;
cout << "1:初始化图书链表(从链表标号一插入)" << endl;
cout << "2:链表序号插入图书信息" << endl;
cout << "3:链表序号删除图书信息" << endl;
cout << "4:显示全部图书信息" << endl;
cout << "5:查找" << endl;
cout << "6:退出" << endl;
cout << "-------------------------------------------------------------------------" << endl;
}
void menu2()
{
cout << "-------------------------------------------------------------------------" << endl;
cout << "请操作:" << endl;
cout << "1:按链表位序查找" << endl;
cout << "2:按书名查找" << endl;
cout << "-------------------------------------------------------------------------" << endl;
}
void listInitialization(linklist& L)//第一次输入链表
{
int z;
cout << "你要输入几本书?" << endl;
cin >> z;
int a, b;
string c;
for (int i = 1; i <= z; i++)
{
cout << "请输入第" << i << "本书的信息,格式为:序号,书名,价格" << endl;
cin >> a >> c >> b;
listinsert(L, i, a, c, b);
}
cout << "操作完毕" << endl;
}
//选定一个节点,插入多本书
bool listinsertmany(linklist& L)//选定一个节点,插入多本书
{
int z,i;
cout << "你要输入几本书的信息?" << endl;
cin >> z;
if(z<1)
{
cout << "输入错误" << endl;
return false;
}
cout << "要插入到序号几?" << endl;
cin >> i;
int a, b;
string c;
for (int w=0; w< z;w++, i++)
{
cout << "请输入序号为" << i << "的书的信息,格式为:类别编号,书名,价格" << endl;
cin >> a >> c >> b;
if (listinsert(L, i, a, c, b))
cout << "序号为" << i << "的书的信息已成功输入" << endl;
else
cout << "超出链表范围" << endl;
}
cout << "操作完毕" << endl;
return true;
}
//按链表位序查找(链表指针,节点位序),返回要查找节点的指针(注意:会返回头结点)
lnode* get_elem_in_order(linklist L, int i)
{
if (i < 0)
return NULL;
lnode* p;
p = L;
int j = 0;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
return p;
}
//按书名查找(链表指针,书名)(注:如未找到,会返回NULL)
lnode* get_elem_by_name(linklist L, string e)
{
lnode* p = L->next;
while(p!=NULL&&p->name!=e)
{
p = p->next;
}
return p;
}
//显示全部图书(链表指针),返回值无意义
bool showall(linklist& L) {
lnode* p=L->next;//指针p指向节点1
cout << "------------------------------------------------------------------------" << endl;
cout << "序号" << setw(20) << "书名" << setw(20) << "价格" << endl;
for(;p!=NULL;p=p->next)
{
cout << p->serial << setw(20) << p->name << setw(20) << p->value<serial << setw(20) << p->name << setw(20) << p->value << endl;
return true;
}
int main()
{
linklist b;
lnode* p;
int a;
if (initlist(b))
cout << "链表初始化成功" << endl << endl;
else
cout << "链表初始化失败" << endl;
for (int e = 0; e == 0; e = e + 0)
{
menu();
int c; cin >> c;
switch (c)
{
case 1:listInitialization(b); break;
case 2:listinsertmany(b); break;
case 3:
{cout << "删除序号为几的图书?" << endl;
int d;//swwitch选择用数
cin >> d;
listdelete(b, d);
}; break;
case 4:showall(b); break;
case 5:
{menu2(); int h;cin >> h;
switch (h)
{
case 1: {int hr; cout << "要查找的书链表位序为" << endl; cin >> hr;show(get_elem_in_order(b, hr)); }; break;
case 2: {string hg; cout << "要查找的书的名字是" << endl; cin >> hg; show(get_elem_by_name(b, hg)); }; break;
}
} break;
case 6:e++; break;
default:cout << "请重新输入" << endl;
}
}
cout << "程序退出" << endl;
return 0;
}