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

一、设计思路

(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 }

 

三、运行截图

技术分享技术分享技术分享

四、心得体会

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

五、无图无真相

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。