循环链表建立和输出操作(带头结点)
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <iomanip>
#include <string.h>
using namespace std;
#define NUMBER 10
/
//数据结构定义
typedef struct node{
int data;
struct node *next;
}Inode,*Linklist;
/
//循环链表
void create_L(Linklist &L,int n)
{
int i;
Linklist newnode,p;
L=new node;
L->next=L;
p=L;
if(L==NULL)
cout<<"Failure!";
else
{
i=0;
while(++i<=n)
{
newnode=new node;
newnode->data=i;
p->next=newnode;
p=newnode;
}//while
p->next=L; //最后一个结点指向头结点
}//else
}
void print_L(Linklist L)
{
int i=0;
Linklist p;
p=L->next;
while (p!=L) //遍历到最后一个结点
{
i++;
cout<<"-->"<<setw(4)<<i<<":"<<setw(4)<<p->data;
p=p->next;
}//while
cout<<"-->NULL"<<endl;
}//print
int main()
{
Linklist L;
int n;
cin>>n;
cout<<"输入个数:";
create_L(L,n);
print_L(L);
return 0;
}
注:
不带头结点循环链表最后一个结点的指针域指向链表的第一个结点,常用于多次循环遍历时;
带头结点的话,最后一个结点的指针域指向头结点,常用于单次循环。
应用1
单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。
Status Delete_Pre(linklist &s)
{
p=s;
while(p->next->next!=s)
p=p->next;
q=p->next;
p->next=s;
free(q);
return OK;
}
应用2 猴子选大王
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <iomanip>
#include <string.h>
using namespace std;
#define NUMBER 10
/
//数据结构定义
typedef struct node{
int data;
struct node *next;
}Inode,*Linklist;
/
//循环链表(不带头结点)
void create_L(Linklist &L,int n)
{
int i;
Linklist newnode,p;
L=new node;
p=L;
if(L==NULL)
cout<<"Failure!";
else
{
i=0;
while(++i<=n)
{
newnode=new node;
newnode->data=i;
p->next=newnode;
p=newnode;
}//while
p->next=L->next; //最后一个结点指向第一个结点
}//else
}
void find_L(Linklist &L,int f)
{
Linklist p,q;
int t=1;
p=L;
q=L->next;
cout<<"出队猴子序号:";
while(p->next!=p) //只剩一只猴子时停止
{
if(t==f) //报到标记数字
{
cout<<q->data<<" ";
p->next=q->next;
free(q); //删除一个猴子
q=p->next;
t=1; //重新报数
}
p=q;
q=q->next;
t++;
}
cout<<endl<<"剩下的猴子序号为:";
cout<<p->data;
}
int main()
{
Linklist L;
int n,f;
cout<<"输入猴子个数:";
cin>>n;
create_L(L,n);
cout<<"输入标记数字:";
cin>>f;
find_L(L,f);
return 0;
}