PTA——链表——相关习题(程设二)

 


今天又是整理代码的一天呐

(      。_ 。) ✎ _

 

 (逃!)

 

 代码链接

Ubuntu Pastebin

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct Node
 5 {
 6     int data;
 7     struct Node *next;
 8 }node;
 9 
10 node *creat(int n)   //尾插法建立链表
11 {
12     
13     node *head,*p,*tail;    //创建新节点并置空
14     head=(node*)malloc(sizeof(node));
15     
16     head->next=NULL;
17     tail=head;  //此时只有链表中只有一个节点
18     
19     for(int i=0;i<n;i++)
20     {
21         p=(node*)malloc(sizeof(node));  //开辟新节点
22         scanf("%d",&p->data);
23         
24         p->next=NULL;
25         tail->next=p;
26         tail=p;  //将tail更新为p,相当于尾部多了一个节点,此时tail仍然指的是尾部
27     }
28     return head;    //返回头节点
29     
30 }
31 
32 void pri(node *p)
33 {
34     while(p)//遍历链表
35     {
36         if(p->next==NULL)
37         printf("%d",p->data);
38         else printf("%d ",p->data);
39         p=p->next;
40     }
41 }
42 
43 void solve()
44 {
45     
46     int n;
47     scanf("%d", &n);
48     
49     node *head;
50     head=creat(n);  //建立链表
51     
52     pri(head->next);    //遍历输出链表的值
53     
54 }
55 
56 int main()
57 {
58     
59     int T=1;
60         //scanf("%d",&T);
61     while(T--)
62         solve();
63     
64     return 0;
65 }
View Code

 

 

 代码链接

 

Ubuntu Pastebin

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct Node
 5 {
 6     int data;
 7     struct Node *next;
 8 }node;
 9 
10 node *creat(int n)   //头插法建立链表
11 {
12     
13     node *head,*p;  //创建新节点并置空
14     
15     head=(node*)malloc(sizeof(node));
16     head->next=NULL;
17     
18     for(int i=0;i<n;i++)
19     {
20         p=(node*)malloc(sizeof(node));
21         scanf("%d",&p->data);
22         
23         p->next=head->next;   //p现在指向head的下一位
24         head->next=p;   //再让head指向p相当于p完成了插入操作,插到了head和head->next的中间部分
25     }
26     
27     return head;    //返回头节点
28     
29 }
30 
31 void pri(node *p)
32 {
33     while(p)//遍历链表
34     {
35         if(p->next==NULL)
36         printf("%d",p->data);
37         else printf("%d ",p->data);
38         p=p->next;
39     }
40 }
41 
42 void solve()
43 {
44     
45     int n;
46     scanf("%d", &n);
47     
48     node *head;
49     head=creat(n);  //建立链表
50     
51     pri(head->next);    //遍历输出链表的值
52     
53 }
54 
55 int main()
56 {
57     
58     int T=1;
59         //scanf("%d",&T);
60     while(T--)
61         solve();
62     
63     return 0;
64 }
View Code

 

 

 代码链接

Ubuntu Pastebin

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct Node
 5 {
 6     int data;
 7     struct Node *next;
 8 }node;
 9 
10 node *creat()   //头插法建立链表
11 {
12     
13     int k;
14     node *head,*p,*tail;
15     
16     head=(node*)malloc(sizeof(node));
17     head-> next = NULL;
18     tail=head;
19     
20     while(~scanf("%d",&k) && k!=-1)
21     {
22         p=(node*)malloc(sizeof(node));
23         p->data=k;
24         p->next=NULL;
25         tail->next=p;
26         tail=p;
27     }
28     
29     return head;
30     
31 }
32 
33 void reserve(node *head)//倒置
34 {
35     node *p,*s; //定义两个指针
36     
37     p=head->next;   
38     head->next=NULL;
39     
40     while(p)
41     {
42         s=p;
43         p=p->next;  //p和s是两个相邻的指针(p在s后面一位)
44         s->next=head->next;     //s->next第一次置空,第二次指向第一个数,遍历(参考下一行)
45         head->next=s;   //head指向的位置越来越靠后
46     }
47 }
48 
49 void pri(node *p)
50 {
51     while(p)//遍历链表
52     {
53         if(p->next==NULL)
54         printf("%d\n",p->data);
55         else printf("%d ",p->data);
56         p=p->next;
57     }
58 }
59 
60 void solve()
61 {
62     node *head;
63     
64     head=creat();  //建立链表
65     
66     reserve(head);
67     
68     pri(head->next);
69     
70 }
71 
72 int main()
73 {
74     
75     int T=1;
76         //scanf("%d",&T);
77     while(T--)
78         solve();
79     
80     return 0;
81 }
View Code

 

 代码链接

