//初始化线性表运算算法
Status initList_cl(LinkList &L)
{ //操作结果:构造一个空的循环链表
//产生头节点,并使L指向此头节点
L = (LinkList)malloc(sizeof(LNode));
if(!L)//存储分配失败
exit(OVERFELOW);
L->next = L;//指针域为空
return OK;
}
int ListLength(LinkList L)
{
//初始条件:线性表L已存在。操作结果:返回L中数据元素个数
int i = 0;
LinkList p = L->next;//p指向第一个节点
while(p != L) {//没到表尾
i++;
p = p->next;
}
return i;
}
Q1:求循环单链表L中所有值为x的节点个数
int CountNode(LNode *L,ElemType x)
{
int i = 0;
LNode *p = L->next;
while(p != L) {//遍历整个循环链表
if(p->data == x) i++;
p = p->next;
}
return i;
}
Q2:有一个非递减有序循环单链表L,删除其中所有值为x的节点
int Delallx(LNode *&L, ElemType x)
{
LNode *pre = L, *p = L->next;//pre指向p节点的前驱节点
while(p != L && p->data != x) {//找第一个值为x的节点p
pre = p;
p = p->next;
}
if(p == L) return 0;//没有找到值为x的节点返回0
while(p != L && p->data == x) {//删除所有值为x的节点
pre->next = p->next;//pre和p是一对同步指针
free(p);
p = pre->next;
}
return 1;//成功删除返回1
}
//约瑟夫问题
#include<iostream>
#include<cstdlib>
using namespace std;
//约瑟夫环
//1.设计存储结构
typedef struct node
{
int no;
struct node *next;
}Child;
void CreateList(Child *&L,int n)//建立有n个结点的循环单链表
{
int i; Child *p,*tc; //tc指向新建循环单链表的尾结点
L = (Child *)malloc(sizeof(Child));
L->no = 1;//先建立只有一个no为1结点的单链表
tc = L;
for(i = 2;i <= n;i++)
{
p = (Child *)malloc(sizeof(Child));
p->no = i;//建立一个存放编号为i的结点
tc->next = p;
tc = p;//将p结点链到末尾
}
tc->next = L;//链接构成一个首结点为L的循环单链表
}
void Joseph(int n,int m)//求解约瑟夫序列
{
int i,j;
Child *L,*p,*q;
CreateList(L,n);
for(i = 1;i <= n;i++)//出列n个小孩
{
p = L;j = 1;
while(j < m - 1) {//从L结点开始报数,报到第m-1个结点
j++;//报数递增
p = p->next;//移到下一个结点
}
q = p->next;//q指向第m个结点
printf("%d ",q->no);//该结点出列
p->next = q->next;//删除q结点
free(q);//释放其空间
L = p->next;//从下一个结点重新开始
}
}
int main()
{
int n = 6,m = 5;
printf("n = %d,m = %d的约瑟夫序列:",n,m);
Joseph(n,m);
printf("\n");
return 0;
}