有一个文件里面都是一行一行的数字,用空格分开,请把它每行转化成一个链表。
注意getline(ifstream, line)得到一行,而且使用了头结点。
https://gist.github.com/Jiacai/9431341
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int _val) {
val = _val;
next = NULL;
}
};
/*
123 456
*/
void readFile(string fileName, ListNode** list, int lineLimit) {
ifstream ifstrm(fileName);
if(!ifstrm) {
exit(1);
}
int i = 0;
string line;
while (getline(ifstrm, line) && i < lineLimit) {
// parse this line
ListNode* dummy = new ListNode(0);
ListNode *last = dummy;
int idx = 0;
while (idx < line.length()) {
// skip spaces
while (idx < line.length() && line[idx] == ' ') {
idx++;
}
if (idx == line.length()) break;
int num = 0;
while (idx < line.length() && line[idx] != ' ') {
num = num * 10 + line[idx] - '0';
idx++;
}
ListNode* node = new ListNode(num);
last->next = node;
last = node;
}
last->next = NULL;
list[i] = dummy->next;
delete dummy;
i++;
}
ifstrm.close();
}
int main() {
const int LINE_COUNT = 100;
ListNode* list[LINE_COUNT];
memset(list, 0, sizeof(list));
readFile("d:\\test.txt", list, LINE_COUNT);
for (int i = 0; i < LINE_COUNT; i++) {
ListNode* current = list[i];
if (current == NULL) break;
while (current != NULL) {
cout << current->val << "->";
current = current->next;
}
cout << "NULL" << endl;
}
system("pause");
}
第二次写,数组里保存头结点:
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
struct Node
{
int val;
Node *next;
};
void readFile(string fileName, Node** lineHead, int lenLimit)
{
fstream f(fileName);
if (!f) {
exit(1);
}
string line;
int lineIdx = 0;
while (getline(f, line) && lineIdx < lenLimit)
{
lineHead[lineIdx] = new Node();
Node * current = lineHead[lineIdx];
// skip spaces at first
int i = 0;
while (i != line.length())
{
while (i < line.length() && line[i] == ' ')
{
i++;
}
if (i == line.length()) continue;
int num = 0;
// get a number
while (i != line.length() && line[i] != ' ')
{
num = num * 10 + (line[i] - '0');
i++;
}
Node * node = new Node();
node->val = num;
node->next = NULL;
current->next = node;
current = node;
}
lineIdx++;
}
f.close();
}
int main()
{
const int LINE_COUNT = 100;
Node* list[LINE_COUNT];
memset(list, 0, sizeof(list));
readFile("d:\\test.txt", list, LINE_COUNT);
for (int i = 0; i < LINE_COUNT; i++) {
if (list[i] == NULL) break;
Node* current = list[i]->next;
if (current == NULL)
{
cout << "NULL" << endl;
continue;
}
while (current != NULL) {
cout << current->val << "->";
current = current->next;
}
cout << "NULL" << endl;
}
system("pause");
return 0;
}