约瑟夫环(单向循环链表)

//头文件

include<stdio.h>
#include<stdlib.h>

typedef struct Node{
      int num;//人的序号
      int pwd;//人的密码
      struct Node *next;
}LinkList;
void InitList(LinkList *L,int n);
void enterpwd(LinkList *L,int n);
void ListDelete(LinkList *L,int n,int m);

void InitList(LinkList *L,int n){
    LinkList *p,*r;
    int i;
    L=(LinkList*)malloc(sizeof(Node));
    r=L;
    for(i=1;i<n;i++)
    {
        p=(LinkList*)malloc(sizeof(Node));
        r->next=p;
        r=p;
    }
    r->next=L;
}
void enterpwd(LinkList *L,int n){
     int i,j;
     printf("请输入密码:");
     for(i=1;i<=n;i++)
     {
       scanf("%d",&j);
       L->num=i;
       L->pwd=j;
       L=L->next;
     }
}
void ListDelete(LinkList *L,int n,int m){
    LinkList *q,*s;
    q=L;
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=2;j<m;j++)
        {
            q=q->next;
        }
        s=q->next;
        printf("%d",s->num);
        m=s->pwd;
        q->next=s->next;
        free(s);
    }
}

//主函数

#include <iostream>
#include"1.h"
using namespace std;

int main()
{
    int m,n;
    cout<<"参加游戏的人数为:";
    cin>>n;
    cout<<"任选一正整数报数上限:";
    cin>>m;
    LinkList l;
    InitList(l,n);
    enterpwd(l,n);
    cout<<"出队的人的序号依次是:";
    ListDelete(l,n,m);
    return 0;
}
问题:

调试了一下,感觉问题挺多的,就改了一下。看看是不是你的需求。

没有注释,自己慢慢看吧!

#include<stdio.h>
#include<stdlib.h>

#include <iostream>

using namespace std;

typedef struct Node {
	int num;//人的序号
	int pwd;//人的密码
	struct Node *next;
}LinkList;

void InitList(LinkList **L, int n);
void enterpwd(LinkList **L, int n);
void ListDelete(LinkList **L, int n, int m);

void InitList(LinkList **L, int n) {
	LinkList *p, *r;
	int i;
	*L = (LinkList*)malloc(sizeof(Node));
	r = *L;
	for (i = 1; i <= n; i++) {
		p = (LinkList*)malloc(sizeof(Node));
		p->next = NULL;
		r->next = p;
		r = p;
	}
	//r->next = L;
}
void enterpwd(LinkList **L, int n) {
	int i, j;
	LinkList *p = (*L)->next;
	printf("请输入密码:");
	for (i = 1; i <= n; i++) {
		scanf_s("%d", &j);
		p->num = i;
		p->pwd = j;
		p = p->next;
	}
}
void ListDelete(LinkList **L, int n, int m) {
	LinkList *q, *s;
	q = (*L);
	s = (*L);
	int i;
	/*for (i = 1; i <= n; i++) {
		for (j = 2; j < m; j++) {
			q = q->next;
		}
		s = q->next;
		printf("%d", s->num);
		m = s->pwd;
		q->next = s->next;
		free(s);
	}*/



	// 正序输出

	q = q->next;
	for (i = 0; i < n; i++) {
		printf("%d", q->num);
		s = q;
		q = q->next;
		free(s);
	}


	// 逆序输出

	//for (int i = 0; i < n; i++) {
	//	while (q->next != NULL) q = q->next;
	//	while (s->next != q) s = s->next;
	//	s->next = NULL;
	//	printf("%d", q->num);
	//	free(q);
	//	q = NULL;
	//	q = (*L);
	//	s = (*L);
	//}

	free(*L);
	*L = NULL;
}

//主函数



int main() {
	int m, n;
	cout << "参加游戏的人数为:";
	cin >> n;
	cout << "任选一正整数报数上限:";
	cin >> m;
	LinkList *l;
	InitList(&l, n);
	enterpwd(&l, n);
	cout << "出队的人的序号依次是:";
	ListDelete(&l, n, m);
	return 0;
}