本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:

  1. struct ListNode {
  2. int data;
  3. ListNode *next;
  4. };

函数接口定义:

  1. struct ListNode *readlist();
  2. struct ListNode *getodd( struct ListNode **L );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L的指针)。

裁判测试程序样例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct ListNode {
  4. int data;
  5. struct ListNode *next;
  6. };
  7. struct ListNode *readlist();
  8. struct ListNode *getodd( struct ListNode **L );
  9. void printlist( struct ListNode *L )
  10. {
  11. struct ListNode *p = L;
  12. while (p) {
  13. printf("%d ", p->data);
  14. p = p->next;
  15. }
  16. printf("\n");
  17. }
  18. int main()
  19. {
  20. struct ListNode *L, *Odd;
  21. L = readlist();
  22. Odd = getodd(&L);
  23. printlist(Odd);
  24. printlist(L);
  25. return 0;
  26. }
  27. /* 你的代码将被嵌在这里 */

输入样例:

  1. 1 2 2 3 4 5 6 7 -1

输出样例:

  1. 1 3 5 7
  2. 2 2 4 6
  3.  
  4.  
  5. 记录一下自己怎么写的,毕竟第一次写链表:
  1. struct ListNode *readlist()
  2. {
  3. int data;
  4. struct ListNode *head=NULL;
  5. struct ListNode *p;
  6. while(scanf("%d",&data)&&data!=-)
  7. {
  8. struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
  9. if(q!=NULL)
  10. {
  11. q->data=data;
  12. q->next=NULL;
  13. }
  14. else exit();
  15. if(head!=NULL)
  16. {
  17. p->next=q;
  18. }
  19. else head=q;
  20. p=q;
  21. }
  22. return head;
  23. }
  24. struct ListNode *getodd( struct ListNode **L )
  25. {
  26. struct ListNode *head0=NULL,*head1=NULL,*p0,*p1;
  27. while((*L)!=NULL)
  28. {
  29. int data=(*L)->data;
  30. struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
  31. if(data%)
  32. {
  33. if(q!=NULL)
  34. {
  35. q->data=data;
  36. q->next=NULL;
  37. }
  38. else exit();
  39. if(head1!=NULL)
  40. {
  41. p1->next=q;
  42. }
  43. else head1=q;
  44. p1=q;
  45. }
  46. else
  47. {
  48. if(q!=NULL)
  49. {
  50. q->data=data;
  51. q->next=NULL;
  52. }
  53. else exit();
  54. if(head0!=NULL)
  55. {
  56. p0->next=q;
  57. }
  58. else head0=q;
  59. p0=q;
  60. }
  61. *L=(*L)->next;
  62. }
  63. *L=head0;
  64. return head1;
  65. }

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:

  1. struct ListNode {
  2. int data;
  3. ListNode *next;
  4. };

函数接口定义:

  1. struct ListNode *readlist();
  2. struct ListNode *deletem( struct ListNode *L, int m );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。

裁判测试程序样例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct ListNode {
  4. int data;
  5. struct ListNode *next;
  6. };
  7. struct ListNode *readlist();
  8. struct ListNode *deletem( struct ListNode *L, int m );
  9. void printlist( struct ListNode *L )
  10. {
  11. struct ListNode *p = L;
  12. while (p) {
  13. printf("%d ", p->data);
  14. p = p->next;
  15. }
  16. printf("\n");
  17. }
  18. int main()
  19. {
  20. int m;
  21. struct ListNode *L = readlist();
  22. scanf("%d", &m);
  23. L = deletem(L, m);
  24. printlist(L);
  25. return 0;
  26. }
  27. /* 你的代码将被嵌在这里 */

输入样例:

  1. 10 11 10 12 10 -1
  2. 10

