資料結構實驗:連結串列的應用

charminglam發表於2018-06-25

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

 

 

 

相關文章