找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4882|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語言:約瑟夫環(huán)問題(源代碼)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:86860 發(fā)表于 2015-7-26 00:46 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
本帖最后由 geige 于 2015-7-26 00:48 編輯


#include<stdio.h>
#include<stdlib.h>

struct stu //構(gòu)建一個新的數(shù)據(jù)類型
{
int num;

struct stu *next;

};

struct stu *createlist(int n);  //函數(shù)聲明
int main()
{
struct stu *head,*p,*temp;   //定義頭指針,以及中間指針temp,用來刪除節(jié)點(diǎn)

int n,m,i,j=1,flag=0;

printf("Please input n and m:\n");
scanf("%d%d",&n,&m);

head=createlist(n);          //調(diào)用函數(shù)來創(chuàng)建鏈表并返回頭指針賦值給head


p=head->next;                //將首節(jié)點(diǎn)的地址賦值給p

if(m==1)                     //如果m等于1,直接按順序輸出
{
while(p!=NULL)
{
printf("%d ",p->num);
p=p->next;
}

putchar('\n');
}

else
{

while(n!=1)
{
for(i=1;i<=n;i++)
{
if(p!=NULL)
{
if(j==m)
{
printf("%d ",p->num);

if(p==head->next)
head->next=p->next; //如果刪除的是首結(jié)點(diǎn),那么將第二個節(jié)點(diǎn)作為首節(jié)點(diǎn)
temp->next=p->next;
p=temp->next;
j=1;
flag++;
}
else
{
j++;
temp=p;
p=p->next;
}
}
}

n=n-flag; //退出的人數(shù)要減去
flag=0;
p=head->next; //將首節(jié)點(diǎn)重新賦給p
}

printf("%d\n",temp->num); //輸出最后一個數(shù)
}

free(p); //釋放內(nèi)存

    return 0;

}


struct stu *createlist(int n)
{
int i;

struct stu *phead=(struct stu*)malloc(sizeof(struct stu)),*ptail;  //申請頭結(jié)點(diǎn)

if(phead==NULL)
{
printf("Not able apply for memory !\n");

return 0;
}

ptail=phead; //
ptail->next=NULL; //將頭結(jié)點(diǎn)的下一個地址置空

for(i=1;i<=n;i++)
{
struct stu *pnew=(struct stu*)malloc(sizeof(struct stu)); //開辟新的節(jié)點(diǎn)

if(pnew==NULL)
{
printf("Not able apply for memory !\n");

return 0;
}

pnew->num=i;
ptail->next=pnew;
pnew->next=NULL;
ptail=pnew; //節(jié)點(diǎn)前移
}
return phead; //返回頭指針


}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表