关于C语言数据结构的问题(约瑟夫环)
我自己写的一个程序,大家看一下毛病在哪里,如果能够帮我运行成功并输出正确的结果的话,追加分#include<string.h>#include<ctype.h>#incl...
我自己写的一个程序,大家看一下毛病在哪里,如果能够帮我运行成功并输出正确的结果的话,追加分
#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);
}
可能因为我思路的原因干扰了你的思路,所以你按照我的思路得来的程序也同样出现了错误,估计是指针超出范围,就不给你额外加分了,这个问题我通过别的算法解决了,但是同样也要感谢你 展开
#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个回答
展开全部
#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();
}
#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();
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
上海华然企业咨询
2024-10-21 广告
2024-10-21 广告
上海华然企业咨询有限公司专注于AI与数据合规咨询服务。我们的核心团队来自头部互联网企业、红圈律所和专业安全服务机构。凭借深刻的AI产品理解、上百个AI产品的合规咨询和算法备案经验,为客户提供专业的算法备案、AI安全评估、数据出境等合规服务,...
点击进入详情页
本回答由上海华然企业咨询提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询