#include <stdio.h>
#include <stdlib.h>
//结构创建
typedef struct date
{
int num;
struct date *next;
} Date, *List;
//主函数
int main()
{
int i;
int n, m;//猴子个数,删去的猴子数
int answer[100];//记录每一个输出答案,
int count = 0;//记录答案的数目
List head, tail, p, q;//头指针,尾指针,新节点,上一个结点
head = (List)malloc(sizeof(Date));
head->next = NULL;//创立头结点
while (1)//进行循环
{
scanf("%d %d", &n, &m);
if (n == 0 || m == 0)//输入n=0,m=0,结束循环
{
free(head);//释放头结点
break;
}
else
{
//建立循环链表
tail = head;
for (i = 0; i < n; i++)
{
p = (List)malloc(sizeof(Date));
p->num = i + 1;//猴子的编码
tail->next = p;
p->next = head->next;//最后结点指向第一个元素结点,形成循环链表
tail = p;//尾指针指向最后一个结点,为下一次插入做准备
}
p = head->next;
q = tail;//q在p前
i = 1;
while (p != q)
{
if (i == m)//如果编号为删去的猴子
{
q->next = p->next;
free(p);
p = q->next;//继续下一轮
i = 1;//重新从1开始数
}
else//还没找到该编号的猴子
{
q = p;
p = p->next;
i++;//报数加1
}
}
head->next=q;//可以加上这一句,最后剩两个结点,删除第一个结点时可能造成链表不完整(头结点与唯一元素结点断开)
answer[count] = p->num;//储存答案
count++;
free(p);
head->next = NULL;
}
}
for (i = 0; i < count; i++)//输出答案
{
printf("%d\n", answer[i]);
}
free(head);
return 0;
}
#include <stdio.h>
#include <malloc.h>
int n, m; //n:元素个数 m:要删除的元素
//结构建立
typedef struct date
{
int num;
struct date *next;
} Date, *List;
//分段函数
List create(int n); //链表创建
List delete_list(List head, int m); //链表结点删除
void diaplay(List head); //链表输出
//主函数
int main()
{
List head;
scanf("%d", &n);
head = create(n);
//diaplay(head);
scanf("%d", &m);
head = delete_list(head, m);
diaplay(head);
return 0;
}
//链表创建
List create(int n)
{
int i;
List head = (List)malloc(sizeof(Date));
head->next = NULL; //头结点
List rear = head;
//建立链表
for (i = 0; i < n; i++)
{
List newdate = (List)malloc(sizeof(Date));
scanf("%d", &newdate->num);
newdate->next = NULL;
rear->next = newdate;
rear = newdate;
}
//diaplay(head);//检查
return head;
}
//链表结点删除
List delete_list(List head, int m)
{
List p = head->next; //指向第一个元素
List q = head;
while (p != NULL)
{
if (p->num == m) //如果找到要删除的元素
{
q->next = p->next;
free(p); //释放该元素
p = q->next; //重新建立p在q的后面,继续寻找下一个元素
}
else //没找到该元素继续向下找
{
q = p;
p = p->next;
}
}
return head;
}
//链表输出
void diaplay(List head)
{
List p = head->next; //指向第一元素
while (p != NULL)
{
printf("%d ", p->num);
p = p->next; //继续输出
}
}
#include<stdio.h>
#include<string.h>
#include<malloc.h>
//结构创立
typedef struct node
{
char num[25];
char name[45];
char sex[10];
char age[10];
char score[10];
char add[45];
struct node *next;
}Node,*Link;
//链表创立
Link newList()
{
Node *head=NULL,*node=NULL;
head=(Link)malloc(sizeof(Node));//头节点
head->next=NULL;
while(1)//链表
{
node=(Link)malloc(sizeof(Node));
scanf("%s",node->num);
if(strcmp(node->num,"end")==0) break;
scanf("%s %s %s %s %s",node->name,node->sex,node->age,node->score,node->add);
node->next=head->next;
head->next=node;
}
return head;//返回
}
void dispalyNode(Link head)//传入链表
{
Link p;
p=head->next;//指向链表第一个数据
while(p!=NULL)
{
printf("%s %s %s %s %s %s\n",p->num,p->name,p->sex,p->age,p->score,p->add);
p=p->next;
}
}
int main()
{
Link head = newList();//链表的创建
dispalyNode(head);//链表的输出
return 0;
}