约瑟夫环代码,循环链表。程序测试时部分数字组合可以成功运行,大部分都会以乱码输出

约瑟夫环代码,循环链表。程序测试时部分数字组合可以成功运行,大部分都会以乱码输出,第1张

已经修改,运行通过:(问题出在头结点被局猜释放后,头指针没有正确调整)

#include <stdio.h>

#include <malloc.h>

//构建结构体

typedef struct Node

{

int Num

struct Node *next

}JosephNode, *PNode, *HeadNode

//初始化循环单链表

int JosephInit(HeadNode *h)

{

if(!h)

{

printf("链表初始化错误!\n")

return 0

}

(*h)->态悄next = (*h)//循环单链表

return 1

}

//单链表插入

int JosephInsert(JosephNode *h, int m, int x)

{

int i = 1

PNode p = h,q

if(m == 1)

{

p->Num = x

p->next = p

return 1

}

while(i <m-1)

{

p = p->next

i++

}

q = (PNode)malloc(sizeof(JosephNode))

q->Num = x

q->next = p->next

p->next = q

return 1

}

//遍历

void TraverseList(HeadNode h, int m)

{

int i = 0

PNode p = h

while(i <m)

{

printf(" %d", p->Num)

p = p->next

i++

}

}

//出局判定

int JosephDelete(HeadNode *h, int n, int k, int m)

{

int i

PNode p = *h,q

while(n >m+1)

{

for(i = 1i <k-1i++)

p = p->next

q = p->next

p->next = q->next

if(*h==q)*h=q->next

free(q)

p = p->next

n--

}

return 1

}

int main()

{

int i//计数数字

int n//总人数

int k//出局数字

int m//存活的朋友个数

printf("假设n个人围成一圈,其桐闭型中有m个你的朋友不想死掉,从第一个开始报数,第k个将被杀掉。为了保护自己和m个朋友,安排自己和m个朋友的初始位置。\n\n")

printf("参与人数:")

scanf("\t%d", &n)

printf("出局数字:")

scanf("\t%d", &k)

printf("朋友数量:")

scanf("\t%d", &m)

HeadNode h = ((HeadNode)malloc(sizeof(JosephNode)))//初始化头结点

JosephInit(&h)//初始化单链表

for(i = 0i <= ni++)//编号插入

JosephInsert(h, i, i)

JosephDelete(&h, n, k, m)//出局循环

printf("\n安全的位置编号为:")

m++

TraverseList(h,m)//遍历剩余位置编号

printf("\n")

return 0

}

正好之前写过基础的察雀约瑟夫环,稍作修改就可以满足你的题目

#include <stdio.h>

#include <stdlib.h>

typedef struct _node {

    int id

    int key

    struct _node *next

} Linklist

int main() {

int n, m

scanf("%d %d", &n, &m)

int i, count = 0

Linklist *head = (Linklist*)malloc(sizeof(Linklist)), *tail = head

head->id = 1

scanf("%d", &head->key)

head->next = head

for(i = 2 i <= n i++) {

Linklist *p = (Linklist*)malloc(sizeof(Linklist))

p->id = i

scanf("%d", &p->key)

p->next = head

tail->next = 世没败p

tail = p

}

while(head != tail) {

if(++count % m) {

tail = head

} else {

    m = head->key

    count = 0

printf("%d "搜颤, head->id)

tail->next = head->next

free(head)

}

head = tail->next

}

printf("%d\n", head->id)

free(head)

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12301671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存