用循环单链表解决Josephus问题的程序,运行起来是个死循环,不知道有哪里错了,请帮我检查一下
#include<stdio.h>#include<stdlib.h>structNode;typedefstructNode*PNode;structNode{PNod...
#include <stdio.h>
#include <stdlib.h>
struct Node;
typedef struct Node*PNode;
struct Node
{
PNode link;
int info;
};
typedef struct Node*LinkList;
//创建一个循环单链表
LinkList createNullList_link()
{
LinkList llist=(LinkList)malloc(sizeof(struct Node));
if(llist!=NULL)
{
llist->link=NULL;
printf("created\n");
}
else printf("out of space\n");
return llist;
}
void insertPost_link(LinkList llist,PNode p,int x)
{
PNode q=(PNode)malloc(sizeof(struct Node));
if(q!=NULL)
{
if(llist->link==NULL)
{
llist->link=q;
q->link=q;
q->info=x;
}
else
{
q->link=p->link;
p->link=q;
q->info=x;
}
}
else printf("out of space\n");
}
PNode locate_link(LinkList llist,int x)//定位值为x的结点
{
PNode p=llist->link;
do
{
if(p->info==x)return p;
p=p->link;
}
while(p!=llist->link);
if(p==llist->link)
printf("cannot find\n");
return NULL;
}
PNode locatePre_link(LinkList llist,PNode p)//定位前驱结点
{
PNode q=llist->link;
do
{
if(q->link==p)return q;
q=q->link;
}
while(q!=llist->link);
}
void deleteP_link(LinkList llist,PNode p)//删除一个位置上的人
{
if(p==llist)printf("cannot delete\n");
PNode q=locatePre_link(llist,p);
q->link=p->link;
free(p);
}
void deleteV_link(LinkList llist,int x)
{
PNode q=locate_link(llist,x);
deleteP_link(llist,q);
}
PNode locateC_link(LinkList llist,PNode p,int m)//定位从p开始报数报到m的那个人
{
int i=1;
while(i<m)
{
p=p->link;
i++;
}
return p;
}
void SetList_link(LinkList llist)
{
int i=1,n;
printf("how many people are there in all:");
scanf("%d",&n);
PNode q=llist;
while(i<=n)
{
insertPost_link(llist,q,i);
i++;
q=q->link;
}
}
void ShowList_link(LinkList llist)
{
PNode q=llist->link;
do
{
printf("%d ",q->info);
q=q->link;
}
while(q!=llist->link);
printf("\n");
}
int main()
{
LinkList llist=createNullList_link();
SetList_link(llist);
ShowList_link(llist);
PNode q=llist->link;
while(q->link!=q)
{
printf("%d\n",locateC_link(llist,q,4)->info);
PNode r=locatePre_link(llist,locateC_link(llist,q,4));
deleteP_link(llist,locateC_link(llist,q,4));
ShowList_link(llist);
q=r->link;
}
ShowList_link(llist);
}
如果将main里面的那个循环计数器改为i,限定i的最大值,也就是说让他运行有限次的话,前几步没有问题但是后面会出问题 展开
#include <stdlib.h>
struct Node;
typedef struct Node*PNode;
struct Node
{
PNode link;
int info;
};
typedef struct Node*LinkList;
//创建一个循环单链表
LinkList createNullList_link()
{
LinkList llist=(LinkList)malloc(sizeof(struct Node));
if(llist!=NULL)
{
llist->link=NULL;
printf("created\n");
}
else printf("out of space\n");
return llist;
}
void insertPost_link(LinkList llist,PNode p,int x)
{
PNode q=(PNode)malloc(sizeof(struct Node));
if(q!=NULL)
{
if(llist->link==NULL)
{
llist->link=q;
q->link=q;
q->info=x;
}
else
{
q->link=p->link;
p->link=q;
q->info=x;
}
}
else printf("out of space\n");
}
PNode locate_link(LinkList llist,int x)//定位值为x的结点
{
PNode p=llist->link;
do
{
if(p->info==x)return p;
p=p->link;
}
while(p!=llist->link);
if(p==llist->link)
printf("cannot find\n");
return NULL;
}
PNode locatePre_link(LinkList llist,PNode p)//定位前驱结点
{
PNode q=llist->link;
do
{
if(q->link==p)return q;
q=q->link;
}
while(q!=llist->link);
}
void deleteP_link(LinkList llist,PNode p)//删除一个位置上的人
{
if(p==llist)printf("cannot delete\n");
PNode q=locatePre_link(llist,p);
q->link=p->link;
free(p);
}
void deleteV_link(LinkList llist,int x)
{
PNode q=locate_link(llist,x);
deleteP_link(llist,q);
}
PNode locateC_link(LinkList llist,PNode p,int m)//定位从p开始报数报到m的那个人
{
int i=1;
while(i<m)
{
p=p->link;
i++;
}
return p;
}
void SetList_link(LinkList llist)
{
int i=1,n;
printf("how many people are there in all:");
scanf("%d",&n);
PNode q=llist;
while(i<=n)
{
insertPost_link(llist,q,i);
i++;
q=q->link;
}
}
void ShowList_link(LinkList llist)
{
PNode q=llist->link;
do
{
printf("%d ",q->info);
q=q->link;
}
while(q!=llist->link);
printf("\n");
}
int main()
{
LinkList llist=createNullList_link();
SetList_link(llist);
ShowList_link(llist);
PNode q=llist->link;
while(q->link!=q)
{
printf("%d\n",locateC_link(llist,q,4)->info);
PNode r=locatePre_link(llist,locateC_link(llist,q,4));
deleteP_link(llist,locateC_link(llist,q,4));
ShowList_link(llist);
q=r->link;
}
ShowList_link(llist);
}
如果将main里面的那个循环计数器改为i,限定i的最大值,也就是说让他运行有限次的话,前几步没有问题但是后面会出问题 展开
2013-02-18
展开全部
#include <stdio.h>
#include <stdlib.h>
struct Node;
typedef struct Node*PNode;
struct Node
{
PNode link;
int info;
};
typedef struct Node*LinkList;//创建一个循环单链表
LinkList createNullList_link()
{
LinkList llist=(LinkList)malloc(sizeof(struct Node));
if(llist!=NULL)
{
llist->link=NULL;
printf("created\n");
}
else printf("out of space\n");
return llist;
}
void insertPost_link(LinkList llist,PNode p,int x)
{
PNode q=(PNode)malloc(sizeof(struct Node));
if(q!=NULL)
{
if(llist->link==NULL)
{
llist->link=q;
q->link=q;
q->info=x;
}
else
{
q->link=p->link;
p->link=q;
q->info=x;
}
}
else printf("out of space\n");
}
PNode locate_link(LinkList llist,int x)//定位值为x的结点
{
PNode p=llist->link;
do
{
if(p->info==x)return p;
p=p->link;
}while(p!=llist->link);
if(p==llist->link)
printf("cannot find\n");
return NULL;
}
PNode locatePre_link(LinkList llist,PNode p)//定位前驱结点
{
PNode q=llist->link;
do
{
if(q->link==p)
return q;
q=q->link;
}while(q!=llist->link);
return q;
}
void deleteP_link(LinkList llist,PNode p)//删除一个位置上的人
{
if(p==llist)printf("cannot delete\n");
PNode q=locatePre_link(llist,p);
q->link=p->link;
free(p);
}
void deleteV_link(LinkList llist,int x)
{
PNode q=locate_link(llist,x);
deleteP_link(llist,q);
}
PNode locateC_link(LinkList llist,PNode p,int m)//定位从p开始报数报到m的那个人
{
int i=1; while(i<m)
{
p=p->link;
i++;
}
return p;
}
void SetList_link(LinkList llist)
{
int i=1,n;
printf("how many people are there in all:");
scanf("%d",&n);
PNode q=llist;
while(i<=n)
{
insertPost_link(llist,q,i);
i++;
q=q->link;
}
}
void ShowList_link(LinkList llist)
{
PNode q=llist->link;
do
{
printf("%d ",q->info);
q=q->link;
}while(q!=llist->link);
printf("\n");
}
int main()
{
LinkList llist=createNullList_link();
SetList_link(llist);
ShowList_link(llist);
PNode q=llist->link;
while(q->link!=q)
{
printf("%d\n",locateC_link(llist,q,4)->info);
PNode r=locatePre_link(llist,locateC_link(llist,q,4));
deleteP_link(llist,locateC_link(llist,q,4));
ShowList_link(llist);
q=r->link;
}
ShowList_link(llist);
return 0;
}
#include <stdlib.h>
struct Node;
typedef struct Node*PNode;
struct Node
{
PNode link;
int info;
};
typedef struct Node*LinkList;//创建一个循环单链表
LinkList createNullList_link()
{
LinkList llist=(LinkList)malloc(sizeof(struct Node));
if(llist!=NULL)
{
llist->link=NULL;
printf("created\n");
}
else printf("out of space\n");
return llist;
}
void insertPost_link(LinkList llist,PNode p,int x)
{
PNode q=(PNode)malloc(sizeof(struct Node));
if(q!=NULL)
{
if(llist->link==NULL)
{
llist->link=q;
q->link=q;
q->info=x;
}
else
{
q->link=p->link;
p->link=q;
q->info=x;
}
}
else printf("out of space\n");
}
PNode locate_link(LinkList llist,int x)//定位值为x的结点
{
PNode p=llist->link;
do
{
if(p->info==x)return p;
p=p->link;
}while(p!=llist->link);
if(p==llist->link)
printf("cannot find\n");
return NULL;
}
PNode locatePre_link(LinkList llist,PNode p)//定位前驱结点
{
PNode q=llist->link;
do
{
if(q->link==p)
return q;
q=q->link;
}while(q!=llist->link);
return q;
}
void deleteP_link(LinkList llist,PNode p)//删除一个位置上的人
{
if(p==llist)printf("cannot delete\n");
PNode q=locatePre_link(llist,p);
q->link=p->link;
free(p);
}
void deleteV_link(LinkList llist,int x)
{
PNode q=locate_link(llist,x);
deleteP_link(llist,q);
}
PNode locateC_link(LinkList llist,PNode p,int m)//定位从p开始报数报到m的那个人
{
int i=1; while(i<m)
{
p=p->link;
i++;
}
return p;
}
void SetList_link(LinkList llist)
{
int i=1,n;
printf("how many people are there in all:");
scanf("%d",&n);
PNode q=llist;
while(i<=n)
{
insertPost_link(llist,q,i);
i++;
q=q->link;
}
}
void ShowList_link(LinkList llist)
{
PNode q=llist->link;
do
{
printf("%d ",q->info);
q=q->link;
}while(q!=llist->link);
printf("\n");
}
int main()
{
LinkList llist=createNullList_link();
SetList_link(llist);
ShowList_link(llist);
PNode q=llist->link;
while(q->link!=q)
{
printf("%d\n",locateC_link(llist,q,4)->info);
PNode r=locatePre_link(llist,locateC_link(llist,q,4));
deleteP_link(llist,locateC_link(llist,q,4));
ShowList_link(llist);
q=r->link;
}
ShowList_link(llist);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询