博客作业2---线性表
一、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. 代码截图
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(lenth<m){
return -1;
}
LinkList p;
p=L->next;
int j=0;
while(p!=NULL&&j<lenth-m){
j++;
p=p->next;
}//定义循环找出所求位置
return p->data;
}
3. 代码截图
-
没有考虑m的情况,如果m<=0时一样不成立。所以添加一个判断m的if语句即可
-
开始时直接在算链表长度的循环里判断链表,然后导致了段错误了,所以将其改成在外面判断即可
4.PTA提交列表说明。
1.题目3:7-2 一元多项式的乘法与加法运算
2. 设计思路(伪代码或流程图)
#include<iostream>
#include<cstdio>
#include<algorithm>
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提交记录截图
不会,看不懂上面说了什么。