筛选号码(c语言版)
1、#include<stdio.h>
#include <stdlib.h>
typedef struct node{
struct node *next;
int data;
}LinkList;
LinkList *CreatListH(int n)
{
LinkList *L,*S,*head;
int num=n-1;
L=(LinkList*)malloc(sizeof(LinkList));
head=L;
head->data=n;
L->next=head;
while(num>=1)
{
S=(LinkList*)malloc(sizeof(LinkList));
S->data=num;
S->next=L->next;
L->next=S;
num--;
}
return head;
}
LinkList *Count(LinkList *head)
{
LinkList *p,*u;
int count=0;
p=head;
while(p->next!=p)
{
count++;
p=p->next;
if(count==2)
{
u=p->next;
p->next=u->next;
free(u);
count=0;
}
}
printf("%d\n",p->data);
}
int main()
{
LinkList *head;
int n;
scanf("%d",&n);
head=CreatListH(n);
Count(head);
return 0;
}

2、本题采用链表遍历的方法,根据题意每遍历3个,则删除第三个结点的数据。删除到最后所剩的一个即为所求,链表采用单向循环链表。
while(p->next!=p)
{
count++;
p=p->next;
if(count==2)//此处删除的是p->next,所以是2
{
u=p->next;
p->next=u->next;
free(u);
3、此外采用头插法创建链表,为符合题目意思,在链表中存储数据时,数据逆序存储,如果采用尾插法,则顺序存储即可。
LinkList *CreatListH(int n)
{
LinkList *L,*S,*head;
int num=n-1;
L=(LinkList*)malloc(sizeof(LinkList));
head=L;//所有节点都存储数据
head->data=n;
L->next=head;
while(num>=1)
{
S=(LinkList*)malloc(sizeof(LinkList));
S->data=num;
S->next=L->next;
L->next=S;
num--;//逆序存储
}