PS:仅供参考,自己多思考方有收获
问题:
输入数据(设为整型)建立单链表,并求相邻k个节点data值之和为最大的第一节点。
要求:
(1)建立链表、求最大值功能采用独立函数实现;
(2)可根据用户需求多次建表;
(3)数据的输入可从键盘输入,也可从txt文件输入;
(4)程序结束时要释放链表空间。
代码:
#include<iostream>
#include<malloc.h>
#include<string>
#include<string.h>
#include<fstream>
using namespace std;
int sum_node = 0;
//链表结点结构
typedef struct node
{
int data;
struct node *next;
}linknode, *link;
//建立链表
link Createlist(int choose)
{
string s;
link H, p, r;
int a;
H = (link)malloc(sizeof(linknode));
r = H;
if (choose == 1) //键盘输入模式
{
cout << "input data:\n";
cin >> s;
while (s != "#")
{
sum_node++;
p = (link)malloc(sizeof(linknode));
a = atoi(s.c_str()); //string转换int
p->data = a;
r->next = p; //可不可以理解成p为一个用来帮助生成链表的指针,相当于先行者,
r = p; //r等着先行者p空间的创建与赋数,完成后,r抛出一条线(—>next)引到p的位置,再让r跳到p的位置,p然后再开辟新的空间,继续当先行者。如果可以这样理解,那么r不用开辟空间的理由也就明白了
cin >> s;
}
}
else if (choose == 2) //文件读取模式
{
ifstream inf;
inf.open("data.txt"); //自行编写
while (getline(inf, s)) //按行读取
{
a = atoi(s.c_str()); //string转换int
p = (link)malloc(sizeof(linknode));
p->data = a;
r->next = p;
r = p;
sum_node++;
}
}
else //非法输入
{
cout << "Error!\n";
return NULL;
}
r->next = NULL;
return H;
}
//相邻函数计算
void Adjmax(link H, int k)
{
int sum = 0;
int max;
int i, j;
link p = H;
p = p->next;
link r = p;
int u = 1; //记录最大相邻数的第一个数,假设序号从0开始
for (i = 0; i <= sum_node - k; i++) //一共需要跑n-k趟
{
for (j = i; j < i + k; j++) //计算子序列的和
{
sum = sum + r->data;
r = r->next;
}
if (i == 0)
{
max = sum;
}
else if (sum > max) //打擂台方式,更新max值和序号i值
{
max = sum;
u = i + 1;
}
sum = 0;
p = p->next;
r = p;
}
cout << "id:" << u << ' ' << "max:" << max << endl;
}
int main()
{
char a;
while (1)
{
int k;
int choose;
link head, p, q;
cout << "Choose which method do you want to read data:[1:from keyboard/2:from txt. file]\n"; //选择用哪种方式读取数据
cin >> choose;
if (choose != 1 && choose != 2)
{
cout << "Error!\n";
return -1;
}
cout << "input k:" << endl;
cin >> k;
head = Createlist(choose); //生成链表
if (head==NULL) //非法性检查
{
return -1;
}
Adjmax(head, k); //核心计算
p = head;
while (p->next) //释放链表节点空间
{
q = p;
p = p->next;
free(q);
}
free(p);
cout<<"continue?[y/n]:"; //交互,是否继续
cin >> a;
if (a == 'n')
{
break;
}
sum_node = 0;
cout << '\n';
};
return 0;
}