链表是由一系列连接在一起的结点构成,其中的每个结点都是一个数据结构,一般是动态分配、使用和删除的
链表的结点通常是动态分配、使用和删除的,允许链表在程序运行时增大或缩小。如果需要将新信息添加到链表中,则程序只需分配另一个结点并将其插入到系列中。如果需要从链表中删除特定的信息块,则程序将删除包含该信息的结点。
链表对数组和矢量的优点:删除和添加元素的速度快
尽管链表的编码和管理比数组更复杂,但它们有一些明显的优势。首先,链表可以容易地扩大或缩小。实际上,程序员并不需要知道链表中有多少个结点。它们只是根据需要在内存中创建。
有人可能会争辩说,链表并不优于矢量(可在标准模板库中找到),因为它们也可以扩展或缩小。然而,链表对于矢量的优势是结点可以插入链表或从链表中删除的速度。要将值插入矢量的中间,需要将插入点之后的所有元素朝矢量的末尾移动一个位置,从而为新值腾出空间。同样,从矢量中删除一个值需要将删除点之后的所有元素都朝矢量的开始方向移动一个位置。而当一个结点插入链表或从链表中删除结点时,其他结点都不必移动。
单链表的结构:
代码示例:
#include <iostream>
#include <fstream>
using namespace std;
struct List_Node
{
int data;
List_Node * next;
List_Node(int val = 0,List_Node *new_next = nullptr) {data = val;next = new_next;}//构造函数,便于初始化
};
int main()
{
List_Node *head = new List_Node(10);//初始化很简洁,增加头节点
List_Node *ptr = head;
ifstream infile("list.txt");//从文件读数据
if(!infile){cout << "error:open the list error!!!"<<endl;exit(1);}//检查文件是否正确读入
int indata;
while(infile >> indata) {
//循环添加节点
cout << indata << " ";
ptr->next = new List_Node(indata);
ptr = ptr->next;
}
ofstream outfile("out_list.txt");//将数据输出到文件中
ptr = head;
while(ptr){
//循环读取数据进行输出
outfile << ptr->data << endl;
ptr = ptr -> next;
}
return 0;
}