博客作业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提交记录截图

不会,看不懂上面说了什么。

posted @ 2018-03-25 20:33  烦呢,还要起名字  阅读(165)  评论(2编辑  收藏  举报