1.已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素(其中n与elem从键盘输入)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; typedef struct node { int *arr; int length; int maxsize; }sqlist; void createsqlist(sqlist &l) { l.arr = (int*)malloc(maxn * sizeof(int)); l.length = 0; l.maxsize = maxn; } void insqlist(sqlist &l, int n) { int *p; printf("请依次输入数字来创建顺序表:\n"); for(p = l.arr; p < l.arr + n; p++) { scanf("%d", p); } l.length = n; } void outsqlist(sqlist l) { int *p; printf("顺序表的元素为:\n"); for(p = l.arr; p < l.arr + l.length; p++) printf("%d ", *p); } void deletesqlist(sqlist &l, int elem) { int i = 0; while(i < l.length && l.arr[i] != elem) i++; for(int j = i + 1; j < l.length; j++) { if(l.arr[j] != elem) { l.arr[i++] = l.arr[j]; } } l.length = i; }
int main(void) { ios::sync_with_stdio(false); cin.tie(0); int n, elem; sqlist L; createsqlist(L); printf("请输入n个元素:\n"); scanf("%d", &n); insqlist(L, n); printf("请输入删除的元素值:\n"); scanf("%d", &elem); deletesqlist(L, elem); outsqlist(L); return 0; }
|
2.已知顺序表L长度为n,试编写算法实现在顺序表中值为elem的数据元素的后面插入一个值为key的数据元素(其中n、elem与key从键盘输入且顺序表的数据元素的值互不相同)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; typedef struct node { int *arr; int length; int maxsize; }sqlist; void createsqlist(sqlist &l) { l.arr = (int*)malloc(maxn * sizeof(int)); l.length = 0; l.maxsize = maxn; } void insqlist(sqlist &l, int n) { int *p; printf("请依次输入数字来创建顺序表:\n"); for(p = l.arr; p < l.arr + n; p++) { scanf("%d", p); } l.length = n; } void outsqlist(sqlist l) { int *p; printf("顺序表的元素为:\n"); for(p = l.arr; p < l.arr + l.length; p++) printf("%d ", *p); }
void insertsqlist(sqlist &l, int elem, int key) {
int flag; int *p; for(p = l.arr; p < l.arr + l.length; p++) if(*p == elem) { flag = p - l.arr; } for(p = l.arr + l.length; p >= l.arr + flag + 1; p--) *(p + 1) = *p; l.arr[flag + 1] = key; l.length++; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, elem, key; sqlist L; createsqlist(L); printf("请输入n个元素:\n"); scanf("%d", &n); insqlist(L, n); printf("请输入要插入后边的元素的值和插入的元素值:\n"); scanf("%d %d", &elem, &key); insertsqlist(L, elem, key); outsqlist(L); return 0; }
|
3.已知顺序表{a0,a1,a2,…,an-1},且每个元素都是不相同的,试设计一个算法把所有的奇数移到所有的偶数的前面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; typedef struct node { int *arr; int length; int maxsize; }sqlist; void createsqlist(sqlist &l) { l.arr = (int*)malloc(maxn * sizeof(int)); l.length = 0; l.maxsize = maxn; } void insqlist(sqlist &l, int n) { int *p; printf("请依次输入数字来创建顺序表:\n"); for(p = l.arr; p < l.arr + n; p++) { scanf("%d", p); } l.length = n; } void outsqlist(sqlist l) { int *p; printf("顺序表的元素为:\n"); for(p = l.arr; p < l.arr + l.length; p++) printf("%d ", *p); } void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void change(sqlist &l) { int *i = l.arr; int *j = l.arr + l.length - 1; while(i < j) { while((*i) % 2 == 0) i++; while((*j) % 2 == 1) j--; if(i < j) { swap(i, j); i++; j--; } } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); int n; sqlist L; createsqlist(L); printf("请输入n个元素:\n"); scanf("%d", &n); insqlist(L, n); change(L); outsqlist(L); return 0; }
|
4.已知二个集合la与lb,采用顺序结构存储,其中la={a1,a2,…an},lb={b1,b2,…,bm}, 试设计一个算法将其合并到一个顺序表lc中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; typedef struct node { int *arr; int length; int maxsize; }sqlist; void createsqlist(sqlist &l) { l.arr = (int*)malloc(maxn * sizeof(int)); l.length = 0; l.maxsize = maxn; } void insqlist(sqlist &l, int n) { printf("请依次输入数字来创建顺序表:\n"); for(int i = 0; i < n; i++) { scanf("%d", &l.arr[i]); } l.length = n; } void outsqlist(sqlist l) { int i; printf("顺序表的元素为:\n"); for(int i = 0; i < l.length; i++) printf("%d ", l.arr[i]); } void merger(sqlist &l1, sqlist &l2, sqlist &l3) { for(int i = 0; i < l1.length ; i++) { l3.arr[i] = l1.arr[i]; } l3.length = l1.length; for(int i = 0; i < l2.length; i++) { l3.arr[i + l1.length] = l2.arr[i]; } l3.length += l2.length; } int main(void) { ios::sync_with_stdio(false); cin.tie(0); int n, m; sqlist L1, L2, L3; printf("请输入n和m的值来创建两个顺序表:\n"); scanf("%d %d", &n, &m); createsqlist(L1); createsqlist(L2); createsqlist(L3); insqlist(L1, n); insqlist(L2, m); merger(L1, L2, L3); outsqlist(L3); return 0; }
|
5.已知一个顺序表la,其中la={a1,a2,…an}, 试设计一个算法将其从小到大进行排序 ,再输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; typedef struct node { int *arr; int length; int maxsize; }sqlist; void createsqlist(sqlist &l) { l.arr = (int*)malloc(maxn * sizeof(int)); l.length = 0; l.maxsize = maxn; } void insqlist(sqlist &l, int n) { printf("请依次输入数字来创建顺序表:\n"); for(int i = 0; i < n; i++) { scanf("%d", &l.arr[i]); } l.length = n; } void outsqlist(sqlist l) { int i; printf("顺序表的元素为:\n"); for(int i = 0; i < l.length; i++) printf("%d ", l.arr[i]); } void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; } void sortsqlist(sqlist l) { for(int i = 0; i < l.length ; i++) { for(int j = 0; j < l.length - 1; j++) { if(l.arr[j] > l.arr[j + 1]) { swap(l.arr[j], l.arr[j + 1]); } } } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); sqlist L; int n; createsqlist(L); printf("请输入n的值来创建一个顺序表:\n"); scanf("%d", &n); insqlist(L, n); sortsqlist(L); outsqlist(L); return 0; }
|
6.已知二个顺序la与lb,其中la={a1,a2,…an},lb={b1,b2,…bm}, 试设计一个算法将它们合并到顺序表lc中,且lc仍然有序,再输出 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| #include <bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; typedef struct node { int *arr; int length; int maxsize; }sqlist; void createsqlist(sqlist &l) { l.arr = (int*)malloc(maxn * sizeof(int)); l.length = 0; l.maxsize = maxn; } void insqlist(sqlist &l, int n) { printf("请依次输入数字来创建顺序表:\n"); for(int i = 0; i < n; i++) { scanf("%d", &l.arr[i]); } l.length = n; } void outsqlist(sqlist l) { int i; printf("顺序表的元素为:\n"); for(int i = 0; i < l.length; i++) printf("%d ", l.arr[i]); } void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; } void merger(sqlist &l1, sqlist &l2, sqlist &l3) { for(int i = 0; i < l1.length ; i++) { l3.arr[i] = l1.arr[i]; } l3.length = l1.length; for(int i = 0; i < l2.length; i++) { l3.arr[i + l1.length] = l2.arr[i]; } l3.length += l2.length; } void sortsqlist(sqlist l) { for(int i = 0; i < l.length ; i++) { for(int j = 0; j < l.length - 1; j++) { if(l.arr[j] > l.arr[j + 1]) { swap(l.arr[j], l.arr[j + 1]); } } } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); int n, m; sqlist L1, L2, L3; printf("请输入n和m的值来创建两个顺序表:\n"); scanf("%d %d", &n, &m); createsqlist(L1); createsqlist(L2); createsqlist(L3); insqlist(L1, n); insqlist(L2, m); merger(L1, L2, L3); sortsqlist(L3); outsqlist(L3); return 0; }
|
7.设计一个算法,以先进先出的方式创建一个带头结点的单向链表,并输出 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; Linklist p, END; END = l; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); END -> next = p; p->next = NULL; END = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); outlinklist(L); return 0; }
|
8.设计一个算法,以后进先出的方式创建一个带头结点的单向链表,并输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; printf("请输入想要创建的链表元素:\n"); for(int i = n; i > 0; i--) { Linklist p; p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); p->next = l->next; l->next = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); outlinklist(L); return 0; }
|
9.设计一个算法,以先进先出的方式创建一个带头结点的双向链表,并输出 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *prior; struct Node *next; }Node, *Linklist; void inlinklist(Linklist &l, int n) { Linklist p, s; l = (Linklist)malloc(sizeof(Node)); l ->next = NULL; l ->prior = NULL; s = l; p = (Linklist)malloc(sizeof(Node)); printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist) malloc(sizeof(Node)); scanf("%d", &p->elem); s->next = p; p->prior = s; s = p; } s->next = NULL; } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); outlinklist(L); return 0; }
|
10.设计一个算法,以后进先出的方式创建一个带头结点的双向链表,并输出 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *prior; struct Node *next; }Node, *Linklist; void inlinklist(Linklist &l, int n) { Linklist p; l = (Linklist)malloc(sizeof(Node)); l ->next = NULL; l ->prior = NULL; p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); p->next = l->next; l->next = p; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist) malloc(sizeof(Node)); scanf("%d", &p->elem); p -> next = l -> next; l -> next -> prior = p; l -> next = p; p -> prior = l; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); outlinklist(L); return 0; }
|
11.已知一个(head)单链表la,其中la={a1,a2,…an}, 试设计一个算法将其中从小到大进行排序 ,再输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; Linklist p, END; END = l; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); END -> next = p; p->next = NULL; END = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; } void sortlinklist(Linklist &l) { Linklist p, s; s = p = l->next; while(s) { p = s; while(p) { if(s->elem > p->elem) swap(s->elem,p->elem); p = p->next; } s = s->next; } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); sortlinklist(L); outlinklist(L); return 0; }
|
12.已知二个单链表有序链表la与lb,其中la={a1,a2,…an},lb={b1,b2,…bm}, 试设计一个算法将它们合并到单链表lc中,且lc仍然有序,再输出 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; Linklist p, END; END = l; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); END -> next = p; p->next = NULL; END = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } void swap(Linklist &a, Linklist &s) { s->next = a; s = a; a = a->next; } void mergerlinklist(Linklist &l1, Linklist &l2, Linklist &l3) { Linklist p, q, s; p = l1->next; q = l2->next; l3 = s = l1; while(p != NULL && q != NULL) { if(p->elem < q->elem) { swap(p,s); } else { swap(q,s); } } s->next = p ? p : q; } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L1, L2, L3; int n, m; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L1, n); printf("请输入创建m个元素的链表的m值:\n"); scanf("%d", &m); inlinklist(L2, m); mergerlinklist(L1, L2, L3); outlinklist(L3); return 0; }
|
13.设计一个算法实现在带头结点的单向链表中删除给定值的结点。(链表中的数据元素值均不相同)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; Linklist p, END; END = l; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); END -> next = p; p->next = NULL; END = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } void deletelinklist(Linklist &l, int x) { Linklist p, s; p = s = l; while(p->elem != x) { s = p; p = p->next; } if(p) { s->next = p->next; free(p); } } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n, m; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); printf("请输入要删除的值m:\n"); scanf("%d", &m); deletelinklist(L, m); outlinklist(L); return 0; }
|
14.试设计一个算法,将单链表中值最小的那个结点删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; Linklist p, END; END = l; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); END -> next = p; p->next = NULL; END = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } void deletelinklist(Linklist &l) { Linklist cur, curpre, min, minpre; cur = min = curpre = minpre = l; while(cur != NULL) { if(cur->elem < min->elem) { minpre = curpre; min = cur; } curpre = cur; cur = cur->next; } minpre->next = min->next; free(min); } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n, m; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); deletelinklist(L); outlinklist(L); return 0; }
|
15.试设计一个算法,将单链表中值最大的那个结点删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; Linklist p, END; END = l; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); END -> next = p; p->next = NULL; END = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } void deletelinklist(Linklist &l) { Linklist cur, curpre, max, maxpre; cur = max = curpre = maxpre = l; max->elem = -1; while(cur != NULL) { if(cur -> elem > max -> elem) { maxpre = curpre; max = cur; } curpre = cur; cur = cur->next; } maxpre->next = max->next; free(max); } int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); deletelinklist(L); outlinklist(L); return 0; }
|
16.试设计一个算法,使得在一个有序的单链表中插入一个元素后仍然有序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <bits/stdc++.h> using namespace std; typedef struct Node { int elem; struct Node *next; }*Linklist; void inlinklist(Linklist &l, int n) { l = (Linklist)malloc(sizeof(Node)); l->next = NULL; Linklist p, END; END = l; printf("请输入想要创建的链表元素:\n"); for(int i = 0; i < n; i++) { p = (Linklist)malloc(sizeof(Node)); scanf("%d", &p->elem); END -> next = p; p->next = NULL; END = p; } } void outlinklist(Linklist l) { printf("链表中的值为:\n"); Linklist p; p = l->next; while(p != NULL) { printf("%d ", p->elem); p = p->next; } printf("\n"); } void insertlinklist(Linklist &l, int x) { Linklist p, s, q; s = l; p = s->next; while(p != NULL && p->elem < x) { s = p; p = p->next; } q = (Linklist)malloc(sizeof(Linklist)); q->elem = x; q->next = p; s ->next = q; Linklist p, s, q; s = l; p = s->next; while(p != NULL && p->elem > x) { s = p; p = p->next; } q = (Linklist)malloc(sizeof(Linklist)); q->elem = x; q->next = p; s ->next = q;
} int main(void) { ios::sync_with_stdio(false); cin.tie(0); Linklist L; int n, x; printf("请输入创建n个元素的链表的n值:\n"); scanf("%d", &n); inlinklist(L, n); printf("请输入要插入的数值x:\n"); scanf("%d", &x); insertlinklist(L, x); outlinklist(L); return 0; }
|