Ubuntu Pastebin

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef struct Node
  5 {
  6     int data;
  7     struct Node *next;
  8 }node;
  9 
 10 node *creat(int n)   //尾插法建立链表
 11 {
 12     
 13     node *head,*p,*tail;    //创建新节点并置空
 14     head=(node*)malloc(sizeof(node));
 15     
 16     head->next=NULL;
 17     tail=head;  //此时只有链表中只有一个节点
 18     
 19     for(int i=0;i<n;i++)
 20     {
 21         p=(node*)malloc(sizeof(node));  //开辟新节点
 22         scanf("%d",&p->data);
 23         
 24         p->next=NULL;
 25         tail->next=p;
 26         tail=p;  //将tail更新为p,相当于尾部多了一个节点,此时tail仍然指的是尾部
 27     }
 28     return head;    //返回头节点
 29     
 30 }
 31 
 32 node *Merge(node *head1,node *head2)  //归并算法 典中典了属于是
 33 {
 34     
 35     node *p1,*p2,*tail;
 36     
 37     p1=head1->next;
 38     p2=head2->next;
 39     tail=head1;
 40     
 41     while(p1 && p2)
 42     {
 43         if(p1->data<=p2->data)  //比较两个data的值看指针指向哪一个
 44         {
 45             tail->next=p1;
 46             tail=p1;
 47             p1=p1->next;
 48         }
 49         else
 50         {
 51             tail->next=p2;
 52             tail=p2;
 53             p2=p2->next;
 54         }
 55     }
 56     if(p1)      //跳出循环是因为有一方数据输入完毕,判断哪个链表还有剩余,接上尾巴即可
 57         tail->next=p1;
 58     else
 59         tail->next=p2;
 60         
 61     return head1;
 62     
 63 }
 64 
 65 void pri(node *p)
 66 {
 67     while(p)//遍历链表
 68     {
 69         if(p->next==NULL)
 70         printf("%d",p->data);
 71         else printf("%d ",p->data);
 72         p=p->next;
 73     }
 74 }
 75 
 76 void solve()
 77 {
 78     
 79     int n,m;
 80     scanf("%d %d", &n,&m);
 81     
 82     node *head1,*head2;
 83     
 84     head1=creat(n); 
 85     head2=creat(m);  //建立链表
 86     
 87     head1=Merge(head1,head2);
 88     
 89     pri(head1->next);    //遍历输出链表的值
 90     
 91 }
 92 
 93 int main()
 94 {
 95     
 96     int T=1;
 97         //scanf("%d",&T);
 98     while(T--)
 99         solve();
100     
101     return 0;
102 }
View Code

 

 代码链接

Ubuntu Pastebin

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef struct Node
  5 {
  6     int data;
  7     struct Node *next;
  8 }node;
  9 
 10 int n;
 11 int len1,len2;
 12 
 13 node *creat(int n)   //尾插法建立链表
 14 {
 15     
 16     node *head,*p;  //创建新节点并置空
 17     
 18     head=(node*)malloc(sizeof(node));
 19     head->next=NULL;
 20     
 21     for(int i=0;i<n;i++)
 22     {
 23         p=(node*)malloc(sizeof(node));
 24         scanf("%d",&p->data);
 25         
 26         p->next=head->next;   //p现在指向head的下一位
 27         head->next=p;   //再让head指向p相当于p完成了插入操作,插到了head和head->next的中间部分
 28     }
 29     
 30     return head;    //返回头节点
 31     
 32 }
 33 
 34 node *Divide(node *head1)
 35 {
 36     node *head2,*p,*s;
 37     head2=(node*)malloc(sizeof(node));
 38     
 39     head2->next=NULL;
 40     p=head1->next;
 41     s=p->next;
 42     head1->next=NULL;
 43     
 44     while(p)
 45     {
 46         if(p->data%2==0)
 47         {
 48             len1++;
 49             p->next=head1->next;
 50             head1->next=p;
 51         }
 52         else
 53         {
 54             len2++;
 55             p->next=head2->next;
 56             head2->next=p;
 57         }
 58         p=s;
 59         if(s)
 60             s=s->next;
 61     }
 62     return head2;
 63 }
 64 
 65 void pri(node *p)
 66 {
 67     while(p)//遍历链表
 68     {
 69         if(p->next==NULL)
 70         printf("%d\n",p->data);
 71         else printf("%d ",p->data);
 72         p=p->next;
 73     }
 74 }
 75 
 76 void solve()
 77 {
 78     
 79     scanf("%d",&n);
 80     
 81     node *head1,*head2;
 82     
 83     head1=creat(n);
 84     head2=Divide(head1);
 85     
 86     printf("%d %d\n",len1,len2);
 87     
 88     pri(head1->next);
 89     pri(head2->next);
 90     
 91 }
 92 
 93 int main()
 94 {
 95     
 96     int T=1;
 97         //scanf("%d",&T);
 98     while(T--)
 99         solve();
100     
101     return 0;
102 }
View Code

 

 

 相关代码

