LinkList joseph(LinkList S,int m) { int i,len; LinkList p; i=1; len=ListLength(S); p=S; while(p->next!=S) p=p->next;//把p指向第一个结点的前驱 while(len>1){
时间: 2023-05-15 16:07:19 浏览: 66
这是一个约瑟夫问题的解法,使用循环链表来实现。具体实现细节可以参考代码:
LinkList joseph(LinkList S, int m) {
int i, len;
LinkList p, q;
i = 1;
len = ListLength(S);
p = S;
while (p->next != S) p = p->next; // 把p指向第一个结点的前驱
while (len > 1) {
for (i = 1; i < m; i++) {
p = p->next;
}
q = p->next;
p->next = q->next;
len--;
free(q);
}
return p;
}
这个函数的作用是解决约瑟夫问题,其中参数S是一个循环链表的头结点,m是每次删除的数的个数。函数返回最后剩下的结点。
注意,这个函数的实现并不完整,需要自己实现一些辅助函数,比如ListLength等。
相关问题
int i,len; LinkList p; i=1; len=ListLength(S); p=S; while(p->next!=S) p=p->next;//把p指向第一个结点的前驱 while(len>1){//若链表中还多
于一个结点
if(i%M==0){//找到要删除的结点
LinkList q=p->next;//q指向要删除的结点
p->next=q->next;//删除结点
free(q);//释放结点空间
len--;//链表长度减1
}
p=p->next;//p指向下一个结点
i++;//结点编号加1
}
return p->data;//返回最后一个结点的编号
用单链表存储线性表,写出在带头结点的单链表中插入数据元素e作为单链表的第i个元素的算法和求单链表长度ListLength()的算法。 Typedef struct Lnode { ElemType data; //数据域 struct Lnode *next; //指针域 }Lnode, *LinkList; bool ListInsert(LinkList &L, int i, ElemType e){ int ListLength( LinkList L ){
插入数据元素e作为单链表的第i个元素的算法:
```
bool ListInsert(LinkList &L, int i, ElemType e){
if(i < 1){ //i小于1无意义
return false;
}
Lnode *p = L; //p指向头结点
int j = 0; //j表示当前p指向的结点是第几个结点
while(p && j < i - 1){ //查找第i-1个结点
p = p->next;
j++;
}
if(!p){ //i大于表长加1,插入无效
return false;
}
Lnode *s = new Lnode; //新建结点s
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
```
求单链表长度ListLength()的算法:
```
int ListLength(LinkList L){
int len = 0;
Lnode *p = L->next; //p指向第一个结点
while(p){ //遍历单链表
len++;
p = p->next;
}
return len;
}
```