数据结构总结:(二)链表
白老师题目,把链表总结了一下:
Description
对于一元多项式 p(x)=p0+p1x+p2x2+ … +pnxn ,每个项都有系数和指数两部分,例如p2x2的系数为p2,指数为2
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
Sample Output
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
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
Sample Output
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
Sample Output
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
Output
输出合并后的单链表数据,数据之间用空格隔开
Sample Input
Sample Output
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
第2行输入要插入的位置和新数据
第3行输入要插入的位置和新数据
第4行输入要删除的位置
第5行输入要删除的位置
第6行输入要查找的位置
第7行输入要查找的位置
Output
数据之间用空格隔开,
第1行输出创建后的单链表的数据
每成功执行一次操作(插入或删除),输出执行后的单链表数据
每成功执行一次查找,输出查找到的数据
如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出单链表
Sample Input
Sample Output
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 }