【算法】单链表的一些操作(存取、查找、取出、插入、删除)
c++ 如何用链表存取数据
由于单链表的每个结点都有一个数据域和一个指针域。所以,每个结点可以定义成一个记录。
其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(这就是传说中的结构体套结构体)
NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了
#include<iostream> using namespace std; struct Node{ int data; Node *next; }; Node *head, *p, *r; //r指向链表的当前最后一个结点,可以称为尾指针 int x; int main(){ cin>>x; head=new Node; //申请头结点 r=head; while(x!=-1){ //读入的数非-1 p=new Node; //否则,读入一个新结点 p->data=x; //把数据放入数据域 p->next=NULL; // 先把当前这个结点的指针域变为NULL r->next=p; //把新结点链接 接到前面的链表中(p可以认为是一个结点的头指针), r=p; //尾指针后移一个 cin>>x; } return 0; }
【写法2】
//声明节点结构 typedef struct Link{ int elem;//存储整形元素 struct Link *next;//指向直接后继元素的指针 }link; //创建链表的函数 link * initLink(){ link * p=(link*)malloc(sizeof(link));//创建一个头结点 link * temp=p;//声明一个指针指向头结点,用于遍历链表 //生成链表 for (int i=1; i<5; i++) { //创建节点并初始化 link *a=(link*)malloc(sizeof(link)); a->elem=i; a->next=NULL; //建立新节点与直接前驱节点的逻辑关系 temp->next=a; temp=temp->next; } return p; }
C++将数据写入磁盘文件
C++读取磁盘文件
0.前言
简单介绍一下C++读取文件的基本操作。
关键技术:
freopen() 文件的打开函数 FILE *fp fp=fopen(文件名,使用文件方式) 例如: fp=fopen("123.txt","r");
它表示要打开名称为123的文本文档,使用文件方式为“只读”,fopen()函数带回指向123.txt文件的指针并赋给fp,也就是说fp指向123.txt文件。
文件使用方式 | 含义 |
“r”(只读) | 打开一个文本文件,只允许读数据 |
“w”(只写) | 打开或建立一个文本文件,只允许写数据 |
“a”(追加) | 打开一个文本文件,并在文件末尾写数据 |
“fb”(只读) | 打开一个二进制文件,只允许读数据 |
“wb”(只写) | 打开或建立一个二进制文件,只允许写数据 |
“ab”(追加) | 打开一个二进制文件,并在文件末尾写数据 |
“r+”(读写) | 打开一个文本文件,允许读和写 |
“w+”(读写) | 打开或建立一个文本,允许读写 |
“a+”(读写) | 打开一个文件文件,允许读,或在文件末尾追加数据 |
“rb+”(读写) | 打开一个二进制文件,允许读和写 |
“wb+”(读写) | 打开或建立一个二进制文件,允许读和写 |
“ab+”(读写) | 打开一个二进制文件,允许读,或在文件末尾追加数据 |
1.fclose() 文件的关闭函数 fclose(文件指针) 作用是通过指针将该文件 关闭 2.fgetc() 函数 ch=fgetc(fp) 该函数的作用是从指定的文件(fp指向的文件)读入一个字符赋给ch。注意该文件必须是以读或读写方式打开的。
C++链表结构——单链表
C++中箭头指针的含义及用法
树的遍历
在应用树结构解决问题时,往往要求按照某种此项获得树中全部结点的信息,这种操作叫做树的遍历。遍历的方法有很多种。常用的有:
A. 先序遍历:先访问根结点,再从左到右按照先序思想遍历各子树。
B. 后序遍历:先从左到右遍历各个子树,再访问根结点。
C.层次遍历:按层次从小到大逐个访问,同一层次按照从左到右的次序。
D.叶结点遍历:有时把所有的数据信息都存放叶结点中,而其余结点都是用来表示数据之间的某种分支或层次关系,这种情况就用这种方法。
树的存储结构
【题解】均分纸牌
【题目描述】
有n堆纸牌,编号分别为 1,2,…, n。每堆上有若干张,但纸牌总数必为n的倍数。可以在任一堆上取若干张纸牌,然后移动。
移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为n-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
例如 n=4,4堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6
移动3次可达到目的:
从 ③ 取4张牌放到④(9 8 13 10)->从③取3张牌放到 ②(9 11 10 10)-> 从②取1张牌放到①(10 10 10 10)。
【输入描述】
n(n 堆纸牌,1 ≤ n ≤ 100)
a1 a2 … an (n 堆纸牌,每堆纸牌初始数,l≤ ai ≤10000)
【输出描述】
一个正整数,即最少需要的组数。所有堆均达到相等时的最少移动次数。
【样例输入】
4 9 8 17 6
【样例输出】
3