输出样例:

  1. 11 12
  2.  
  3.  
  1. struct ListNode *readlist()
  2. {
  3. int data;
  4. struct ListNode *head=NULL,*p;
  5. while(scanf("%d",&data)&&data!=-)
  6. {
  7. struct ListNode *q=(struct ListNode *)malloc(sizeof(struct ListNode));
  8. if(q==NULL)exit();
  9. else
  10. {
  11. q->data=data;
  12. q->next=NULL;
  13. }
  14. if(head==NULL)
  15. {
  16. head=q;
  17. }
  18. else
  19. {
  20. p->next=q;
  21. }
  22. p=q;
  23. }
  24. return head;
  25. }
  26. struct ListNode *deletem( struct ListNode *L, int m )
  27. {
  28. int data;
  29. struct ListNode *p,*head=NULL;
  30. while(L!=NULL)
  31. {
  32. data=L->data;
  33. L=L->next;
  34. if(data!=m){
  35. struct ListNode *q=(struct ListNode *)malloc(sizeof(struct ListNode));
  36. if(q==NULL)exit();
  37. else
  38. {
  39. q->data=data;
  40. q->next=NULL;
  41. }
  42. if(head==NULL)
  43. {
  44. head=q;
  45. }
  46. else
  47. {
  48. p->next=q;
  49. }
  50. p=q;
  51. }
  52. }
  53. return head;
  54. }

pta 奇数值结点链表&&单链表结点删除的更多相关文章

  1. 无头结点的单链表(C语言)

    1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的, ...

  2. java编写带头结点的单链表

    最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...

  3. C/C++中创建(带头结点、不带头结点的)单链表

    1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ ...

  4. 链表习题(2)-一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点。

    /*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍 ...

  5. 链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

    /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

  6. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  7. 不带头结点的单链表(基于c语言)

    本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...

  8. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  9. 线性表->链式存储->线形链表(单链表)

    文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...

随机推荐

  1. oracle 临时表的使用

    在oracle中,临时表分为会话级别(session)和事务级别(transaction)两种. 会话级的临时表在整个会话期间都存在,直到会话结束:事务级别的临时表数据在transaction结束后消 ...

  2. Servlet / Tomcat / Spring 之间的关系

    0.基础知识 在idea中打开servlet的源码: 可以看见servlet就是一个接口:接口就是规定了一些规范,使得一些具有某些共性的类都能实现这个接口,从而都遵循某些规范. 有的人往往以为就是se ...

  3. OnXXX函数与XXX事件的关系

    OnPaint是Control类中的方法,Paint是事件,Paint是用于改变部分显示用比较合适,实际上Paint事件在OnPaint中被调用,如果你重写OnPaint但是不调用base.OnPai ...

  4. 3.2 x86体系结构

    计算机组成 3 指令系统体系结构 3.2 x86体系结构 X86是商业上最为成功,影响力最大的一种体系结构.但从技术的角度看,它又存在着很多的问题,那我们就来一起分析X86这种体系结构的特点. 要探讨 ...

  5. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

  6. 秒杀多线程第六篇 经典线程同步 事件Event

    原文地址:http://blog.csdn.net/morewindows/article/details/7445233 上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权” ...

  7. POJ-3087 Shuffle'm Up (模拟)

    Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuff ...

  8. UVA-11490 Just Another Problem

    题目大意:一个由p*q个点组成的pxq点阵(构成一个矩形).从内层点中拿走两块正方形上的所有点,这两块正方形要边长相等,在位置上关于中线对称,并且还要使每一个正方形的上下左右剩余的点的层数相等.现在告 ...

  9. create view

    create view View_count as SELECT     spkfk.spid, pf_ckmx.rq, pf_ckmx.spid AS Expr1, pf_ckmx.shl, spk ...

  10. Executors类的newFixedThreadPool, newCachedThreadPool, newScheduledThreadPool

    Executors 类对 ThreadPoolExecutor 的构造函数进行了封装,使用该类可方便地创建线程池. 1. newFixedThreadPool public static Execut ...