关于C++单链表实现的问题



我正在学习以下代码,但在函数read_file((中构建单链表时感到困惑,我在下面代码旁边的函数处标记了问题:

以下是完整的代码:https://github.com/mickyjm/c.cpp.address.book.project/tree/master/CPP

列表头文件列表.h

#ifndef LLIST_H
#define LLIST_H
#include <string>
class llist {
private:
record *start;
std::string file_name;
int read_file();
int write_file();
record* reverse_llist(record *);
void delete_all_records();
public:
llist();
llist(std::string);
~llist();
int add_record(std::string, std::string, int, std::string);
int print_record(std::string);
int modify_record(std::string, std::string, std::string);
void print_all_records();
int delete_record(std::string);
void reverse_llist();
};
#endif

记录头文件record.h

#include <string>
#ifndef RECORD_H
#define RECORD_H
struct record {
std::string name;
std::string address;
int birth_year;
std::string phone_number;
struct record* next;
};
#endif

list.cpp read_file函数

int llist::read_file() {
// read_file variables
std::ifstream read_file(file_name.c_str());
struct record *temp = NULL;
struct record *index = NULL;
struct record *previous = NULL;
int file_char_length = 0;
int record_count = 0;
std::string dummy = "";
if (!read_file.is_open()) {
read_file.close();
return -1;
} // end if !read_file.is_open()
read_file.seekg(0, read_file.end); // move read pointer to end of file
file_char_length = read_file.tellg(); // return file pointer position
if (file_char_length == 0) {
read_file.close();
return 0;
} // end file_char_length == 0
read_file.seekg(0, read_file.beg); // reset file pointer to beginning
do { // do while !read_file.eof()
// do while temporary variables
std::string address = "";
temp = new record;
index = start;
std::getline(read_file, temp->name);
std::getline(read_file, temp->address, '$');
read_file >> temp->birth_year;
std::getline(read_file, dummy);
std::getline(read_file, temp->phone_number);
std::getline(read_file, dummy);
++record_count;
while (index != NULL) {                <-- what's the purpose of this loop?
previous = index;                      
index = index->next;
} // end while index != NULL
if (previous == NULL) {             <-- why would the start pointer of the
temp->next = start;                 list not at the start but after temp?
start = temp;
} else { // else if previous != NULL    
previous->next = temp;           <-- what is the purpose of this loop?
temp->next = index;
} // end if previous == NULL                         
} while (!read_file.eof()); // end do while
read_file.close();
return record_count; // read_file return - end of function
}

按所问评论的顺序排列。

  1. 这个循环的目的是什么
while (index != NULL) { 
previous = index;                      
index = index->next;
} // end while index != NULL

答:此循环用于将previous定位在列表中最后一个节点上,只要至少有一个节点。有多种技术可以做到这一点;这是比较常见的一种。当CCD_ 2比赛到循环结束时,CCD_。

  1. 为什么列表的开始指针不在开始处,而是在temp之后
if (previous == NULL) { 
temp->next = start;                 
start = temp;

答:为了解决这个问题的语法问题,在这里使用start作为这个作业的右侧是毫无意义的。它必须为NULL,否则上一个循环将加载具有非NULL值的previous,如果条件失败的话。代码可以很容易地读取:temp->next = nullptr; start = temp;

  1. 这个循环的目的是什么
} else { // else if previous != NULL    
previous->next = temp;
temp->next = index;
} // end if previous == NULL 

答:首先,这不是一个循环。这是前一个ifelse子句,这意味着如果它运行,那是因为previous不是null。类似于上面(2(中start的奇数用法,这里使用index是毫无意义的。如果你看看你在(1(中询问的循环,你会清楚地看到,直到index为NULL,事情才会停止。没有什么能改变这个事实。因此,temp->next = nullptr;相当于这里正在发生的事情。

不是粉饰它;这个实现很弱,这是一个好日子。无论它来自谁,都可以将其视为如何完成的集合,但决不是应该如何完成。

相关内容

  • 没有找到相关文章

最新更新