实验二 删除奇数结点的链表-----程序实现

原创 2007年10月12日 15:26:00

 

p35    实验二 删除奇数结点的链表-----程序实现 

求解方法有2种:

  • 第一种是用2个链表A和B,从A中寻找偶数结点,把它链到B链表中,最后输出B链表。参考教材p33。

 

  • 第二种是在一个链表中完成删除奇数结点的操作。目前该程序已经写好,打算下周发布在该网页上。
    很多同学出现的错误多发生在 如下语句中。请参考思考


    完整程序如下:

    1 :  #include <iostream.h>
    2 :  #include <stdlib.h>
    3 : 
    4 :  struct Node
    5 :  {
    6 :   int data;
    7 :   struct Node *next;
    8 :  };
    9 : 
    10 :  struct Node *CreatListF()//用头插法建立单链表
    11 :  {
    12 :  int ch;
    13 :   struct Node *H=NULL;    //链表头指针开始为空
    14 :   struct Node *p; //工作指针
    15 :  // ch=getchar(); //读入第1个字符
    16 :   cin>>ch;
    17 : 
    18 :  // if(ch=='/n')
    19 :  //  cout<<"你已经退出了!!/n";
    20 :  /// else{
    21 :    while(ch!=0){
    22 :     p=(struct Node *)malloc(sizeof(struct Node));//生成新结点
    23 :     p->data=ch;   //将读入的数据放入新结点的数据域中
    24 :     p->next=H;
    25 :     H=p;
    26 :    // ch=getchar(); //读入下一字符
    27 :     cin>>ch;
    28 :    }//while
    29 : 
    30 :   return H;
    31 :  }
    32 : 
    33 : 
    34 :  int length(struct Node * H)
    35 :  {
    36 :   int n=1;
    37 :   struct Node *p=H;
    38 :   if(p==NULL) return -1;
    39 :   else{
    40 :    while (p->next!=NULL)
    41 :    {
    42 :     n++;
    43 :     p=p->next;
    44 :    }
    45 :   }
    46 :   return n;
    47 :  }
    48 : 
    49 : 
    50 :  void Del(struct Node **H)
    51 :  {
    52 :   struct Node *m;
    53 :   struct Node *q=*H;
    54 :   while(q->next!=NULL){
    55 :    struct Node *p;
    56 :    p=q->next;
    57 :    if(p->next!=NULL && p->data%2!=0){
    58 :     q->next=p->next;
    59 :     q=p->next;
    60 :     free(p);    
    61 :    }
    62 :    else
    63 :     q=q->next;
    64 :   }
    65 :   if(q->data%2!=0){
    66 :    q->data=0;
    67 :    //m=q;
    68 :    /// free(m);
    69 :   } 
    70 :   if(((*H)!=NULL) && ((*H)->data%2!=0)  ){
    71 :    m=(*H);
    72 :    (*H)=(*H)->next;
    73 :    free(m);
    74 :   }  
    75 :   
    76 :  }
    77 : 
    78 : 
    79 :  void display(struct Node *H)
    80 :  {
    81 :   struct Node *p;
    82 :   p=H;
    83 :   cout<<"单链表显示:/n";
    84 :   if (p==NULL)
    85 :    cout<<"链表为空!/n";
    86 :      else
    87 :   {
    88 :    while (p->next!=NULL) //链表存在一个以上的结点时
    89 :    {
    90 :     cout<<p->data<<"→";
    91 :     p=p->next;
    92 :    }
    93 :    cout<<p->data; //显示存在一个结点或显示最后一个结点
    94 :   }
    95 :   cout<<endl;
    96 :  }
    97 : 
    98 :  int main()
    99 :  {
    100 : 
    101 :   cout<<"请输入,提示 :回车表示输入完毕!"<<endl;
    102 :  
    103 :   struct Node *H=CreatListF();
    104 : 
    105 :   display(H);
    106 : 
    107 :   cout<<"/n单链表长度="<<length(H)<<endl;
    108 :  
    109 :  
    110 :   cout<<"删除奇数结点:/n";
    111 :   Del(&H);
    112 :   display(H);
    113 : 
    114 :   return 0;
    115 :  }
    116 :  
    117 : 

程序输出如下:

请输入,提示 :回车表示输入完毕!
1
2
3
4
5
6
7
8
9
11
0
单链表显示:
11→9→8→7→6→5→4→3→2→1

单链表长度=10
删除奇数结点:
单链表显示:
8→6→4→2→0
Press any key to continue

 

 

 


