关于C语言数据结构的问题(约瑟夫环)

我自己写的一个程序,大家看一下毛病在哪里,如果能够帮我运行成功并输出正确的结果的话,追加分
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream.h> // cout,cin
#include <conio.h>

// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1

typedef int Status;
typedef int ElemType;
typedef struct NodeType{
ElemType data,locate;
NodeType *next;
} NodeType,*LinkType; //结点类型,指针类型

LinkType SuccNode(LinkType p)
{ //若指针p!=NULL,则返回指向p所指结点的后续元素的指针,
//否则返回NULL
if (p){
return p->next;
}
else{
return NULL;
}
}
typedef struct OrderedList{

LinkType head; //分别指向线性链表的头结点和尾结点
int size; //指示链表当前的长度
}OrderedList; //有序链表类型

//有序链表的基本操作如下:

bool InitList(OrderedList &L,int n)
{
if(n==0) return ERROR;
int i;LinkType p,q;
if(L.head=((NodeType*)malloc(sizeof(NodeType))) )
{printf("请输入地1个人的密码");
scanf("%d",&L.head->data);L.size=1;L.head->locate=1;}
else return ERROR;
q=L.head;
for(i=2;i<=n;i++)
{
if(p=((NodeType*)malloc(sizeof(NodeType))))
{q->next=p;
q=p;
printf("请输入第%d个人的密码",i);
scanf("%d",&p->data);
L.size++;
p->locate=i;}
else return ERROR;

}
q->next=L.head;

}//InitList
void Free(LinkType &p)
{ //释放p所指结点
free(p);
p = NULL;
}
#include "Node.h"

LinkType delet(LinkType p,OrderedList &T)
{ LinkType q,m;m=q=p;
while(p->next!=q)
p=SuccNode(p);
p->next=q->next;
Free(q);
p->next=q;printf("yunxing");

return m->next;
}

void Joseph(OrderedList &L,int m)
{ LinkType p=L.head,e;int n;
for(n=m;n>=0;n--)
{
if(n==1)
{n=p->data ;printf("%d",n);
printf("%d",p->locate);p=delet(p,L);

e=p->next;if(e==p) n=0;
}
else if(n==0) {printf("%d",p->locate );break;}
p=SuccNode(p);
}

}

#include"Joseph.h"
void main (){

int m;int n;LinkType p;
OrderedList T;
printf("请输入m 与 n 的值");
scanf("%d %d",&m,&n);
if(n<1) exit(OVERFLOW);
InitList(T,n);
p=T.head; p=SuccNode(p->next );
printf("%d %d \n",p->locate ,p->data);

Joseph(T,m);

}
可能因为我思路的原因干扰了你的思路,所以你按照我的思路得来的程序也同样出现了错误,估计是指针超出范围,就不给你额外加分了,这个问题我通过别的算法解决了,但是同样也要感谢你

第1个回答  推荐于2016-06-24
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream> // cout,cin
#include <conio.h>

// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1

///////////////////////////////////////////////////////////////////////////
typedef int Status;

typedef int ElemType;

typedef struct NodeType
{
ElemType data,locate;
NodeType *next;
} NodeType,*LinkType; //结点类型,指针类型

typedef struct OrderedList{

LinkType head; //分别指向线性链表的头结点和尾结点
int size; //指示链表当前的长度
}OrderedList; //有序链表类型

///////////////////////////////////////////////////////////////////////////
bool InitList(OrderedList &L,int n)
{
if(n==0)
return ERROR;

int i;
LinkType q;

if(L.head=((NodeType*)malloc(sizeof(NodeType))))
{
printf("请输入第1个人的密码:");
scanf("%d",&L.head->data);
L.size=1;
L.head->locate=1;
L.head->next = L.head;
}
else
return ERROR;

q=L.head;
for(i=2;i<=n;i++)
{
if(q->next=((NodeType*)malloc(sizeof(NodeType))))
{
q=q->next;
printf("请输入第%d个人的密码:",i);
scanf("%d",&q->data);
L.size++;
q->locate=i;
}
else
return ERROR;
}
q->next=L.head;

return TRUE;
}

void Joseph(OrderedList &L,int m)
{
LinkType p = L.head;
LinkType q = p;
int i;
printf("输出顺序如下:");
while( L.size > 0 )
{
i = m - 1;
while( i > 0 )
{
q = p;
p = p->next;
i--;
}
printf("第%d个人,密码为:%d\n",p->locate,p->data);
q->next = p->next;
free(p);
L.size--;
p = q->next;
}
}

void main ()
{
int m;
int n;
OrderedList T;

//n表示约瑟夫环中节点个数,m表示报数循环的个数
printf("请输入n 与 m 的值\n");
scanf("%d %d",&n,&m);
if (n<1||m<1)
{
printf("对不起,输入有误!");
exit(OVERFLOW);
}

InitList(T,n);
Joseph(T,m);

getchar();
getchar();
}本回答被提问者采纳

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈子,问最后留下的是原来第几号的那位。1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完...

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

用c语言实现约瑟夫环
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目 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*...

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
我这个学期也搞数据结构 程序可以运行的

求看下这个用C语言写的约瑟夫环代码错在哪儿
void del_Joseph(Joseph*current_p,Joseph *pre_p)这个函数去掉参数列表,直接用全局变量就行,不去掉反而会错。因为,当他们作为参数传递时,本身的值是不能被改变的。而你在函数中释放掉current_p所指向的空间,但current_p仍指向该空间,导致后面出错。发现这个问题,只要你打印下每次删除的值就行了...

约瑟夫环公式是怎样推导出来的?
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head。2、解决问题的核心步骤:1.建立一个具有n个链结点,无头结点的循环链表。2.确定第1个报数人的位置。3...

关于约瑟夫环问题的实验报告书中详细设计
1.需求分析和说明 分析约瑟夫问题:n个人围成圈,每人各持一个密码,任选一个正整数作为报数上限值m,从第一个人开始,数到第m个人,删除并以出列者密码作为新的m值,从下一个人开始进行第二轮操作,直到所有人都出列。例如n=6, m=3, 处理过程下图。2.设计 n个人围圈,形成线性关系;处理为...

数据结构做约瑟夫环,懂的来,帮我注释,答得好的加分,谢谢!
using namespace std;typedef struct node { int number; \/\/编号 int pwd; \/\/密码 struct node * next; \/\/下一人结点的地址 }Node, *Link;\/\/初始化带头结点的环型链表 Link Init(void){ Link L;L = (Link)malloc(sizeof(Node));L -> next = L;return L;} \/\/在头结点的前...

数据结构— 循环链表、双向(循环)链表
链表的两头连接,形成了一个环状链表,称为循环链表。约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(以编号1,2,3,…,n分别表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 还是顺时针开始报数,数到 m 的那个人又...

请问一个约瑟夫相关的问题
printf("\\n The last Person`s Number is %d\\n",n[c]);return 0;} 用容器作的话开发效率会很高,但是灵活性和运行效率肯定不高,非要用STL作的话我也想不出什么组合可以搞定这个问题,又要随机访问又要删除元素不移动数组,就像左眼向左看右眼向右看一样哈!基本不可能完成的任务,不过不排除...

相似回答