关于数据结构中单向循环链表删除元素的问题
恩本来在编这个程序的时候应该先查找第K-1个结点。如:p=get_linklist(H,k-1);的,但是现在不能用这种方法,有没有另外一种方法。
谁会做这两个题,帮忙把程序写出来。
删除第K个元素和删除值为X的点是不一样的。 展开
#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;
}
}
//---------------------------------------------------