10月7日晚间消息,据国外媒体报道,德国一名54岁的数学家带领他的团队,在慕尼黑大学旁一间小小的办公室内开发出了一种新型互联网广告技术,有望淘汰Google和雅虎等公司现有广告技术。业内人士将其称之为硅谷CEO们的“噩梦”。

  这名54岁老人名叫托马斯-尼歇尔(Thomas Nitsche),是德国一家名为Proximic的公司的CTO,尼歇尔所开发出的这项技术将相关广告与网页进行匹配,也就是目前Google AdSense网络所实现的功能。但是尼歇尔和他的合作者,34岁的Proximic公司CEO菲利普-派巴(Philipp Pieper)相信,他们的技术将优于Google。接触过这项技术的人也表示,尼歇尔的技术看上去更加出色。

  Google关注于一个网页的字词,而Proximic却是查找字符串的匹配。这将意味着Proximic的方式完全独立于语言,因为虽然它采用英语实现,但是却能够很好地处理德语和中文页面。

  从理论上来说,Proximic的创意将使博客和社会化网络等站点中用户创建的内容出现随机喷涌,从而从根本上超越Google的算法。

  IDC分析师苏-菲尔德曼说,“如果他们能够实现,这的确是一项突破。”

  一名近期密切关注Proximic的技术的互联网老兵认为,它完全拥有改变游戏规则的潜力,但是尼歇尔和派巴面临证明自身远优于现有方式的挑战。

  目前,Proximic在其网站上发布了一款Firefox插件,以向外界展示它的技术。这款插件在用户浏览网页时在创建一个侧边栏,在侧边栏中显示匹配网页内容的文章或其他信息。英国《独立日报》和《Nature》出版集团如今正在采用这项技术。

  据称,在其第一轮融资中,Proximic已经从风险公司Wellington Partners和霍尔茨布林克集团获得450万美元风险投资。

  一名Google发言人表示,Google正不断升级自身的目标和上下文匹配技术,从而可以在正确的时间向正确的人展示正确的广告。

将一个链表中结点的值按奇偶拆分,使其中一个链表结点的值为偶数,另一个为奇数

这是一道笔试题,其实也挺简单,但是在当时笔试的时候,却怎么也想不出做不出来,最后还是写错了。事后在机器上又写了一下,这算是一个总结吧。 综其原因,还是自己平时程序写的少,想的少,从而导致在关键时候由...
  • fllows
  • fllows
  • 2016年10月29日 10:51
  • 1050

实验2 不带头节点的单链表

实验1 编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。 并构造测试用例进行测试。 #inclu...
  • wlxsq
  • wlxsq
  • 2015年12月24日 14:33
  • 5223

无头节点的单循环链表中删除指针s所指结点的前驱结点

//返回L后第n个节点(n可超过L的总节点个数) LNode *creLNodePoint(CLinkList L, int n); //删除s的前驱节点 void delPrior(LNode *s...
  • TysonSir
  • TysonSir
  • 2017年03月27日 23:03
  • 1167

删除单链表中的重复节点(删除多余项)

题目:如何删除单链表中的重复节点(即保证每个元素只出现一次,删除多余的,且后来出现的元素)。 一个没有排序的单链表,如 list = {a, 1, x, b, e, f, f, e, a, g, h...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月20日 13:46
  • 9443

将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变(创新工场)

示例: 交换前链表的顺序 交换后链表的顺序 4→5→3→1→2   ==>  5→3→1→4→2  1 ==> 1 (链表仅含一个元素) 2→1 ==>1→2   ==> (链表为空)  ...
  • u010817474
  • u010817474
  • 2015年09月16日 18:21
  • 2435

删除单链表中第i个节点

单链表的删除操作是将单链表的第i个节点删去。具体步骤如下: (1)找到节点ai-1的存储位置p,因为在单链表中节点ai的存储地址是在其直接前趋节点ai-1的指针域next中; (2)令p->nex...
  • cyuyanenen
  • cyuyanenen
  • 2016年05月10日 20:10
  • 6515

删除单向链表中的某一个节点

已知一个单向链表的表头head,写出一个删除某一个节点的算法,要求先找到此节点,然后删除。 #include using namespace std; typedef struct node ...
  • huahuahailang
  • huahuahailang
  • 2013年04月05日 22:33
  • 44869

在O(1)时间删除链表结点

struct ListNode {        int  m_nValue;        ListNode*  m_pNext; }; void DeleteNode(ListNode*...
  • wangfengfan1
  • wangfengfan1
  • 2015年07月07日 20:41
  • 922

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客《C语言实现单链表节点的删除(不带头结点)》中详细实现了如何在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表。代码示例上传至 https://github...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 16:09
  • 3497

PTA 链表删除结点的题目测试

链表删除结点题目描述 输入一个正整数repeat(0 输入格式 见输入样例 输出格式 见输出样例 输入样例3 5 1 2 4 3 7 4 5 2 1 5 7 5 5 3 1 2 4 10...
  • zzx19961112
  • zzx19961112
  • 2016年03月31日 17:53
  • 381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实验二 删除奇数结点的链表-----程序实现
举报原因:
原因补充:

(最多只允许输入30个字)