| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1170 人关注过本帖
标题:自己写的约瑟夫程序,出了点问题
只看楼主 加入收藏
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
 问题点数:0 回复次数:9 
自己写的约瑟夫程序,出了点问题

#include<stdio.h>
#include<malloc.h>
#include<conio.h>

typedef struct node{
char name; //链表中数据项为成员名字
struct node *next;
}LinkList;
//数据结点

typedef struct{
int length;
struct node *next;
}Tnode;
//头结点
Tnode *head=NULL;

Tnode *CreatList()
{//头插法建立链表
Tnode *head;
LinkList *p;
unsigned char fg;
head=(Tnode *)malloc(sizeof(Tnode));
head->next=NULL;
head->length=0;
printf("请输入参加的成员的名单:并以@结束!\n");
scanf("%c",&fg);
while(fg!='@')
{
p=(LinkList *)malloc(sizeof(LinkList));
head->length++; //头结点中存储链表中的数据结点数目
p->name=fg;
p->next=head->next;
head->next=p;
scanf("%c",&fg);
}
if(fg=='@') printf("成员输入结束!\n");
return head;
}

int EmptyList(Tnode *head)
{//判断链表是否为空表是就返回1,不是则返回0
if(head->length==0)
return 1;
else return 0;
}

LinkList *LocateList(Tnode *head,int number)
{//返回number-1号结点的地址,number大于1
LinkList *p=head->next;
int i=1;
while(i<(number-1))
{
p=p->next;
i++;
}
return p;
}

void DeleteList(Tnode *head,int number)
{//删除序号为number号的结点
LinkList *p,*q;
if(number<0||number>head->length)
{
printf("number输入有误!");

return;
}
if(number==1)
{
q=head->next;
head->next=head->next->next;
head->length=head->length-1;
printf("%c ",q->name); //打印出被删除的结点中的数据项
free(q);
}
else
{
p=LocateList(head,number);
q=p->next;
p->next=q->next;
head->length=head->length-1;
printf("%c ",q->name);
free(q);
}
}


void FunList(Tnode *head,int n)
{//报到n的人出列 //约瑟夫
int number=0;
int j=0;
int count=0;
do{
count++;
j++;
if(count==n)
{
count=0;
number=j%(head->length);
j=j-1;
DeleteList(head,number);
}
}while(!EmptyList(head));
}


void main()
{
int tag;
CreatList();
printf("请输入几号出列:\n");
scanf("%d",&tag);
FunList(head,tag);
getch();
}

Loaded 'C:\WINDOWS\system32\usp10.dll', no matching symbolic information found.
First-chance exception in Cpp1.exe: 0xC0000005: Access Violation.

这是错误代码,并且还打了个箭头指向 if(head->length==0) 这句!
不知道出现了什么问题

[此贴子已经被作者于2007-9-30 22:31:57编辑过]

搜索更多相关主题的帖子: 约瑟夫 
2007-09-30 13:05
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
出了什么问题,你得说清楚.

倚天照海花无数,流水高山心自知。
2007-09-30 20:40
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
得分:0 

楼上版主帮忙找下问题,谢谢!


执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-10-06 15:25
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 