Ubuntu Pastebin

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct Node
 5 {
 6     int data;
 7     struct Node *next;
 8 }node;
 9 int n;
10 node *creat(int n)   //尾插法建立链表
11 {
12     
13     node *head,*p;  //创建新节点并置空
14     
15     head=(node*)malloc(sizeof(node));
16     head->next=NULL;
17     
18     for(int i=0;i<n;i++)
19     {
20         p=(node*)malloc(sizeof(node));
21         scanf("%d",&p->data);
22         
23         p->next=head->next;   //p现在指向head的下一位
24         head->next=p;   //再让head指向p相当于p完成了插入操作,插到了head和head->next的中间部分
25     }
26     
27     return head;    //返回头节点
28     
29 }
30 
31 void pri(node *p)
32 {
33     while(p)//遍历链表
34     {
35         if(p->next==NULL)
36         printf("%d\n",p->data);
37         else printf("%d ",p->data);
38         p=p->next;
39     }
40 }
41 
42 void solve()
43 {
44     
45     scanf("%d", &n);
46     
47     node *head,*p;
48     head=creat(n);  //建立链表
49     
50     printf("%d\n",n);
51     pri(head->next);    //遍历输出链表的值
52     
53     node *q,*k;
54     p=head->next;
55     q=head;
56     while(p)    //可以看作暴力对比
57     {
58         int flag=1;
59         k=head->next;
60         while(k!=p)
61         {
62             if(k->data==p->data)
63             {
64                 flag=0;
65                 n--;
66                 q->next=p->next;
67                 p=p->next;
68                 break;
69             }
70             k=k->next;
71         }
72         if(flag)
73         {
74             p=p->next;
75             q=q->next;
76         }
77     }
78     printf("%d\n",n);
79     pri(head->next);
80 }
81 
82 int main()
83 {
84     
85     int T=1;
86         //scanf("%d",&T);
87     while(T--)
88         solve();
89     
90     return 0;
91 }
View Code

 

 代码链接

Ubuntu Pastebin

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct Node
 5 {
 6     int data;
 7     struct Node *next;
 8 }node;
 9 
10 void Insert(node *head,int m,int k)
11 {
12     node *q=(node*)malloc(sizeof(node));    //q相当于应该插入的节点
13     node *p=head;
14     q->data=k;
15     for(int i=0;i<m && p->next!=NULL;i++)
16         p=p->next;      //找到q插入的位置
17     q->next=p->next;    //用头节点插入的方法插入q节点
18     p->next=q;
19 }
20 
21 void pri(node *p)
22 {
23     while(p)//遍历链表
24     {
25         if(p->next==NULL)
26         printf("%d",p->data);
27         else printf("%d ",p->data);
28         p=p->next;
29     }
30 }
31 
32 void solve()
33 {
34     
35     int n;
36     while(~scanf("%d",&n))
37     {
38         node *head,*p;
39         head=(node*)malloc(sizeof(node));
40         head->next=NULL;
41         for(int i=0;i<n;i++)
42         {
43             int m,k;
44             scanf("%d%d",&m,&k);
45             
46             Insert(head,m,k);
47         }
48         pri(head->next);
49         puts("");
50     }
51     
52 }
53 
54 int main()
55 {
56     
57     int T=1;
58         //scanf("%d",&T);
59     while(T--)
60         solve();
61     
62     return 0;
63 }
View Code

 

 代码链接

Ubuntu Pastebin

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <malloc.h>
 4 
 5 typedef struct Node
 6 {
 7     int data;
 8     struct Node *next;
 9 }node;
