数据结构总结:(二)链表

白老师题目,把链表总结了一下:

Description

对于一元多项式  p(x)=p0+p1x+p2x2 +pnx ,每个项都有系数和指数两部分,例如p2x2的系数为p2,指数为2

编程实现两个多项式的相加
例如5+x+2x2+3x3-5-x+6x2+4x4,两者相加结果:8x2+3x3+4x4
其中系数5和-5都是x的0次方的系数,相加后为0,所以不显示。x的1次方同理不显示。
可用顺序表或单链表实现

 

Input

第1行:输入t表示有t组测试数据

第2行:输入n表示有第1组的第1个多项式包含n个项

第3行:输入第一项的系数和指数,以此类推输入n行

接着输入m表示第1组的第2个多项式包含m项

同理输入第2个多项式的m个项的系数和指数

参考上面输入第2组数据,以此类推输入t组

假设所有数据都是整数

 

Output

对于每1组数据,先用两行输出两个原来的多项式,再用一行输出运算结果,不必考虑结果全为0的情况

输出格式参考样本数据,格式要求包括:

1.如果指数或系数是负数,用小括号括起来

2.如果系数为0,则该项不用输出

3.如果指数不为0,则用符号^表示,例如x的3次方,表示为x^3

4.多项式的每个项之间用符号+连接,每个+两边加1个空格隔开

Sample Input

2 4 5 0 1 1 2 2 3 3 4 -5 0 -1 1 6 2 4 4 3 -3 0 -5 1 2 2 4 9 -1 2 0 3 1 -2 2

Sample Output

5 + 1x^1 + 2x^2 + 3x^3 (-5) + (-1)x^1 + 6x^2 + 4x^4 8x^2 + 3x^3 + 4x^4 (-3) + (-5)x^1 + 2x^2 9x^(-1) + 2 + 3x^1 + (-2)x^2 9x^(-1) + (-1) + (-2)x^1
 
 
代码:
 
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4  
 5 int A[200];
 6 int B[200];
 7  
 8 void print(int s[]){
 9     int i;
10     int flag = 1;
11     for(i=0;i<200;++i){
12         if(s[i]){
13             if(flag == 1){
14                 flag = 0;
15             }
16             else printf(" + ");
17             if(s[i]>0) printf("%d", s[i]);
18             else printf("(%d)", s[i]);
19             if(i != 100) printf("x^");
20             if(i > 100) printf("%d", i-100);
21             if(i < 100)  printf("(%d)", i-100);
22         }
23     }
24     printf("\n");
25 }
26  
27 int main(int argc, char const *argv[])
28 {
29     int n, t, i, value, pos;
30     scanf("%d", &t);
31     while(t--){
32         memset(A, 0, sizeof(A));
33         memset(B, 0, sizeof(B));
34         scanf("%d", &n);
35         for(i=0;i<n;++i){
36             scanf("%d%d", &value, &pos);
37             A[pos+100] = value;
38         }
39         print(A);
40         scanf("%d", &n);
41         for(i=0;i<n;++i){
42             scanf("%d%d", &value, &pos);
43             B[pos+100] = value;
44         }
45         print(B);
46  
47         for(i=0;i<200;++i)
48             B[i]+=A[i];
49         print(B);
50     }
51     return 0;
52 }

 

Description

对于一元多项式 p(x)=p0+p1x+p2x2+pnx ,每个项都有系数和指数两部分,例如p2x2的系数为p2,指数为2
 
编程实现两个多项式的相乘
例如5+x-5+6x2,相乘结果:-25-5x+30x2+6x3
可用顺序表或单链表实现

 

Input

第1行:输入t表示有t组测试数据

第2行:输入n表示有第1组的第1个多项式包含n个项

第3行:输入第一项的系数和指数,以此类推输入n行

接着输入m表示第1组的第2个多项式包含m项

同理输入第2个多项式的m个项的系数和指数

