|
本帖最后由 geige 于 2015-7-26 00:48 編輯
#include<stdio.h>
#include<stdlib.h>
struct stu //構建一個新的數據類型
{
int num;
struct stu *next;
};
struct stu *createlist(int n); //函數聲明
int main()
{
struct stu *head,*p,*temp; //定義頭指針,以及中間指針temp,用來刪除節點
int n,m,i,j=1,flag=0;
printf("Please input n and m:\n");
scanf("%d%d",&n,&m);
head=createlist(n); //調用函數來創建鏈表并返回頭指針賦值給head
p=head->next; //將首節點的地址賦值給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; //如果刪除的是首結點,那么將第二個節點作為首節點
temp->next=p->next;
p=temp->next;
j=1;
flag++;
}
else
{
j++;
temp=p;
p=p->next;
}
}
}
n=n-flag; //退出的人數要減去
flag=0;
p=head->next; //將首節點重新賦給p
}
printf("%d\n",temp->num); //輸出最后一個數
}
free(p); //釋放內存
return 0;
}
struct stu *createlist(int n)
{
int i;
struct stu *phead=(struct stu*)malloc(sizeof(struct stu)),*ptail; //申請頭結點
if(phead==NULL)
{
printf("Not able apply for memory !\n");
return 0;
}
ptail=phead; //
ptail->next=NULL; //將頭結點的下一個地址置空
for(i=1;i<=n;i++)
{
struct stu *pnew=(struct stu*)malloc(sizeof(struct stu)); //開辟新的節點
if(pnew==NULL)
{
printf("Not able apply for memory !\n");
return 0;
}
pnew->num=i;
ptail->next=pnew;
pnew->next=NULL;
ptail=pnew; //節點前移
}
return phead; //返回頭指針
}
|
|