个人作业十六:找水王

返回一个整数数组中最大子数组的和3

一、设计思路

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

三、运行截图

                       

四、心得体会

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

原文地址:https://www.cnblogs.com/lrhan/p/5609655.html