参考上面输入第2组数据,以此类推输入t组

假设所有数据都是整数

Output

对于每1组数据,先用两行输出两个原来的多项式,再用一行输出运算结果,不必考虑结果全为0的情况

输出格式参考样本数据,格式要求包括:

1.如果指数或系数是负数,用小括号括起来

2.如果系数为0,则该项不用输出

3.如果指数不为0,则用符号^表示,例如x的3次方,表示为x^3

4.多项式的每个项之间用符号+连接,每个+两边加1个空格隔开

 

Sample Input

2 2 5 0 1 1 2 -5 0 6 2 3 1 0 1 1 1 2 3 2 -1 -1 0 -1 1

Sample Output

5 + 1x^1 (-5) + 6x^2 (-25) + (-5)x^1 + 30x^2 + 6x^3 1 + 1x^1 + 1x^2 2x^(-1) + (-1) + (-1)x^1 2x^(-1) + 1 + (-2)x^2 + (-1)x^3
 
 
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4  
 5 int A[200],B[200],C[200],A1[100],B1[100];
 6  
 7 void print(int s[]){
 8     int i, flag = 1;
 9     for(i=0;i<200;++i){
10         if(s[i]){
11             if(flag == 1){flag = 0;}
12             else printf(" + ");
13             if(s[i]>0) printf("%d", s[i]);
14             else printf("(%d)", s[i]);
15             if(i != 100) printf("x^");
16             if(i > 100) printf("%d", i-100);
17             if(i < 100)  printf("(%d)", i-100);
18         }
19     }
20     printf("\n");
21 }
22  
23 int main(int argc, char const *argv[])
24 {
25     int n1, n2, n, t, i, j, value, pos;
26     scanf("%d", &t);
27     while(t--){
28         memset(A, 0, sizeof(A));
29         memset(B, 0, sizeof(B));
30         memset(C, 0, sizeof(C));
31         scanf("%d", &n1);
32         for(i=0;i<n1;++i){
33             scanf("%d%d", &value, &pos);
34             A[pos+100] = value;
35             A1[i] = pos+100;
36         }
37         print(A);
38  
39         scanf("%d", &n2);
40         for(i=0;i<n2;++i){
41             scanf("%d%d", &value, &pos);
42             B[pos+100] = value;
43             B1[i] = pos+100;
44         }
45         print(B);
46  
47         for(i=0;i<n1;++i){
48             for(j=0;j<n2;++j){
49                 C[A1[i]+B1[j]-100] += A[A1[i]] * B[B1[j]];
50             }
51         }
52         print(C);
53     }
54     return 0;
55 }

 

Description

用C++实现含头结点的单链表,然后实现单链表的两个结点交换位置。

注意不能简单交换两个结点包含数据,必须通过修改指针来实现两个结点的位置交换

交换函数定义可以参考:

swap(int  pa, int pb)  //pa和pb表示两个结点在单链表的位置序号

swap (ListNode * p, ListNode * q)  //p和q表示指向两个结点的指针

Input

第1行先输入n表示有n个数据,接着输入n个数据

第2行输入要交换的两个结点位置

第3行输入要交换的两个结点位置

 

 

Output

第一行输出单链表创建后的所有数据,数据之间用空格隔开

第二行输出执行第1次交换操作后的单链表数据,数据之间用空格隔开

第三行输出执行第2次交换操作后的单链表数据,数据之间用空格隔开

如果发现输入位置不合法,输出字符串error,不必输出单链表

Sample Input

5 11 22 33 44 55 1 4 2 6

Sample Output

11 22 33 44 55 44 22 33 11 55 error
 
 
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3  
 4 typedef struct node *link;
 5 typedef struct node{
 6     int data;
 7     link next;
 8 }Node;
 9 int n;
10  
11 void insert(int pos, int value, link L){
12     int i;
13     link y = malloc(sizeof(Node));
14     y->data = value;
15     link p = L;
16     for(i=0;i<pos;++i)
17         p=p->next;
18     y->next = p->next;
19     p->next = y;
20 }
21  
22 void print(link L){
23     int i;
24     link p = L->next;
25     while(p){
26         if(p==L->next)
27             printf("%d", p->data);
28         else printf(" %d", p->data);
29         p = p->next;
30     }
31     printf("\n");
32 }
33  
34 void swap(int pos1, int pos2, link L){
35     int i;
36     if(pos1 < 0 || pos1 > n || pos2 < 0 || pos2 > n){
37         printf("error\n");
38         return ;
39     }
40     link t1, t2, l1, l2;
41     link p1 = L;
42     link p2 = L;
43     for(i=0;i<pos1-1;++i)
44         p1=p1->next;
45     t1 = p1->next;
46     l1 = t1->next;
47     for(i=0;i<pos2-1;++i)
48         p2=p2->next;
49     t2 = p2->next;
50     l2 = t2->next;
51  
52     if(l1 == t2){
53         p1->next = t2;
54         t2->next = t1;
55         t1->next = l2;
56         print(L);
57         return;
58     }
59  
60     p1->next = t2;
61     t2->next = l1;
62     t1->next = l2;
63     p2->next = t1;
64     print(L);
65 }
66  
67 int main(int argc, char const *argv[])
68 {
69     int i, pos1, pos2;
70     int value;
71     link L = malloc(sizeof(Node));
72     L->next = 0;
73     scanf("%d", &n);
74     for(i=0;i<n;++i){
75         scanf("%d", &value);
76         insert(i, value, L);
77     }
78     print(L);
79     scanf("%d%d", &pos1, &pos2);
80     swap(pos1, pos2, L);
81     scanf("%d%d", &pos1, &pos2);
82     swap(pos1, pos2, L);
83     return 0;
84 }

 

Description

假定两个单链表是递增有序,实现两个单链表的合并,继续保持递增有序

如果大家用了前面的链表类定义,请屏蔽析构函数,否则可能会出错

Input

 

第1行先输入n表示有n个数据,接着输入n个数据
 
第2行先输入m表示有M个数据,接着输入m个数据
 

 

Output

输出合并后的单链表数据,数据之间用空格隔开

Sample Input

3 11 33 55 4 22 44 66 88

Sample Output

11 22 33 44 55 66 88
 
 
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 typedef struct node *link;
 4 typedef struct node{
 5     int data;
 6     link next;
 7 }Node;
 8 
 9 link init(){
10     int n, value, i;
11     link L = malloc(sizeof(Node));
12     L->next = 0;
13     scanf("%d", &n);
14     for(i=0;i<n;++i){
15         link y = malloc(sizeof(Node));
16         scanf("%d", &y->data);
17         link p = L;
18         while(p->next) p = p->next;
19         y->next = p->next;
20         p->next = y;
21     }
22     return L;
23 }
24 
25 link guibing(link L1, link L2){
26     link L = malloc(sizeof(Node));
27     L->next = 0;
28     link p1 = L1->next;
29     link p2 = L2->next;
30     link p = L;
31     while(p1 || p2){
32         while(p->next) p = p->next;
33         if(p1 && p2){
34             link y = malloc(sizeof(Node));
35             if(p1->data<p2->data){
36                 y->data = p1->data;
37                 p1 = p1->next;
38             }
39             else{
40                 y->data = p2->data;
41                 p2 = p2->next;
42             }
43             y->next = p->next;
44             p->next = y;
45         }
46         else if(p1){
47             p->next = p1;
48             break;
49         }
50         else if(p2){
51             p->next = p2;
52             break;
53         }
54     }
55     return L;
56 }
57 
58 void print(link L){
59     link p = L->next;
60     while(p){
61         printf("%d ", p->data);
62         p = p->next;
63     }
64     printf("\n");
65 }
66 
67 int main(int argc, char const *argv[])
68 {
69 
70     link L1 = init();
71     link L2 = init();
72     link L3 = guibing(L1, L2);
73     print(L3);
74     return 0;
75 }

 

