第02次作业-线性表

一、PTA实验作业


题目一:1.6-3 jmu-ds- 顺序表删除重复元素(25 分)
2.设计思路:
删除函数:

变量定义i,j表示计数。
if L->length>0{
for i=1 to L->length{
k一直初始化为0;
while(k<=j且L->data[k]!=L->data[i])
k加一;
if k>j{
L->data[i]赋予L->data[++j]
}
}
L长度=j+1;
}
else{
L长度为0;
}

3.代码截图

4.PTA提交列表说明

(1)应是链表形式却写成结构体形式导致编译错误。

eg:L.data[i]=a[i];应改为L->data[i]=a[i];
(2)输出函数出错:题目要求最后输出不能有空格。删除函数:只能在空表的情况下成立,代码不符合要求,第二个人for循环j++后此节点就往后移动,最后比较不了。
输出函数修改:从第一个到倒数第二个输出后面都带空格,最后一个数单独输出,不带空格。

for(i=0;i<L.length;i++)
		printf("%d",L.data[i]);
	printf("\n");

改为:

for(i=0;i<L->length;i++)
  {
     if(i!=L->length-1)
   
    printf("%d ",L->data[i]);
     else
       printf("%d",L->data[i]);
  }

(3)删除函数修改:利用for循环嵌套while循环,利用while循环从前到后找与i所指向的元素相同的数,找到跳出while循环,若没有重复数字,则K一定大于j,在k>j的情况下重新记录数据。一定要记住判断此顺序表是否为空,否则空表的测试点不通过。

for(i=1;i<L->length;i++){
		k=0;
		while(k<=j&&L->data[k]!=L->data[i])
		k++;
		if(k>j)
		L->data[++j]=L->data[i];
	}

改成

if(L->length>0){
			for(i=1;i<L->length;i++){
		k=0;
		while(k<=j&&L->data[k]!=L->data[i])
		k++;
		if(k>j)
		L->data[++j]=L->data[i];
	}
	L->length=j+1;
	}
    else{
    	L->length=0;
	}

题目二:6-2 jmu-ds-单链表逆置(25 分)
2.设计思路:

if(L的下一个节点不为空){
创建p指向L的节点;
s=p的下一个节点;
while(s的下一个节点不为空){
int t指向s的下一个节点;
s的下一个节点指向p;
p指向s;
s指向t;
}
最后一个还是要指向其前一个;
头指针逆序后变最后一个,最后一个next=null ;
头指针指向s;
}

3.代码截图

4.PTA提交列表说明
(1)没有考虑到空链表的情况,导致空链表运行出错。
解决方法:在每一个函数要进行时都判断一下链表是否为空,不为空才继续进行。


题目三:7-2 一元多项式的乘法与加法运算(20 分)
2.设计思路:

分别建立创建一元多项式,一元多项式加法,一元多项式乘法,一元多项式输出四个函数。
(2)一元多项式的加法:

定义结构体指针ha,hb分别指向链表a,b头节点,
定义结构体指针f用于存储新链表,
while a and b都不空
do
if(ha->exp!=hb->exp)
then 指数,系数相加后存入新链表
else ha,hb同时往后移一个节点,同样存入新链表
if a不为空
then c
if b不为空
then c
返回c

(3)一元多项式乘法

定义结构体指针ha,hb分别指向链表a,b头节点,
定义结构体指针f用于存储新链表,
if a空orb空
then 返回空的c
while ha
do
依次乘b中的指数和系数
调用加法函数,将结果赋予f,
返回f

3.代码截图




4.PTA提交列表说明
(1)没意识到输出要求数字间以空格分隔。

  if(hc==NULL){
        printf("0 0");  
    }  
    while(hc!= NULL){  
        printf("%d %d",hc->coef,hc->exp);  
        hc = hc->next;  
    } 

改为:

if(hc==NULL){
        printf("0 0");  
    }  
    while(hc!= NULL){  
        if(flag)  
            printf(" ");  
        else  
            flag=1;  //打出一对后中间要有空额 
        printf("%d %d",hc->coef,hc->exp);  
        hc = hc->next;  
    }  

(2)
乘法函数:没有意识到俩链表相乘完没有按递减顺序排放,应在乘完之后再利用加法函数使其成递减输出。

	while(ha!=NULL){
		temp=new node;
		L=temp;
		hb=b->next;
		while(hb!=NULL){
			node *l=new node;
			l->exp=ha->exp+hb->exp; //指数相加,系数相乘  
            l->coef=ha->coef*hb->coef;  
            hb=hb->next;
            L->next=l;
            L=l;
		}
		ha=ha->next;
	return f;
}

应在ha=ha->next;后添加

L->next=NULL;
	    f= add(f,temp); //相当于按递减排序 

二、截图本周题目集的PTA最后排名

1.顺序表PTA排名

2.链表PTA排名

3.我的总分:
总分:2.5分

三、本周学习总结

1.谈谈你本周数据结构学习时间是如何安排,对自己安排满意么,若不满意,打算做什么改变?

1.1)编程时间:每天都有进行,一般划分较大片时间进行编码学习,尽量每天都能有所发现。2)学习时间:周一至周五有提前预习并做必要笔记和复习,一般安排在晚上自习时间,在周末进行系统复习总结。3)遇到不懂问题大部分向班级大佬求救和百度搜查,还有和舍友探讨。对自己的学习安排认为还有待提高,领悟能力较差,需要多加练习。

2.谈谈你对线性表的认识?

线性表就是有唯一的“第一个”和“最后一个”元素的有限序列。线性表元素与位置有关,这种位置上的的有序性就是一种线性关系。1)顺序表:在存储空间中是按顺序存储,不容易随意改动。2)链表:含有指向后继节点的指针,变换更灵活。

3.代码Git提交记录截图


posted @ 2018-03-24 16:39  tanghuan5678  阅读(315)  评论(7编辑  收藏  举报