哎` 算了`` 难得看了` 我这里有个现成的`
#include <stdio.h>
#include <malloc.h>

typedef struct PNode
{
int num;
struct PNode *next;
}Node;

void main()
{
int amount,start,cir,n,c;
Node *head,*p,*q;

printf("一共有几个人围成一圈?\n");
scanf("%d",&amount);
getchar();
printf("从第几个开始计数?\n");
scanf("%d",&start);
getchar();
printf("每几人一次循环?\n");
scanf("%d",&cir);
getchar();

head=(Node *)malloc(sizeof(Node));
head->next=NULL;
head->num=0;
q=head;

n=1;
for(n;n<=amount;n++)
{
p=(Node *)malloc(sizeof(Node));
p->next=NULL;
p->num=n;
q->next=p;
q=p;
}
q->next=head->next;

p=head->next;
q=head;

n=1;
for(n;n<start;n++)
{
p=p->next;
q=q->next;
}
n=1;
for(n;n<amount;n++)
{
c=1;
for(c;c<cir;c++)
{
p=p->next;
q=q->next;
}
printf("The delet num is: %d\t",p->num);
q->next=p->next;
p=p->next;
}
printf("\nThe last num is:%d\n",p->num);
}


2007-10-06 18:35
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

typedef struct node{
char name; //链表中数据项为成员名字
struct node *next;
}LinkList;
//数据结点

typedef struct{
int length;
struct node *next;
}Tnode;
//头结点

为什么要用两个结构体.


倚天照海花无数,流水高山心自知。
2007-10-06 21:57
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
得分:0 

两个结构体没关系吧!
好象算法错了,不用循环链表好象做不起来...


执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-10-09 20:15
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
得分:0 
版主,可以要下你的QQ吗?本人在自学数据结构,那样的话,有问题可以直接问你!给我邮箱也行,不方便说的话可以发QQ或者油箱地址到chenhuming@yahoo.com.cn,希望能够满足我这个奢侈的要求!

执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-10-09 20:20
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
收藏
得分:0 

恩,我也发表发表,
先说错了,
错了很多,不过设计很好
结构体二个,很好,可是
你的使用好像只在使用一个结构体。
在void main()函数中
链表实体没有定义,
在create ()函数中应该返回一个指针,在main()中调用是直接的。
应该在定义一个
你这里一言二语也说不清,不过你的思想一定也没错,只是编的时候有些东西搞错了。
呵呵,你是自学的呀,不错呀
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#define head->next head->head->next//这样就会减少代码改变,要不然改得也太多。

typedef struct node{
char name; //链表中数据项为成员名字
struct node *next;
}LinkList;
//数据结点

typedef struct{
int length;
struct node *next;//next 改为head
}Tnode;
//头结点
Tnode *head=NULL;//这个不用定义。

Tnode *CreatList( Tnode *head)
{//头插法建立链表

LinkList *p;
unsigned char fg;
head=(Tnode *)malloc(sizeof(Tnode));这里应该是P
head->next=NULL;//head->head->next=NULL
head->length=0;
printf("请输入参加的成员的名单:并以@结束!\n");
scanf("%c",&fg);
while(fg!='@')
{
p=(LinkList *)malloc(sizeof(LinkList));
head->length++; //头结点中存储链表中的数据结点数目
p->name=fg;
p->next=head->next;//p->nexthead->head->next
head->next=p;//head->head->next=NULL
scanf("%c",&fg);
}
if(fg=='@') printf("成员输入结束!\n");
return head;
}

int EmptyList(Tnode *head)
{//判断链表是否为空表是就返回1,不是则返回0
if(head->length==0)
return 1;
else return 0;
}

LinkList *LocateList(Tnode *head,int number)
{//返回number-1号结点的地址,number大于1
LinkList *p=head->next;//head->head->next;
int i=1;
while(i<(number-1))
{
p=p->next;
i++;
}
return p;
}

void DeleteList(Tnode *head,int number)
{//删除序号为number号的结点
LinkList *p,*q;
if(number<0||number>head->length)
{
printf("number输入有误!");

return;
}
if(number==1)
{
q=head->next;
head->next=head->next->next;//head->head->next=head->head->next
head->length=head->length-1;
printf("%c ",q->name); //打印出被删除的结点中的数据项
free(q);
}
else
{
p=LocateList(head,number);
q=p->next;
p->next=q->next;
head->length=head->length-1;
printf("%c ",q->name);
free(q);
}
}


void FunList(Tnode *head,int n)
{//报到n的人出列 //约瑟夫
int number=0;
int j=0;
int count=0;
do{
count++;
j++;
if(count==n)
{
count=0;
number=j%(head->length);
j=j-1;
DeleteList(head,number);
}
}while(!EmptyList(head));
}


void main()
{还要定义一个表。
LinkList *L;

int tag;
CreatList();这个定义时是返回头指针,可是没有形参。应该是CreatList(L)
printf("请输入几号出列:\n");
scanf("%d",&tag);
FunList(head,tag);
getch();
}
呵呵,改一下,不介意吧,也不知道对不对,在网吧

2007-10-11 18:36
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
得分:0 

不管怎么样,还是谢谢你了!
总算有人回下!呵呵


执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-10-12 20:09
discus815
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2007-10-11
收藏
得分:0 

楼主指针那么多,我都指晕了,不过真的有认真去看看,而且在visual c++中有运行一点


旋转的木马,没有翅膀,但是却可以带着你飞翔.......
2007-10-13 09:51
快速回复:自己写的约瑟夫程序,出了点问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028333 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved