您的位置:首页 > 其它

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

2015-03-27 23:48 232 查看
一、设计思路

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

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

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

二、源代码

// 一维数组.cpp : Defines the entry point for the console application.
// 袁佩佩 于海洋

#include "stdafx.h"
#include<iostream.h>
#define num 5
/*链表数据结构*/
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*链表的初始化*/
void InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
}
/*链表数据的插入*/
void InsertList(LinkList &L)//建立循环链表
{
LNode *head,*temp;
head=L;
cout<<"请输入"<<num<<"个数字:";
for(int i=0;i<num;i++)
{
temp=new LNode;
cin>>temp->data;
temp->next=NULL;
head->next=temp;
head=head->next;
}
head->next=L->next;                //首尾相连,建立循环链表
}
void output(LinkList L)
{
for(int i=0;i<num;i++)
{
cout<<L->next->data<<" ";
L=L->next;
}
}
int main( )
{
int max,sum,flag=0;                //sum是字数组的和,max是最大的子数组的和
int ordern=0,orderx=0;
LinkList L;
LNode *temp,*temp1,*temp2,*head;
InitList(L);
InsertList(L);                    //由用户往链表中插入数据
temp=L->next;
max=L->next->data;                //max初值是链表中第一个数
for(int i=0;i<num;i++,temp=temp->next)
{
temp2=temp;
for(int j=0;j<num;j++,temp2=temp2->next)
{
for(int k=j;k<num;k++)
{
sum=0;
temp1=temp2;
for(int h=j;h<=k;h++,temp1=temp1->next)
{
sum=sum+temp1->data;
}
if(max<sum)        //将最大值赋给max,并且保存当时的序号 
{
max=sum;
ordern=j;
orderx=k;
head=temp;
flag=i;        //用来求取最大值的时候的链表的情况
}
}
}
}
temp=L->next;
cout<<"最大字数组是:";
for(i=0;i<(flag+ordern);i++)    //找出取得最大值的时候的子数组的第一个数
{
temp=temp->next;
}
for(int j=0;j<(orderx-ordern+1);j++,temp=temp->next)//将取得最大和的子数组元素输出
{
cout<<temp->data<<"  ";
}
cout<<endl<<"最大子数组的和是:"<<max<<endl;;

return 0;
}


三、运行截图







四、心得体会

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

五、无图无真相

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: