資料結構實驗:連結串列的應用
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;
}
相關文章
- 資料結構實驗之連結串列三:連結串列的逆置資料結構
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構實驗之連結串列四:有序連結串列的歸併資料結構
- 資料結構實驗之連結串列一:順序建立連結串列資料結構
- 資料結構實驗之連結串列八:Farey序列資料結構
- 前端資料結構(3)之連結串列及其應用前端資料結構
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- 資料結構-單連結串列、雙連結串列資料結構
- 資料結構_連結串列的原理與應用1_單連結串列(基於C語言實現)資料結構C語言
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構—連結串列資料結構
- 資料結構--連結串列資料結構
- 資料結構-連結串列資料結構
- 資料結構(雙向連結串列的實現)資料結構
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 用c語言實現資料結構——單連結串列C語言資料結構
- 資料結構之連結串列資料結構
- 資料結構之「連結串列」資料結構
- JavaScript資料結構--連結串列JavaScript資料結構
- js實現資料結構--單連結串列JS資料結構
- 探索資料結構:單連結串列的實戰指南資料結構
- 資料結構——單連結串列的C++實現資料結構C++
- [資料結構]連結串列的實現在PHP中資料結構PHP
- [資料結構] 連結串列的實現在 PHP 中資料結構PHP
- Redis資料結構—連結串列與字典的結構Redis資料結構
- 資料結構之連結串列:206. 反轉連結串列資料結構
- 資料結構之連結串列篇(單連結串列的常見操作)資料結構
- 資料結構 - 單連結串列 C++ 實現資料結構C++
- 資料結構-雙向連結串列(Python實現)資料結構Python
- php實現基本資料結構之連結串列PHP資料結構
- 資料結構:跳躍連結串列資料結構
- 資料結構——雙向連結串列資料結構
- 資料結構之單連結串列資料結構
- 資料結構之連結串列操作資料結構