一.设计思路
1.初始化一个单链表,用来储存输入的数字
2.输入数字n,控制链表长度
3.后插法,初始化一个n个结点的循环链表
4.输入n个正负整数,赋值给单链表的数字域,连接单链表成循环链表
5.定义3个变量,用2个for循环来找元素组合成连续子数组之和最大得值
6.第一个for循环实现从第一个数字起到最后一个数字起形成的n个元素组合成连续子数组之和最大得值
7.第二个for循环实现从第i个数字起找n个元素组合成连续子数组之和最大得值
8.输出元素组合成连续子数组之和最大得值
二.源程序代码
//输入数字串形成一个环,找出子数组的和的最大值 谷伟华、牛俊燕 2016.4.13 #include<iostream> using namespace std; typedef struct LNode { int num; //数字域 struct LNode *next; //指针域 }LNode,*LinkList; void CreateList_H(LinkList &L,int n) //后插法,初始化一个n个结点的循环链表 { //正位序输入n个元素的值,建立带表头结点的单链表 L=new LNode; L->next=NULL; //先建立一个带头结点的空链表 LinkList r,p; r=L; //尾指针指向头结点 for(int i=0;i<n;i++) { p=new LNode; //生成新的结点 cout<<"请输入第"<<i+1<<"个数字:"<<endl; cin>>p->num; //输入元素值赋给新结点*p的数字 p->next=NULL; r->next=p; //将新结点*p插入到尾结点*r之后 r=p; //r指向新的尾结点*p } r->next=L->next; //指针r指向头结点,形成循环单链表 } void main() { LinkList L; int n; cout<<"请输入数字的个数:"; cin>>n; CreateList_H(L,n); //调用函数,创建列表 int i,j,bj,max,Max; LNode *q; //建立新的指针*q,让它在循环单Ì列表上进行移动 q=L; Max=q->next->num; //Max初始化初始化为第1个数字的值 for(i=0;i<n;i++) //循环次 { bj=q->next->num; //bj初始化为第i个数字的值 max=q->next->num; //max初始化为第i个数字的值 for(j=i+1;j<i+n-1;j++) //从j=i+1开始循环n-1次 { if(bj>0) { //如果前j-1个数字的子数组的和的最大值>0,那么,max=bj+第j个数字 max=bj+q->next->next->num; } else { //否则,max=第j个数字 max=q->next->next->num; } q->next=q->next->next; //q指针向后移动 bj=max; //将max赋给bj } if(Max<max) { //每一轮的max和Max比较,取最大值 Max=max; } q->next=q->next->next; //q指针向后移动 } cout<<"子数组的最大值是:"<<Max<<endl; //输出最大值 }
三.结果截图
四.两人合作中的过程、体会以及如何解决冲突
上一次的四则运算的几次迭代作业都是我的搭档写的,我寻思这次作业简单,就让我负责程序分析,代码编程,她负责代码复审和代码测试计划,但是当我把我的代码给她之后,她觉得应该用数据结构中循环链表来解决这个问题,于是我们又展开了一番讨论,最终决定用循环链表来解决,这次的作业让我有一个深刻的体会,当拿到一个题目时,和搭档讨论完之后,不论谁是负责程序分析,代码编程的,谁是负责代码复审和代码测试计划的,我们都应该动手自己做一做,即使思路一样,但是做法还是会有不同,做完之后要相互交流,以达到共同进步的目的。
五.附结对开发的工作照