//此程序是从网上复制的! ! !
#include<iostream>
using namespace std;
typedef double ElemType;//double类型可以换成其他的
typedef struct RLNode
{
//定义循环链表的节点
ElemType data;
struct RLNode *next;
}RLNode,*RLinkList;
//-------------------------------------------
void CreateList_RL ( RLinkList & L);//创建一个循环链表
void ScanList_RL ( RLinkList L);//遍历循环链表
void DeleteList_RL ( RLinkList & L,int K,ElemType X);//删除第K个节点以及删除值为X的点
//------------------------------------------
void main()
{
RLinkList L=(RLinkList) malloc ( sizeof(RLNode) );
L->next=L;//创建空的循环链表
cout<<"请输入循环链表各个节点的数(double型),-1表示结束"<<endl<<endl;
CreateList_RL(L);
cout<<"输入的循环链表各个节点的数为"<<endl;
ScanList_RL(L);
cout<<"请输入要删除的循环链表节点位序,以及要删除的值"<<endl;
int K; ElemType X; cin>>K>>X;
DeleteList_RL ( L,K,X);
cout<<"删除后得到的循环链表各个节点的数为"<<endl;
ScanList_RL (L);
}
//---------------创建循环链表-----------------
void CreateList_RL ( RLinkList & L)
{
ElemType t; cin>>t;
while(t!=-1)
{
RLinkList p= (RLinkList) malloc ( sizeof(RLNode) );//申请一个新的节点
p->data=t;//将新节点接到末尾,并将指针L后移一位,
p->next=L->next; //请问这一句 是什么意思???
L->next=p; //请问这一句 是什么意思???
L=L->next; //请问这一句 是什么意思???
cin>>t;
}
//因为现在L指向尾节点,为得到头结点应后移一位
L=L->next;
}
//----------------遍历循环链表--------------------
void ScanList_RL ( RLinkList L)
{
RLinkList p=L->next;
while(p!=L)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl<<endl;
}
//--------------删除第K个节点以及删除值为X的点-----------
void DeleteList_RL ( RLinkList & L,int K,ElemType X)
{
RLinkList p=L,q;
int i=0;
while(p->next!=L)
{ //所有的操作都要在p->next!=L下进行
//当p的下一个节点位序为K或者下一个节点值为X,删除
if(i==K-1 || p->next->data==X)
{
q=p->next;
p->next=q->next;
free(q);
i++;//若在还没到K之前就删节点,会影响位序,所以要做i++
}
//i<K-1时使用++是为了得到i=K-1的点,当i==K-1上面已经做了++,
//此时i会大于K-1
if(i<K-1)
i++;
p=p->next;
}
}
L->next=p 的意思是将两个节点 连起来 对吧? L=L->next; 是不是应该写成L=p->next 呢?因为p是最后一个节点 而且p->next=L->next;也是 将 本来指向L的L->next 赋给了p->next 这样不就形成一个环了吗
追答L->next=p 的意思是将两个节点 连起来 对吧?
是将p链接到L的下一个节点上。
此时,L不是最后一个节点了。
L=L->next; 是不是应该写成L=p->next 呢?因为p是最后一个节点 而且p->next=L->next;也是 将 本来指向L的L->next 赋给了p->next 这样不就形成一个环了吗
L=L->next; 不应该写成L=p->next ,而可以写成L=p;
通过上一个操作,L已经不是最后一个节点了。L中的next是最后一个节点,也就是p。通过此操作后,L又成了最后一个节点。
使链表形成闭合的环的步骤 是 p->next=L->next 和 L->next=p; 而 L=L->next; 是让L永远指向 最后一个节点 对吗?
追答对
L->next=p 的意思是将两个节点 连起来 对吧? L=L->next; 是不是应该写成L=p->next 呢?因为p是最后一个节点 而且p->next=L->next;也是 将 本来指向L的L->next 赋给了p->next 这样不就形成一个环了吗