Input

 

n第1行先输入n表示有n个数据,接着输入n个数据
第2行输入要插入的位置和新数据
第3行输入要插入的位置和新数据
第4行输入要删除的位置
第5行输入要删除的位置
第6行输入要查找的位置
第7行输入要查找的位置

Output

 

n

数据之间用空格隔开,

第1行输出创建后的单链表的数据

每成功执行一次操作(插入或删除),输出执行后的单链表数据

每成功执行一次查找,输出查找到的数据

如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出单链表

Sample Input

6 11 22 33 44 55 66 3 777 1 888 1 11 0 5

Sample Output

11 22 33 44 55 66 11 22 777 33 44 55 66 888 11 22 777 33 44 55 66 11 22 777 33 44 55 66 error error 44

 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 typedef struct node *link;
  4 typedef struct node{
  5     int data;
  6     link next;
  7 }Node;
  8  
  9 int n, len;
 10  
 11 link init(){
 12     link L = malloc(sizeof(Node));
 13     L->next = 0;
 14     L->data = 0;
 15     return L;
 16 }
 17  
 18 void print(link L){
 19     int i;
 20     link p = L->next;
 21     while(p){
 22         printf("%d ", p->data);
 23         p = p->next;
 24     }
 25     printf("\n");
 26 }
 27  
 28 void insert(int value, int pos, link L){
 29     int i;
 30     if(pos<1 || pos > len+1){
 31         printf("error\n");
 32         return ;
 33     }
 34     link y = malloc(sizeof(Node));
 35     y->data = value;
 36     link p = L;
 37     for(i=1;i<pos;++i)
 38         p = p->next;
 39     y->next = p->next;
 40     p->next = y;
 41     ++len;
 42     print(L);
 43 }
 44  
 45 void _insert(int value, int pos, link L){
 46     int i;
 47     link y = malloc(sizeof(Node));
 48     y->data = value;
 49     link p = L;
 50     for(i=1;i<pos;++i)
 51         p = p->next;
 52     y->next = p->next;
 53     p->next = y;
 54     ++len;
 55 }
 56  
 57 void delete(int pos, link L){
 58     int i;
 59     if(pos < 1 || pos > len){
 60         printf("error\n");
 61         return ;
 62     }
 63     link p = L;
 64     for(i=1;i<pos;++i)
 65         p = p->next;
 66     p->next = p->next->next;
 67     --len;
 68     print(L);
 69 }
 70  
 71 void find(int pos, link L){
 72     int i;
 73     if(pos < 1 || pos > len){
 74         printf("error\n");
 75         return ;
 76     }
 77     link p = L->next;
 78     for(i=1;i<pos;++i)
 79         p = p->next;
 80     printf("%d\n", p->data);
 81 }
 82  
 83 int main(int argc, char const *argv[])
 84 {
 85     scanf("%d", &n);
 86     int i, value, pos;
 87     link L = init();
 88     int len = 1;
 89     for(i=1;i<=n;++i){
 90         scanf("%d", &value);
 91         _insert(value, i, L);
 92     }
 93     print(L);
 94  
 95     scanf("%d%d", &pos, &value);
 96     insert(value, pos, L);
 97  
 98     scanf("%d%d", &pos, &value);
 99     insert(value, pos, L);
100  
101     scanf("%d", &pos);
102     delete(pos, L);
103  
104     scanf("%d", &pos);
105     delete(pos, L);
106  
107     scanf("%d", &pos);
108     find(pos, L);
109  
110     scanf("%d", &pos);
111     find(pos, L);
112  
113     return 0;
114 }

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2013-12-12 01:00  Levi.duan  阅读(597)  评论(0编辑  收藏  举报