#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define SIZE 5;
#define LEN sizeof(struct node)
typedef struct node {
char name[20];
struct node *next;
} nodes;
nodes *createNewNodes(void) {
printf("创建新链表\n");
nodes *p;
if ((p = (nodes *) malloc(sizeof(nodes))) == NULL) {
printf("out of mem!");
exit(1);
}
p->name[0] = '\0';
p->next = NULL;
return (p);
}
nodes *getLastNode(nodes *p) {
nodes *s;
s = p->next;
while (s != NULL) {
s = s->next;
}
return (s);
}
int getNodesNum(nodes *p) {
int i = 0;
p = p->next;
while (p) {
i++;
p = p->next;
}
return i;
}
void printAll(nodes *p, nodes *lastSecond, int n) {
nodes *t;
if (p->next == NULL) {
printf("当前链表没有节点\n");
} else {
t = p->next;
printf("=====链表地址情况:共%d个节点=====\n", n);
while (t != NULL) {
printf("数据:%s ", t->name);
printf("地址:%p\n", t);
t = t->next;
}
printf("倒数第二个元素为:%s\n", lastSecond->name);
printf("============================\n");
}
}
nodes *testInit() {
nodes *tmp, *p;
p = createNewNodes();
int i;
char *test[5] = { "abc", "def", "ghi", "jkl", "mnt" };
for (i = 0; i < 5; i++) {
if ((tmp = (nodes *) malloc(sizeof(nodes))) == NULL) {
printf("out of mem!");
exit(1);
}
strncpy(tmp->name, test[i], 20);
tmp->next = p->next;
p->next = tmp;
}
return (p);
}
void WriteNodesToFile(char *filename, nodes *p) {
printf("把链表写入文件\n");
FILE *fp;
if ((fp = fopen(filename, "wb")) == NULL) //打开文件名为:file_name的文件
{
printf("can not open the file!\n");
}
p = p->next;
while (p != NULL) {
fwrite(p, LEN, 1, fp);
p = p->next;
}
fclose(fp);
}
int headAppend(nodes *p, char *name, nodes **lastSecond,int *nums)
{
printf("写入节点: %s\n", name);
s = p;
if ((new = (nodes *) malloc(sizeof(nodes))) == NULL) {
printf("out of mem!");
exit(1);
}
strncpy(new->name, name, 20);
new->next = s->next;
s->next = new;
if (*nums < 5){
*nums +=1;
}else{
(*lastSecond)->next = NULL;
}
return 1;
}
void loadNodeFromFile(char *filename, nodes *head, nodes **lastSecond,int *nums) //尾插法
{
printf("从文件读入链表\n");
FILE *fp;
nodes *p, *t;
int i = 0;
if ((fp = fopen(filename, "rb")) == NULL) //打开文件名为:file_name的文件
{
return;//文件不存在!
}
t = head;
while (!feof(fp)) {
if ((p = (nodes *) malloc(sizeof(nodes))) == NULL) {
printf("out of mem!");
}
if (!fread(p, LEN, 1, fp)) {
break;
}
i++;
*nums = i;
*lastSecond = t;
p->next = t->next;
t->next = p;
t = p;
}
fclose(fp);
}
int main(int argc, char **argv) {
char *filename = "file_name.txt";
/*第二次的时候可以尝试从这里开始注释*/
/*
nodes *p;
printf("初始化链表: \n");
p=testInit();//初始化,这里是测试的,应该是从file文件读取结构存放到指针p
printAll(p);
headAppend(p,"opq");//加入一个节点
printAll(p);
headAppend(p,"rst");//加入一个节点
printAll(p);
//WriteNodesToFile(filename,p);
free(p);*/
/*一直到这里*/
nodes *t = createNewNodes()/*建立一个链表并初始化*/;
nodes *lastSecond;/*指向链表的倒数第二个元素*/
int nodeNum;/*链表个数*/
loadNodeFromFile(filename, t, &lastSecond, &nodeNum);
printAll(t, lastSecond, nodeNum);
//printf("%d",last->next==null);
headAppend(t, "uvw",&lastSecond, &nodeNum);//加入一个节点
printAll(t, lastSecond, nodeNum);
headAppend(t, "zxy",&lastSecond, &nodeNum);//加入一个节点
printAll(t, lastSecond, nodeNum);
/*
headAppend(t,"uvw");//加入一个节点
printAll(t);
WriteNodesToFile(filename,t);*/
free(t);
return 0;
}
分享到:
相关推荐
消息队列是一种存储消息的特殊数据结构,它允许多个进程同时读取和写入。与管道和信号量不同,消息队列可以保存一定数量的消息,并且支持消息的有序发送和接收。消息队列在系统中由内核管理,具有持久性,即使创建它...
CFQ还能区分不同类型的I/O操作,如读取和写入。对于读操作,通常会比写操作给予更高的优先级,因为读操作通常更快并且对用户体验影响更大。 **时间片轮转**: CFQ使用时间片轮转机制来分配磁盘访问时间。每个进程会...
标题"使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据"揭示了这个项目的核心内容:通过Netty接收TCP长连接的数据,并将这些数据存储到Kafka中,同时利用Kafka的批量消费功能对数据进行处理。下面我们将...
此外,为了优化用户体验,可以采用线程同步机制,避免多个线程同时写入文件导致的数据混乱,以及使用队列管理下载任务,防止过多并发请求给服务器带来压力。 综上所述,实现Android文件的断点续传下载主要依赖于...
5. **文件读写**:文件的读取通常用到`fread()`或`ifstream`,写入文件则可以使用`fwrite()`或`ofstream`。在TCP传输中,我们需要将文件内容拆分成多个数据块,逐个发送。 6. **数据发送与接收**:使用`send()`或`...
Kestrel是一款高性能、轻量级的消息队列系统,最初由Twitter开发并开源。它主要被设计用来处理实时流数据,提供了一个简单的基于HTTP的API来发送和接收消息。Kestrel的一个关键特性是其持久化能力,这使得即使在...
本文将详细介绍如何利用C语言在Linux系统上实现文件的传输,并解释代码中的关键函数与实现细节。 #### 代码结构分析 首先,让我们对提供的服务器端代码进行解析。这个程序主要实现了以下功能: 1. **文件传输**:...
文件操作包括打开、读取、写入和关闭文件。 ##### 2.1.1 打开文件 `open()`函数用于打开或创建一个文件,并返回一个文件描述符。 ##### 2.1.2 创建新文件 当文件不存在时,`open()`可以用特定的权限创建新文件。 ...
通过调整BlockCache大小来提高命中率,Memstore用于写入,BlockCache用于读取。当Memstore满64MB时触发flush,当其总大小超过堆内存的特定比例时,会强制flush。 3. **读写请求数**: - 监控各RegionServer的读写...
- `RWPM_INFO` 结构体包含了需要读写的目标地址 (`Address`)、缓冲区指针 (`Buffer`)、读写长度 (`Length`)、操作类型 (`Type`,其中 0 表示读取,1 表示写入) 和一个事件对象 (`Event`) 用于同步操作。 2. **编写...
在每写入一定行数后,将缓冲区内容写入文件并清空缓冲区,这样可以减少磁盘I/O次数: ```php $count = 0; ob_start(); foreach ($rows as $row) { fputcsv($fp, $row); $count++; if ($count % 10000 === 0) { ...
- `amqsput`:向队列写入消息。 - `amqsbcg`和`amqsget`:从队列读取和查看消息内容。 - `DISPLAY QL(QUEUE_NAME) CURDEPTH`:显示队列的当前深度,即队列中消息的数量。 7. **故障排查**: - 检查本地传输队列...
- 文件操作是系统编程的核心之一,涉及文件的创建、读写、权限管理等。 - 文件系统负责管理磁盘上的数据组织结构,如ext4、XFS等。 - **进程:** 操作系统资源分配的基本单位,每个进程都有独立的地址空间。 - **...
4. **输入与输出**:进程的个数和它们的属性(如运行时间、优先级)应该从一个输入文件读取,而调度的结果应写入到一个日志文件中。这需要处理文件输入/输出(I/O)操作,例如使用`ifstream`和`ofstream`进行文件读写...
队列管理包括创建队列、向队列写入数据和从队列读取数据。创建队列时可以指定队列长度和数据项大小。使用队列可以有效防止多个任务访问同一资源时发生冲突。 资源管理部分涉及到了二元信号量、互斥锁和计数信号量。...
这些线程会根据队列的优先级和请求类型(如读取或写入)来排序和执行任务。例如,读取操作通常优先于写入操作,因为它们对用户界面的响应时间影响更大。 在执行过程中,MQ还会考虑设备的特性,如队列深度限制、设备...
文件与IO章节包含了读写文本数据、打印输出至文件中、使用其他分隔符或行终止符打印、读写字节数据、文件不存在才能写入、字符串的I/O操作、读写压缩文件、固定大小记录的文件迭代、读取二进制数据到可变缓冲区中、...