10 
11 node *creat(int n)
12 {
13     node *head,*p,*tail;
14     p=(node*)malloc(sizeof(node));
15     
16     p->data=1;
17     p->next=NULL;
18     head=p;
19     tail=p;
20     
21     for(int i=2; i<=n; i++) //现在head=tail=p=1,从2开始正向建立链表(尾插法)
22     {
23         p=(node*)malloc(sizeof(node));  
24             
25         p->data=i;
26         p->next=NULL;
27         tail->next=p;
28         tail=p;
29     }
30     tail->next=head; //首尾相连
31     
32     return head;
33 }
34 
35 void solve()
36 {
37     
38     int n,m;
39     int cnt=0;
40     
41     scanf("%d %d",&n,&m);
42     node *head,*p,*s;
43     
44     head=creat(n);
45     s=head;
46     
47     while(s->next!=head)    //s表示为队尾的元素
48         s=s->next;
49         
50     while(s->next!=s)   //当链表中直剩下一个元素时跳出
51     {
52         p=s->next;  //第一轮第一个数是链表中第一个元素,所以起始应该是队尾的元素(p在s前面)
53         cnt++;//每次喊数字
54         if(cnt==m)
55         {
56             s->next=p->next;
57             free(p);    //释放节点p,并将cnt归零重新计数
58             cnt=0;
59         }
60         else
61             s=p;
62     }
63     printf("%d",s->data);
64     
65     
66     
67 }
68 
69 int main()
70 {
71     
72     int T=1;
73         //scanf("%d",&T);
74     while(T--)
75         solve();
76     
77     return 0;
78 }
View Code

 

 

 代码链接

Ubuntu Pastebin

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct Node
 5 {
 6     int data;
 7     struct Node *next;
 8     struct Node *front;
 9 }node;
10 
11 node *creat(int n)   //尾插法建立链表
12 {
13     
14     node *head,*p,*tail;    //创建新节点并置空
15     head=(node*)malloc(sizeof(node));
16     
17     head->next=NULL;
18     head->front=NULL;
19     tail=head;  //此时只有链表中只有一个节点
20     
21     for(int i=0;i<n;i++)
22     {
23         p=(node*)malloc(sizeof(node));  //开辟新节点
24         scanf("%d",&p->data);
25         
26         p->next=NULL;
27         tail->next=p;
28         p->front=tail;  //多了一个前节点
29         tail=p;  //将tail更新为p,相当于尾部多了一个节点,此时tail仍然指的是尾部
30     }
31     return head;    //返回头节点
32     
33 }
34 
35 void solve()
36 {
37     
38     int n,m;
39     scanf("%d %d", &n, &m);
40     
41     node *head;
42     head=creat(n);  //建立链表
43     
44     while(m--)
45     {
46         int k;
47         scanf("%d",&k);
48         
49         node *p=head->next;
50         while(p->data!=k)
51             p=p->next;
52         if(p->front==head)
53             printf("%d\n",p->next->data);
54         else if(p->next==NULL)
55             printf("%d\n",p->front->data);
56         else
57             printf("%d %d\n",p->front->data,p->next->data);
58     }
59     
60 }
61 
62 int main()
63 {
64     
65     int T=1;
66         //scanf("%d",&T);
67     while(T--)
68         solve();
69     
70     return 0;
71 }
View Code

 

 代码链接

Ubuntu Pastebin

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <malloc.h>
 4 
 5 typedef struct Node
 6 {
 7     int data;
 8     struct Node *next;
 9 }node;
10 
11 node *creat(int n)
12 {
13     node *head,*p,*tail;
14     p=(node*)malloc(sizeof(node));
15     
16     p->data=1;
17     p->next=NULL;
18     head=tail=p;
19     
20     for(int i=2; i<=n; i++) //现在head=tail=p=1,从2开始正向建立链表(尾插法)
21     {
22         p=(node*)malloc(sizeof(node));  
23             
24         p->data=i;
25         p->next=NULL;
26         tail->next=p;
27         tail=p;
28     }
29     tail->next=head; //首尾相连
30     
31     return head;
32 }
33 
34 void solve()
35 {
36     
37     int n;
38     while(~scanf("%d",&n) && n)
39     {
40         node *head,*p,*s;
41         int cnt=0,ans=0;
42         
43         head=creat(n);
44         s=head;
45         
46         while(s->next!=head)
47             s=s->next;
48             
49         while(s->next!=s)
50         {
51             p=s->next;
52             cnt++;
53             if(cnt==5)
54             {
55                 ans++;
56                 if(p->data==1)
57                     break;
58                 s->next=p->next;
59                 free(p);
60                 cnt=0;
61             }
62             else
63                 s=p;
64         }
65         if(s->data==1)      //最后一次循环提前结束,如果最后剩下一号的话需要单独判断
66             printf("%d\n",ans+1);
67         else
68             printf("%d\n",ans);
69     }
70     
71     
72     
73 }
74 
75 int main()
76 {
77     
78     int T=1;
79         //scanf("%d",&T);
80     while(T--)
81         solve();
82     
83     return 0;
84 }
View Code

小结

链表的代码较长若不充分李姐(理解)的情况下暴力背诵一般不会有什么好结果QAQ

重点是理解,懂得建表过程

 salute!

 

posted @ 2022-02-25 14:24  MrSugarT  阅读(74)  评论(0编辑  收藏  举报