#include <iostream>
#include <string>
using namespace std;
typedef struct Lnode
{
int date;
Lnode *next;
}Lnode,*Linklist;
class link
{
public:
link();//创建一个带头结点的空表
bool empty();//判断是否为空
void display();//输出链表
void input();//头插
void findend(Lnode * &p);//定位指向最后一个节点的指针
Lnode* & locate(int pos);//返回链表内元素,引用接受否则无效
Lnode* locate1(int pos);//返回指向某节点的指针(非链表内元素)
void input1();//尾插
void insert(int pos,int date);//插入操作操作链表内指向第j个位置的指针,非法输入插尾部
void insert1(int pos, int date);//插入操作利用指针操作第j-1个节点,非法输入插尾部
void back_insert(Lnode* p, int date);//指定节点后插
void front_insert(Lnode* p, int date);//指定节点前插
void delte(int pos);//删除元素
int find_elem(int elem);
void delte(Lnode* p);//删除元素不能删尾节点
void Lnode_inv();//逆置,直接修改指针
void Lnode_inv1();//逆置插一个删一个
private:
Linklist L;
};
link::link()
{
this->L = new Lnode;
this->L->next = NULL;
}
void link::delte(Lnode* p)
{
if (p->next != NULL)
{
Lnode* ptr = p->next;
p->date = ptr->date;
p->next = ptr->next;
delete ptr;
}
}
bool link::empty()
{
return this->L->next == NULL;
}
void link::display()
{
Lnode* ptr = this->L->next;
int ord = 1;
while (ptr != NULL)
{
cout << ord << ": " <<ptr->date << endl;
ord += 1;
ptr = ptr->next;
}
}
void link::input()
{
Lnode* ptr = new Lnode;
string input;
getline(cin, input);
while (1)
{
try
{
ptr->date = stoi(input);
ptr -> next = this->L->next;
this->L->next = ptr;
ptr= new Lnode;
getline(cin, input);
}
catch (...)
{
break;
}
}
}
void link::findend(Lnode*& p)
{
p = L;
while (p->next != NULL)
{
p = p->next;
}
}
void link::back_insert(Lnode* p, int date)
{
Lnode* pnew = new Lnode;
pnew->date = date;
pnew->next = p->next;
p->next = pnew;
}
//尾插
void link::input1()
{
Lnode* pend;
findend(pend);
string input;
getline(cin, input);
while (1)
{
try
{
back_insert(pend, stoi(input));
pend = pend->next;
getline(cin, input);
}
catch (...)
{
break;
}
}
}
Lnode* link::locate1(int pos)
{
Lnode* p = L;
int ord = 0;
while (p->next != NULL && ord < pos)
{
p = p->next;
ord += 1;
}
return p;
}
Lnode* & link::locate(int pos)
{
Lnode* p = L;
int ord = 0;
while (p->next!= NULL && ord < pos-1 )
{
p = p->next;
ord += 1;
}
return p->next;
}
void link::insert(int pos, int date)
{
Lnode* & p=locate(pos);
Lnode* pnew = new Lnode;
pnew->next = p;
pnew->date = date;
p = pnew;
}
void link::insert1(int pos, int date)
{
Lnode* p=locate1( pos-1);
back_insert(p, date);
}
void link::delte(int pos)
{
Lnode* p=locate1(pos-1);
if (p->next != NULL)
{
Lnode* q = p->next;
p->next = q->next;
delete q;
}
}
int link::find_elem(int elem)
{
int ord = 1;
Lnode* p = L->next;
while (p != NULL)
{
if (p->date == elem)
{
return ord;
}
ord += 1;
p = p->next;
}
return 0;
}
void link::front_insert(Lnode* p, int date)
{
Lnode* pnew = new Lnode;
pnew->date = p->date;
pnew->next = p->next;
p->date = date;
p->next = pnew;
}
void link::Lnode_inv()
{
Lnode* p = L->next;
if (p != NULL)
{
Lnode* q = p->next;
while (q != NULL)
{
p->next = q->next;
q->next = L->next;
L->next = q;
q = p->next;
}
}
}
void link::Lnode_inv1()
{
Lnode* p = L->next;
if (p != NULL)
{
Lnode* q = p->next;
while (q != NULL)
{
back_insert(L, q->date);
p->next = q->next;
delete q;
q = p->next;
}
}
}