//这个好像和你的差不多。head是头节点,本身的link指向自己,first指向第一个真实的存储数据的节点//头节点的初始化在构造函数中已经实现,但插入第一个节点是不知如何插入,还是头节点那样初始化根本就不对?head->link指向新结点,新节点link指向表头为便于操作,可设置尾指针指向表头//在Chain类中只有first和head两个指针的情况下能否实现单向循环链表?该实例能。你问题补充的回答:是你弄反了。头节点。因为一个空表头结点也是存在的。first的存在只是为了便于修改原来的程序,实际上是不必要的。include"stdio.h"#include//#includeusingnamespacestd;templateclassChain;templateclassChainNode{friendChain;private:Tdata;ChainNode*link;};templateclassChain{public:Chain{head=newChainNode;//头节点tail=head;head->link=tail;tail->link=head;first=head->link;}~Chain;boolIsEmptyconst{returnfirst==0;}intLengthconst;boolFindintk,T&xconst;intSearchconstT&xconst;Chain&Deleteintk,T&x;Chain&Insertintk,constT&x;voidOutputostream&outconst;private:ChainNode*first;//指向第一个真实节点的指针ChainNode*head;//表头指针ChainNode*tail;//表尾指针};//////////////析构函数///////////////////templateChain::~Chain{ChainNode*next;whilefirst!=tail{next=first->link;deletefirst;first=next;}deletehead;}//////////////输出//////////////templatevoidChain::Outputostream&outconst{ChainNode*current;intnum=0;forcurrent=first;current!=tail;current=current->link{outdataostream&operator&x{x.Outputout;returnout;}///////////删除/////////////////templateChain&Chain::Deleteintk,T&x//这个x何用?{ifk*p=first;ifk==1{first=first->link;head->link=first->link;}else{ChainNode*q=first;forintindex=1;indexlink;ifq==tail||q->link==tail{coutlink;q->link=p->link;}x=p->data;deletep;return*this;}//////////////插入//////templateChain&Chain::Insertintk,constT&x{ifk*p=first;forintindex=1;indexlink;ifk>0&&p==tail{cout*y=newChainNode;y->data=x;ifk//插入k位置{y->link=p->link;p->link=y;}else{y->link=tail;//插入表头first=y;head->link=first;//这条语句丢掉了}return*this;}voidmain{Chaincn;forinti=0;i<100;i++{cn.Inserti,i;}intx;cn.Delete10,x;cout<
边华英2019-12-21 18:58:03
访问方式:单链表:如果访问任意结点每次只能从头开始顺序向后访问单循环链表:可以从任何一个结点开始,顺序向后访问到达任意结点双向链表:可以从任何结点开始任意向前向后双向访问操作:单链表和单循环链表:只能在当前结点后插入和删除双链表:可以在当前结点前面或者后面插入,可以删除前趋和后继存储:单链表和单循环链表存储密度大于双链表。
连仲月2019-12-21 18:42:03