1937
备注:
|
4999
|
删除的内容标记成这样。 | 加入的内容标记成这样。 |
行号 5: | 行号 5: |
6. 编写算法,求一元多项式的值[[latex($$Pn(x)=a_0+a_1x+a_2x^2+...+a_nx^n$$)]] | 6. 编写算法,求一元多项式的值[[latex($$P_n(x)=a_0+a_1x+a_2x^2+\ldots+a_nx^n$$)]] |
行号 51: | 行号 51: |
/**/ | /*list指向带头结点单链表的头结点,元素递增有序排列,算法删除其中大于min小于max的所有元素*/ |
行号 54: | 行号 54: |
for(p = list; p->next->data < min; p = p->next) | for(p = list; p->next->data <= min; p = p->next) |
行号 65: | 行号 65: |
7. 线性表逆置 {{{#!cplusplus /*将顺序表list中所有元素的顺序倒过来*/ void reverse(seq_list *list) { int i; for(i = 0; i < list->size /2; i++) { ElemType temp = list->elem[i]; list->elem[i] = list->elem[list->size - i -1]; list->elem[list->size-i-1] = temp; } } }}} {{{#!cplusplus /*将头结点为list的带头结点单链表中所有的元素的顺序倒过来*/ void reverse(linklist list) { node *p = list->next; list->next = NULL; while(p != NULL) { node *q = p->next; p->next = list->next; list->next = p; p = q; } } }}} 8. 有两个按照元素递增顺序排列的单链表A和B,编写算法将A和B合并成单链表C,并要求C中的元素是递减排列的。 {{{#!cplusplus /*A和B为两个按照元素递增顺序排列的带头结点的单链表,将A和B合并成带头结点的单链表C,C中的元素是递减排列的,C中的节点空间为原来的A和B中的节点空间,返回单链表C*/ linklist merge(linklist A, linklist B) { linklist C; node *pa = A->next; node *pb = B->next; C = A; C->next = NULL; free(B); while(pa && pb) { if(pa->data < pb->data) { node *temp = pa->next; pa->next = C->next; C->next = pa; pa = temp; } else { node *temp = pb->next; pb->next = C->next; C->next = pb; pb = temp; } } while(pa) { node *temp = pa->next; pa->next = C->next; C->next = pa; pa = temp; } while(pb) { node *temp = pa->next; pa->next = C->next; C->next = pa; pa = temp; } return C; } }}} 9. 假设有一个无头节点的循环单链表的长度大于1,s为指向链表中间某个(非第一个)节点的指针。写一个算法删除s的前驱节点。 {{{#!cplusplus void remove_pre(node *s) { node *p; for(p = s; p->next->next != s; p = p->next) ; free(p->next) p->next = s; } }}} == 第三章 == 7. 用带头结点的单循环链表表示队列,并只设尾指针,写出初始化、入队、出队算法。 {{{#!cplusplus struct node { struct node *next; ElemType data; }; /*初始化*/ void init(struct node **tail) { *tail = (struct node *)malloc(sizeof(struct node)); (*tail)->next = *tail; } /*入队*/ void push(struct node **tail, ElemType x) { struct node *p = (struct node *)malloc(sizeof(struct node)); p->data = x; p->next = (*tail)->next; (*tail)->next = p; *tail = p; } /*出队*/ ElemType pop(struct node **tail) { struct node *p = (*tail)->next->next; ElemType data = p->data; (*tail)->next->next = p->next; if(p==tail) tail = tail->next;/*如果最后一个节点被删除,则要修改tail指针*/ free(p); return data; } }}} |
练习参考答案
1. 第一章
6. 编写算法,求一元多项式的值latex($$P_n(x)=a_0+a_1x+a_2x^2+\ldots+a_nx^n$$)
总计 = 3n+4次
2. 第二章
4. 已知顺序表L递增有序,写一个算法将X插入到线性表适当位置上,使顺序表仍然递增有序。
5. 编写一个算法,从顺序表中删除自第i个元素开始的k个元素
6. 已知单链表中的元素递增排列,编写一个算法,删除链表内所有大于min小于max的元素。
1 /*list指向带头结点单链表的头结点,元素递增有序排列,算法删除其中大于min小于max的所有元素*/
2 void delete_between_min_and_max(linklist list, int min, int max) {
3 node *p, *q, *nextq;
4 for(p = list; p->next->data <= min; p = p->next)
5 ;
6 q = p->next;
7 while(q!=NULL && q->data < max) {
8 nextq = q->next;
9 free(q);
10 q=nextq;
11 }
12 p->next = q;
13 }
7. 线性表逆置
8. 有两个按照元素递增顺序排列的单链表A和B,编写算法将A和B合并成单链表C,并要求C中的元素是递减排列的。
1 /*A和B为两个按照元素递增顺序排列的带头结点的单链表,将A和B合并成带头结点的单链表C,C中的元素是递减排列的,C中的节点空间为原来的A和B中的节点空间,返回单链表C*/
2 linklist merge(linklist A, linklist B) {
3 linklist C;
4 node *pa = A->next;
5 node *pb = B->next;
6 C = A;
7 C->next = NULL;
8 free(B);
9 while(pa && pb) {
10 if(pa->data < pb->data) {
11 node *temp = pa->next;
12 pa->next = C->next;
13 C->next = pa;
14 pa = temp;
15 } else {
16 node *temp = pb->next;
17 pb->next = C->next;
18 C->next = pb;
19 pb = temp;
20 }
21 }
22 while(pa) {
23 node *temp = pa->next;
24 pa->next = C->next;
25 C->next = pa;
26 pa = temp;
27 }
28 while(pb) {
29 node *temp = pa->next;
30 pa->next = C->next;
31 C->next = pa;
32 pa = temp;
33 }
34 return C;
35 }
9. 假设有一个无头节点的循环单链表的长度大于1,s为指向链表中间某个(非第一个)节点的指针。写一个算法删除s的前驱节点。
3. 第三章
7. 用带头结点的单循环链表表示队列,并只设尾指针,写出初始化、入队、出队算法。
1 struct node {
2 struct node *next;
3 ElemType data;
4 };
5
6 /*初始化*/
7 void init(struct node **tail) {
8 *tail = (struct node *)malloc(sizeof(struct node));
9 (*tail)->next = *tail;
10 }
11
12 /*入队*/
13 void push(struct node **tail, ElemType x) {
14 struct node *p = (struct node *)malloc(sizeof(struct node));
15 p->data = x;
16 p->next = (*tail)->next;
17 (*tail)->next = p;
18 *tail = p;
19 }
20
21 /*出队*/
22 ElemType pop(struct node **tail) {
23 struct node *p = (*tail)->next->next;
24 ElemType data = p->data;
25 (*tail)->next->next = p->next;
26 if(p==tail) tail = tail->next;/*如果最后一个节点被删除,则要修改tail指针*/
27 free(p);
28 return data;
29 }