• 结对开发Ⅴ——循环一维数组求和最大的子数组


    一、设计思路

    (1)数据的存储结构是链表,最后一个结点的next指向第一个元素的结点;

    (2)数据个数为n,则最多有n*(n+(n-1)+...+1)种情况(包括重复);

    (3)剩下的部分与二维数组的差不多。

    二、源代码

     1 // 一维数组.cpp : Defines the entry point for the console application.
     2 // 袁佩佩 于海洋
     3 
     4 #include "stdafx.h"
     5 #include<iostream.h>
     6 #define num 5
     7 /*链表数据结构*/
     8 typedef struct LNode
     9 {
    10     int data;
    11     struct LNode *next;
    12 }LNode,*LinkList;
    13 /*链表的初始化*/
    14 void InitList(LinkList &L)
    15 {
    16     L=new LNode;
    17     L->next=NULL;
    18 }
    19 /*链表数据的插入*/
    20 void InsertList(LinkList &L)//建立循环链表
    21 {
    22     LNode *head,*temp;
    23     head=L;
    24     cout<<"请输入"<<num<<"个数字:";
    25     for(int i=0;i<num;i++)
    26     {
    27         temp=new LNode;
    28         cin>>temp->data;
    29         temp->next=NULL;
    30         head->next=temp;
    31         head=head->next;
    32     }
    33     head->next=L->next;                //首尾相连,建立循环链表
    34 }
    35 void output(LinkList L)
    36 {
    37     for(int i=0;i<num;i++)
    38     {
    39         cout<<L->next->data<<" ";
    40         L=L->next;
    41     }
    42 }
    43 int main( )
    44 {
    45     int max,sum,flag=0;                //sum是字数组的和,max是最大的子数组的和
    46     int ordern=0,orderx=0;
    47     LinkList L;
    48     LNode *temp,*temp1,*temp2,*head;
    49     InitList(L);
    50     InsertList(L);                    //由用户往链表中插入数据
    51     temp=L->next;
    52     max=L->next->data;                //max初值是链表中第一个数
    53     for(int i=0;i<num;i++,temp=temp->next)
    54     {
    55         temp2=temp;
    56         for(int j=0;j<num;j++,temp2=temp2->next)
    57         {
    58             for(int k=j;k<num;k++)
    59             {
    60                 sum=0;
    61                 temp1=temp2;
    62                 for(int h=j;h<=k;h++,temp1=temp1->next)
    63                 {
    64                      sum=sum+temp1->data;
    65                 }
    66                  if(max<sum)        //将最大值赋给max,并且保存当时的序号 
    67                  {
    68                      max=sum;
    69                      ordern=j;
    70                      orderx=k;
    71                      head=temp;
    72                      flag=i;        //用来求取最大值的时候的链表的情况
    73                  }
    74             }
    75         }
    76     }
    77     temp=L->next;
    78     cout<<"最大字数组是:";
    79     for(i=0;i<(flag+ordern);i++)    //找出取得最大值的时候的子数组的第一个数
    80     {
    81         temp=temp->next;
    82     }
    83     for(int j=0;j<(orderx-ordern+1);j++,temp=temp->next)//将取得最大和的子数组元素输出
    84     {
    85         cout<<temp->data<<"  ";
    86     }
    87     cout<<endl<<"最大子数组的和是:"<<max<<endl;;
    88 
    89     return 0;
    90 }

    三、运行截图

    四、心得体会

      这次最大的感受就是,我们两个都有各自的思路想法,都想向对方阐述自己的想法,导致无法很好地接受倾听对方的声音。我觉得他的方法浪费内存空间,他认为他的查找过程清晰明了。最终还是于海洋同学妥协了,采用的是我的思路,用循环链表。开发过程还是像上两次差不多,个人有个人的优缺点,可以相互弥补。调试程序时,也是我俩共同协作排查出了错误。

    五、无图无真相

     

  • 相关阅读:
    [esp8266]RAM不足问题,导致重启
    在windows上使用ubuntu(非虚拟机模式)
    [RPAPython]自动化脚本入门使用1
    交叉编译openmv源码(ubuntu)
    springboot bean的生命周期
    转,记一次freessl免费ssl证书申请
    使用httpproxymiddleware中间件代理请求实现跨域方法
    win7 node 高版本 问题
    js JavaScript 对象属性特征 访问器 set get setter getter 红宝书第四版
    windows 环境变量 编辑工具
  • 原文地址:https://www.cnblogs.com/JJJanepp/p/4373412.html
Copyright © 2020-2023  润新知