1 //create 函数用传指针方式没法创建链表?
2
3 #include<stdio.h>
4 #include<stdlib.h>
5 struct Person
6 {
7 int num;
8 struct Person *next;
9 };
10
11 int main()
12 {
13 struct Person* p=NULL;
14 int n,m;
15 scanf("%d%d",&n,&m);
16 void create(struct Person*,int); //用 struct Person* create(int);就可以
17 int Yue(struct Person*,int,int);
18 create(p,n); //改为p=create(n);就可以
19 printf("%d\n",Yue(p,n,m));
20 return 0;
21 }
22
23 void create(struct Person* p,int n) //问题:为什么这种方式不能成功创建新链表?
24 {
25 struct Person *p1,*p2; //改为:struct Person *head,*p1,*p2;
26 p1=(struct Person *)malloc(sizeof(Person));
27 int i=0;
28 while(i<n)
29 {
30 i++;
31 p1->num=i;
32 if(i==1) p=p2=p1; //改为:if(i==1) head=p2=p1;
33 else
34 {
35 p2->next=p1;
36 p2=p1;
37 }
38 p1=(struct Person *)malloc(sizeof(Person));
39 }
40 p2->next=NULL;
41 free(p1);
42 p1=NULL;
43 //加一行:return head;
44 }
45
46 int Yue(struct Person* p,int n,int m)
47 {
48 int i=0,j=1,k=0;
49 struct Person *q,*r;
50 q=r=p;
51 while(k<n-1)
52 {
53 i++;
54 j++;
55
56 if(i!=1) r=r->next;
57 if(r==NULL) r=p;
58
59 q=q->next;
60 if(q==NULL) q=p;
61
62 if(j==m)
63 {
64 j=1;
65 k++;
66 if(q==p)
67 {
68 p=p->next;
69 q->next=NULL;
70 free(q);
71 q=p;
72 }
73 else if(q->next==NULL)
74 {
75 r->next=NULL;
76 free(q);
77 q=p;
78 }
79 else
80 {
81 r->next=q->next;
82 free(q);
83 q=r->next;
84 }
85 }
86 }
87 return q->num;
88 }