【无浪】双向链表string版


感觉我是个不需要手机的人,更喜欢跟别人面对面的交流,手机只是获取对方坐标的工具。


#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值