一、PTA实验作业
1.题目1:6-3 jmu-ds- 顺序表删除重复元素
2. 设计思路(伪代码或流程图)
定义函数CreateSqList(List &L,int a[],int n){ L=new SqList;申请空间int i; 顺序长度为L->length=n; for(i=0 to n){ 将数组的值分别赋给L->data[i];end for定义函数DispSqList(List L){ int i; for(i=0 to L->length if(查找位置在L->length-1处,则){ 输出L->data[i]; 否则{ 输出L->data[i]加上空格;i++;end for; 定义函数DelSameNode(List &L){ int i,j,flag=0,k=0 ; List X; 为X申请空间 X->length = 0; for( i = 0 to L->length ; i++ ){ for( j = i+1 to L->length; j++ ){ if( L->data[i] 和 L->data[j]相等 ){ flag = 1; } } if( flag == 0 ){ X->data[k] = L->data[i]; k++; } 内循环结束,还原flag值为0,并执行下一次外循环 end for; X->length=k; for( i = 0 to X->length ; i++) 将顺序表X的内容给顺序表K}
3. 代码截图
![1232112-20180325200016604-103278674.png](https://images2018.cnblogs.com/blog/1232112/201803/1232112-20180325200016604-103278674.png)
4.PTA提交列表说明。
如果有部分大于两个重复数据时不能完全删除干净,所以部分正确,要加入一个判断,如果是重复数据就全部删除即可
重复数据始终无法删除干净,所以我新建了一个另外一个顺序表,来存放这些没有重复的数据;最后再将这些数据反馈给顺序表L即可;
1.题目2:6-3 jmu-ds-链表倒数第m个数
2. 设计思路(伪代码或流程图)
定义函数Find(LinkList L, int m ){ LinkList s;s=L->next; int lenth=0; if(要求的倒数位置m他小于等于0){ return -1; } while(s){ lenth++; 利用循环来求出链表的长度 s=s->next; } if(lenth==0){ return -1; } if(lenthnext; int j=0; while(p!=NULL&&j next; }//定义循环找出所求位置 return p->data;}
3. 代码截图
没有考虑m的情况,如果m<=0时一样不成立。所以添加一个判断m的if语句即可
开始时直接在算链表长度的循环里判断链表,然后导致了段错误了,所以将其改成在外面判断即可
4.PTA提交列表说明。
1.题目3:7-2 一元多项式的乘法与加法运算
2. 设计思路(伪代码或流程图)
#include#include #include using namespace std; struct node{ int coef; //系数 int expn; //指数 node* next; }; 定义了一个结构体定义函数 creat_list(int n){ 定义结构体指针*head, *r; 为head申请空间; 指针r指向head; 定义coef , expn; while(n--){ scanf("%d%d",&coef,&expn); node* tmp = new node; tmp->coef = coef; tmp->expn = expn; r->next = tmp; r = tmp; } 通过循环尾插法来给链表赋值 r->next = NULL; return head; } 定义函数add_list(node* a,node* b){ node *r,*fans, *ans; node *ha,*hb; fans = new node; ans = fans; ha = a->next; hb = b->next; while(ha && hb){ node* tmp = new node; if(ha->expn > hb->expn){ tmp->coef = ha->coef; tmp->expn = ha->expn; ans->next = tmp; ans = tmp; ha = ha->next; } else if(ha->expn < hb->expn){ tmp->coef = hb->coef; tmp->expn = hb->expn; ans->next = tmp; ans = tmp; hb = hb->next; } else{ int mulOfcoef = (ha->coef)+(hb->coef); if(mulOfcoef!=0){ tmp->coef = mulOfcoef; tmp->expn = ha->expn; ans->next = tmp; ans = tmp; } ha = ha->next; hb = hb->next; } } while(ha){ node* tmp = new node; tmp->coef = ha->coef; tmp->expn = ha->expn; ans->next = tmp; ans = tmp; ha = ha->next; } while(hb){ node* tmp = new node; tmp->coef = hb->coef; tmp->expn = hb->expn; ans->next = tmp; ans = tmp; hb = hb->next; } ans->next = NULL; //结尾设为 NULL return fans; } node* multi_list(node* a,node* b){ node* ha, *hb; node* ans,*fans; ha = a->next; hb = b->next; fans = creat_list(0); if(ha == NULL || hb == NULL){ return fans; } node* tmp; while(ha != NULL){ tmp = new node; ans = tmp; hb = b->next; while(hb != NULL){ node* ltmp = new node; ltmp->expn = ha->expn + hb->expn; ltmp->coef = ha->coef * hb->coef; hb = hb->next; ans->next= ltmp; ans = ltmp; } ans->next = NULL; fans = add_list(fans,tmp); ha = ha->next; } return fans; } void print_list(node* l){ node *hc; int flag = 0; hc = l->next; if(hc == NULL){ printf("0 0"); } while(hc != NULL){ if(flag) printf(" "); else flag = 1; printf("%d %d",hc->coef,hc->expn); hc = hc->next; } } int main(){ int n; scanf("%d",&n); node *a = creat_list(n); int m; scanf("%d",&m); node* b = creat_list(m); node* c = add_list(a,b); node* d = multi_list(a,b); print_list(d); printf("\n"); print_list(c); printf("\n"); return 0; }
3. 代码截图
4.PTA提交列表说明。
- 本题我用了自己的方法计算多项式,但是同类项相互抵消这一测试点一直,所以借用了网上的代码。上面主要是通过用加法运算来解决乘法的问题,这样就可以把乘法运算转换成加法运算,这样避免了同类项没有完全抵消的现象。
二、截图本周题目集的PTA最后排名
1.顺序表PTA排名
2.链表PTA排名
3.我的总分:225
三、本周学习总结
1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?(1分)
做题,然后学习链表,有序表,双链表如何表达。不是很满意,感觉学习的内容有些不懂而且上面多项式的计算还是有错误 的。下次敲代码之前,做好预习工作。把这些题目都给弄懂。
2.谈谈你对线性表的认识?
线性表个人感觉比之前学的还要难一些,而且有些代码根本不知道哪里错了。线性表包括顺序表和链表。链表包括单链表,双链表还有循环链表,还有有序表。顺序表里面元素的地址是连续的,链表里面节点的地址不是连续的,他们是通过指针连起来的。链表可以保存数据,所以增加删除等操作比较容易。顺序表在查找某一位置的数据时更加方便。
3.代码Git提交记录截图
不会,看不懂上面说了什么。