数据结构实验:链表的应用

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

猜你喜欢

转载自blog.csdn.net/charminglam/article/details/80808285