感觉我是个不需要手机的人,更喜欢跟别人面对面的交流,手机只是获取对方坐标的工具。
#include<iostream>
#include<string>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE "-1" //infeasible 不可实行的
#define OVERFLOW -2
//Status是函数的原型,其值是函数结果状态代码
#define Status int //这里表明int可以有Status代替
#define Type string //方便更换数据类型
//代码简化。
#define ne(a,b) a->Link_next(b)
#define pe(a,b) a->Link_previous(b)
#define se(a,b) a->setdata(b)
class Node{//结点类
protected:
Type data; //结点数据
Node *next; //右指针
Node *previous;//左指针
public:
Node()
{
data=INFEASIBLE; //data=-1;
}
Status setdata(Type data_p) //给data赋值
{
data=data_p;
return OK;
}
Status Link_next(Node *p) //Node->next=p; 右指针指向后一个结点
{
next=p;
return OK;
}
Status Link_previous(Node *p) //Node->previous=p; //左指针指向前一个结点
{
previous=p;
return OK;
}
Node* Link_nextone() //返回右指针
{
return next;
}
Node* Link_previousone() //返回左指针
{
return previous;
}
Type getdata() //返回数据
{
return data;
}
};
class LinkedList{
protected:
Node *head;//链表开头
Node *tail;//链表结尾
Node *pNex;//链表正向赋值指针
Node *pS; //独立结点,用于建立中间结点后镶嵌进链表内
Node *pPre;//链表逆向复制指针
int size; //链表长度
public:
~LinkedList();
LinkedList();
Status display(); //正向输出
Status back_display(); //逆向输出
Status add(Type data_p); //正向赋值
Status back_add(Type data_p); //逆向赋值
Type getdata(int i); //链表返回某个结点的数据
Status Delete(int i); //删除某个结点
int getsize(); //返回链表长度
Status Insert(int i,Type data_p); //结点插入
};
LinkedList::~LinkedList(){delete pS;}
LinkedList::LinkedList()
{
/*-----------------------------
head pNex pPre tail
→ ←□→ ←□→ ←
pS
←□→
------------------------------*/
//建立开头赋值为-1的结点
head=NULL;
tail=NULL;
pS=new Node;
se(pS,INFEASIBLE); //pS->data=INFEASIBLE
head=pS;
pNex=pS;
//建立结尾赋值为-1的结点
pS=new Node;
se(pS,INFEASIBLE); //pS->data=INFEASIBLE
tail=pS;
pPre=pS;
ne(pNex,pPre);
pe(pPre,pNex);
size=0;
}
Status LinkedList::display() //正向输出
{
int Number=1;
Node *display=head;
display=display->Link_nextone(); //跳过开头赋值为-1的结点
while(display->getdata()!=INFEASIBLE) //判断结尾赋值为-1的结点
{
cout<<Number++<<". "<<display->getdata()<<endl; //按照编号输出数据
display=display->Link_nextone(); //display通过右指针进入下一个结点
}
return OK;
}
Status LinkedList::back_display() //逆向输出
{
int Number=size;
Node *display=tail;
display=display->Link_previousone(); //跳过结尾赋值为-1的结点
while(display->getdata()!=INFEASIBLE) //判断开头赋值为-1的结点
{
cout<<Number--<<". "<<display->getdata()<<endl;
display=display->Link_previousone(); //display通过左指针进入下一个结点
}
return OK;
}
Status LinkedList::add(Type data_p) //正向赋值
{
pS=new Node;
se(pS,data_p); //给pS赋值
/*--------------------------------
head -1 pNex pPre(-1) tail
→ ←□→ ←□→ ←□→-----←
pS
←□→
----------------------------------*/
ne(pNex,pS); //pEnd->next=pS;
pe(pS,pNex); //pS->previous=pEnd;
pNex=pS;
ne(pNex,pPre); //pNex->next=pPre;
pe(pPre,pNex); //pPre->previous=pNex;
size++;
return OK;
}
Status LinkedList::back_add(Type data_p) //逆向赋值
{
pS=new Node;
se(pS,data_p);
/*-----------------------------------------
head -1 pNex pPre -1 tail
→ ←□→ ←□→ ←□→ ←□→ ←
pS
←□→
----------------------------------------*/
ne(pS,pPre); //pS->next=pPre;
pe(pPre,pS); //pPre->previous=pS;
pPre=pS;
ne(pNex,pPre); //pNex->next=pNex;
pe(pPre,pNex); //pPre->previous=pNex;
size++; //链长+1
return OK;
}
Type LinkedList::getdata(int i) //链表返回某个结点的数据
{
if(i<0||i>size)return ERROR;
int j=i-1;
Node *display=head;
display=display->Link_nextone(); //跳过开头赋值为-1的结点
while(j--) //寻找节点位置
{
display=display->Link_nextone(); //display通过右指针进入下一个结点
}
return display->getdata();
}
Status LinkedList::Delete(int i) //删除某个结点
{
if(i<0||i>size)return ERROR;
int j=i-1;
Node *display=head;
display=display->Link_nextone();
while(j--) //寻找被删除结点
{
display=display->Link_nextone(); //display通过右指针进入下一个结点
}
/*---------------------------------------------
head -1 Next display Pre -1 tail
→ ←□→ ←□→ ↙□↘ ←□→ ←□→ ←
Del
↖□↗
-----------------------------------------------*/
/*---------------------------------------------
head -1 Next Pre -1 tail
→ ←□→ ←□→---------←□→ ←□→ ←
display
↙□↘
Del
↖□↗
-----------------------------------------------*/
Node *Next,*Pre,*Del;
Del=display; //Del和display指向同一个结点
Pre=display->Link_nextone(); //Pre=display->next;
Next=display->Link_previousone(); //Next=display->previous;
ne(Next,Pre); //Next->next=Pre;
pe(Pre,Next); //Pre->previous=Next;
size--; //链表-1;
return OK;
}
int LinkedList::getsize() //返回链表长度
{
return size;
}
Status LinkedList::Insert(int i,Type data_p) //结点插入
{
if(i<0||i>size+1)return ERROR;
int j=i-1;
Node *display=head;
display=display->Link_nextone();
while(j--) //寻找插入结点
{
display=display->Link_nextone(); //display通过右指针进入下一个结点
}
/*------------------------------------------------------------
head -1 Next display -1 tail
→ ←□→ ←□↘ ↙□→ ←□→ ←□→ ←
Pre
↖□↗
Ins
-----------------------------------------------------------*/
/*----------------------------------------------------------
head -1 Next display -1 tail
→ ←□→←□→←□→←□→←□→ ←□→ ←
Ins Pre
-----------------------------------------------------------*/
Node *Next,*Pre,*Ins;
Ins=new Node;
se(Ins,data_p); //给Ins赋值
Pre=display; //Pre和display指向同一个结点
Next=display->Link_previousone(); //Next=display->previous;
ne(Next,Ins); //Next->next=Ins;
pe(Ins,Next); //Ins->previous=Next
pe(Pre,Ins); //Pre->previous=Ins;
ne(Ins,Pre); //Ins->next=Pre;
size++; //链长+1
return OK;
}
int main()
{
LinkedList L;
L.add("呵呵"); //链表正向赋值
L.back_add("哦哦"); //链表逆向赋值
L.back_add("嘻嘻"); //链表逆向赋值
cout<<"链表正向输出"<<endl;
L.display(); //链表正向输出
cout<<"链表逆向输出"<<endl;
L.back_display(); //链表逆向输出
cout<<"链表输出第二个结点的数据"<<endl;
cout<<L.getdata(2)<<endl; //链表输出某个结点的数据
cout<<"链表删除第二个结点"<<endl;
L.Delete(1); //链表删除第一个结点
cout<<"链表正向输出"<<endl;
L.display();
cout<<"链表逆向输出"<<endl;
L.back_display();
cout<<"将4插入链表第二个结点"<<endl;
L.Insert(3,"啦啦"); //将4插入链表第三个结点
cout<<"链表正向输出"<<endl;
L.display();
cout<<"链表逆向输出"<<endl;
L.back_display();
return 0;
}