前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言操作excel表格-链表实现

C语言操作excel表格-链表实现

作者头像
杨源鑫
发布2019-07-04 15:31:38
1.3K0
发布2019-07-04 15:31:38
举报
文章被收录于专栏:嵌入式开发圈嵌入式开发圈

之前写过类似的文章:

https://blog.csdn.net/morixinguan/article/details/83309576

关于文件操作,特别是从后往前读取,要是像上面这篇文章一样去操作,那效率明显就太低了,如果一旦数据一多,很难处理。

于是想到了用更好的数据结构来解决这个问题,不就是想从后往前显示嘛?那么就可以用链表来解决这个问题了。

代码语言:javascript
复制
typedef struct links
{
 int size  ; 
 void *ptr ; 
 struct links *next ;
 struct links *pre  ;
}LINKS;
    这是链表的数据结构,ptr就是要存放的数据,pre是前驱指针,next是后继指针,通过这两个指针,即可以方便实现链表的遍历。
   下面定义要实现的函数:
typedef  void (*print_t)(void *Data)  ; 
void print(void *Data);
//打印链表节点
void   print_links(LINKS *Header , print_t  func);
//创建链表头
LINKS  *Create_Links_Header(int size);
//头插
void  top_append(LINKS *Header , void *Data , int size);
//获取文件总行数
int GetTotalLineCount(FILE *file);
整体实现:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define  NR(x)   (sizeof(x)/sizeof(x[0]+0))
typedef struct links
{
 int size  ; 
 void *ptr ; 
 struct links *next ;
 struct links *pre  ;
}LINKS;
typedef  void (*print_t)(void *Data)  ; 
void print(void *Data);
void   print_links(LINKS *Header , print_t  func);
LINKS  *Create_Links_Header(int size);
void  top_append(LINKS *Header , void *Data , int size);
int GetTotalLineCount(FILE *file);
int main(void)
{
 int line = 0 ;
 int file_all_line = 0 ;
 char line_buffer[50] = {0};
 LINKS *Header = NULL ;
 //1.初始化链表 
 Header =  Create_Links_Header(0);
 if(NULL == Header)
 {
 fprintf(stderr , "malloc  Header fail \n");
 return -1 ; 
 }
 //2.插入数据 
 FILE *fp = NULL ;
 fp = fopen("1.csv","r");
 if(NULL == fp)
 {
 printf("open csv file fail!\n");
 return -1 ;
 }
 //移到文件头 
 fseek(fp,0,SEEK_SET);
 //获取文件的总行数 
 file_all_line = GetTotalLineCount(fp);
 for(line = 0 ; line < file_all_line ; line++)
 {
 if(fgets(line_buffer,50,fp)) 
 {
 printf("line_buffer:%s",line_buffer);
 top_append(Header , line_buffer , 100);
 }
 }
 print_links(Header,print);
 fclose(fp);
 free(Header);
 return 0 ;
}
void print(void *Data)
{
 printf("%s" ,Data);
 //这里可以进行数据处理...
 //这里可以进行数据处理...
}
//打印链表节点
void print_links(LINKS *Header , print_t func)
{
 LINKS *tmp = Header->next ; 
 while(tmp != Header)
 {
 func(tmp->ptr);
 tmp = tmp->next ;
        free(tmp->pre);
 }
}
//获取文件的总行数
int GetTotalLineCount(FILE *file)
{   
 int line_num = 0;
 char strLine[50];
 fseek(file,0,SEEK_SET);
 while (fgets(strLine, 50, file))
 line_num++;
 fseek(file,0,SEEK_SET);
 return line_num;
}
//创建表头
LINKS  *Create_Links_Header(int size)
{
 LINKS *New = NULL  ; 
 New = malloc(sizeof(LINKS));
 if(NULL == New)
 {
 fprintf(stderr , "malloc LINKS header fail \n");
 return NULL ; 
 }
 New->size = size ; 
 New->ptr = NULL ; 
 New->next = New ;
 New->pre  = New ; 
 return New ;
}
//链表头插
void  top_append(LINKS *Header , void *Data , int size)
{
 LINKS *New = NULL ; 
 New = malloc(sizeof(LINKS));
 if(NULL == New)
 {
 fprintf(stderr , "malloc links fail \n");
 return ;
 }
 New->ptr=NULL ;
 New->size = size ; 
 New->ptr = malloc(size);
 if(NULL == New->ptr)
 {
 fprintf(stderr , "malloc links data fail \n");
 return ; 
 }
 memcpy(New->ptr , Data , size);
 New->next = Header->next ; 
 New->pre  = Header ; 
 New->next->pre = New ;  
 New->pre->next = New ; 
}

运行结果:

如下图所示为excel文件的数据:

运行程序得到:

从这里看到,整个程序就是利用了栈的思想,先进后出,这样的实现既简单,也高效。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式开发圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档