第二小组链表讨论

一、PTA题目集

4-1、删除单链表偶数节点,碰到问题如下:

1)刚开始时候忘记了判断头节点数据 导致答案出错

2)函数题只能对函数进行操作,有同学一开始将main函数中做了修改,编译出错。这是题目已定的部分,不能更改。

3)在判断节点是否为偶数时,若节点不为偶数则跳过,执行程序结果与预期不符

解决办法:与小组讨论后得知,不能直接用a=a->next这一步代替跳过节点,需要用创建的另一个指针来代替。

4-3、链表逆置

1)重创一个链表,进行头插法时,忘记保留头节点地址。

解决方法:定义了L用来保留头节点地址。

4-4.求链表的倒数第m个元素

1)一开始的思路是用头插法进行重制一个链表,那样第m个元素就是原先链表倒数第m个元素,第一次编译错误,原因是题目要求不改变原链表,审题不认真。解决方法:对原先链表进行遍历判断是否为偶数,是的话删除该节点。

5-4一元多项式的乘法与加法运算

1)一元多项式的乘法与加法运算这题,把代码打好后编译可以通过,但在使用时会出现错误,用调试来找错误时结果又是正确的。

二、链表学习总结

1、张艺琳:

1)对题4-1:建表分配内存就不说了 然后删除偶数结点就是根据结点数据求2的余数,若余数为0,则此节点的next覆盖,若余数不为0,继续向后遍历。

2)题4-2:思路是用两个指针,第一个指针按顺序将数据存入数组,第二个指针也重头开始往后扫,于是数组里面的数据就倒过来存在了链表中。

2、江炳煌:

1)创建单链表等函数要注意返回头指针,创建头节点注意赋予空间,且next域置为NULL

2)对于删除偶数节点的题目,遍历链表,当某节点数据不为偶数,要注意将指针域移动到下一节点,否则会导致错误。

3、郑玉波:

1).设置空白头节点后,在使用时要注意调用的是头节点指向的下一个节点的值,否则会导致赋值的错误。

2).删除偶数节点那题,在判断结果为偶数要删除时要注意把前一个节点指向的地址与其下一个节点结合,并且设置的记录位置的值不要向下移动,否则会导致部分值被省略。

3).链表倒置

方法1 :新建一个链表,使用头插法把值插入新表中。

方法2:建立一个空链表,把原链表头节点指向NULL再把记录下的下一个节点指向头节点,后面采用同样方法(下一个指向前一个),最后让新建空链表指向原链表最后一个节点位置。

4、吴延彬

1)链表是一个比较难的结构体,刚开始时几乎什么都不懂,即使一直在看书、查资料也难以全部理解,需要与同学进行交流。链表与之前所学的普通结构体有所不同,要注意的地方有很多,比如有了各种节点、不能只用一个指针来指向各个数据、需要用NULL来进行定义等等。想要学好链表,需要花费大量的时间,并且要与同学交流讨论,自己一个人做的效率很低。

三、小组未解决问题

1、链表倒置

struct ListNode *reverse( struct ListNode *head ){

struct ListNode  *q=head->next,*L=head;

L=(struct ListNode  *)malloc(sizeof(struct ListNode  *));

q=(struct ListNode  *)malloc(sizeof(struct ListNode  *));

L->next=head->next;

q=q->next;

while(q!=NULL){

q=(struct ListNode  *)malloc(sizeof(struct ListNode  *));

q->next=L->next;

L->next=q;

q=q->next;

}

return L;

}

2、一元多项式的乘法与加法运算

#include <stdio.h>

#include <stdlib.h>

typedef struct Node

{

int coefficient;

int index ;

struct Node *next;

} *List;

void Structure (List &L);

List Add(List L1,List L2);

List Multiplication (List L1,List L2);

void Print(List L3,List L4);

void Simplification(List &L);

int main()

{

List L1,L2,L3,L4,p,s,p1,p2;

Structure (L1);

Structure (L2);

L4=Multiplication(L1,L2);

 

p=L1;

p1=L2;

L3=(List)malloc(sizeof(List));

p2=L3;

while(p1->next!=NULL)

{

s=(List)malloc(sizeof(List));

s->coefficient=p1->next->coefficient;

s->index=p1->next->index;

p2->next=s;

p2=s;

p1=p1->next;

}

while(p->next!=NULL)

{

s=(List)malloc(sizeof(List));

s->coefficient=p->next->coefficient;

s->index=p->next->index;

p2->next=s;

p2=s;

p=p->next;

}

p2->next=NULL;

Simplification(L3);

Print(L3,L4);

return 0;

 }

void Structure (List &L)

{

int i,j;

List p,s;

L=(List)malloc(sizeof(List));

p=L;

scanf("%d",&i);

for(j=0;j<i;j++)

{

s=(List)malloc(sizeof(List));

scanf("%d%d",&s->coefficient,&s->index);

p->next=s;

p=s;

}

p->next=NULL;

}

void Simplification(List &L)

{

List p,s;

int i;

p=L;

while(p->next!=NULL)

{

i=p->next->index;

s=p->next;

while(s!=NULL)

{

if(s->next==NULL)

break;

if(s->next->index==i)

{

p->next->coefficient=p->next->coefficient+s->next->coefficient;

s->next=s->next->next;

s=s->next;

}

else s=s->next;

}

p=p->next;

}

}

List Add(List L1,List L2)

{

List L3,p,s,p1,p2;

p=L1;

p1=L2;

L3=(List)malloc(sizeof(List));

p2=L3;

while(p1->next!=NULL)

{

s=(List)malloc(sizeof(List));

s->coefficient=p1->next->coefficient;

s->index=p1->next->index;

p2->next=s;

p2=s;

p1=p1->next;

}

while(p->next!=NULL)

{

s=(List)malloc(sizeof(List));

s->coefficient=p->next->coefficient;

s->index=p->next->index;

p2->next=s;

p2=s;

p=p->next;

}

p2->next=NULL;

Simplification(L3);

return L3;

}

List Multiplication (List L1,List L2)

{

List p1,p2,s,L3,p3;

p1=L1;

p2=L2;

L3=(List)malloc(sizeof(List));

p3=L3;

while(p1->next!=NULL)

{

p2=L2;

while(p2->next!=NULL)

{

s=(List)malloc(sizeof(List));

s->coefficient=p2->next->coefficient*p1->next->coefficient;

s->index=p2->next->index+p1->next->index;

p3->next=s;

p3=s;

p2=p2->next;

}

p1=p1->next;

}

p3->next=NULL;

Simplification(L3);

return L3;

}

void Print(List L3,List L4)

{

List p1,p2;

p1=L3;

p2=L4;

while(p2!=NULL)

{

if(p2->next->next==NULL)

break;

if(p2->next!=NULL)

printf("%d %d ",p2->next->coefficient,p2->next->index);

p2=p2->next;

}

printf("%d %d\n",p2->next->coefficient,p2->next->index);

while(p1->next->next!=NULL)

{

if(p1->next->next==NULL)

break;

if(p1->next!=NULL)

printf("%d %d ",p1->next->coefficient,p1->next->index);

p1=p1->next;

}

printf("%d %d\n",p1->next->coefficient,p1->next->index);

}

 

转载于:https://www.cnblogs.com/JIANGBH/p/6540074.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值