我已经用谷歌搜索了很多,但是我想知道一件事。我有一个需要读取的.csv
文件,并传递给带有链接列表的struct
。文件行的大小不同。
我想使用fgets()
读取每一行,然后使用strtok
通过“,”获取信息并传递给struct
。
我正在使用LINUX。
typedef struct nodo
{
int row1;
char row2;
int row3;
struct nodo *next;
struct nodo *nant;
}nodo;
nodo* insert_last(nodo* base1, nodo* nv)
{
if(base1 == NULL)
base1 =nv;
base1->next = NULL;
while(base1->next != NULL)
base1 = base1->next;
base1->next = nv;
nv->nant = base1;
nv->next = NULL;
}
nodo* put2memory(nodo *base1)
{
nodo *nv;
FILE *fp1=fopen(xxx,"r");
char *tok;
while(fgets((buffer, sizeof(buffer),fp1) != NULL))
{
nv = (nodo*) malloc (sizeof(nodo));
nv->next=NULL;
tok = strtok(buffer,",");
nv->row1=tok;
tok = strtok(NULL,",");
nv->row2=tok;
tok = strtok(NULL,",");
nv->row3=tok;
insert_last(base1,nv);
}
free(nv);
}
int main()
{
nodo *base1;
put2memory(base1);
return 0;
}
我正在考虑这样做,但我返回的是“我的朋友”细分错误!
语法文件:
123,abc,23
23,d,444
。
。
。
最佳答案
对于insert_last
为null的情况,base1
对我来说并不好。
nodo* insert_last(nodo* base1, nodo* nv)
{
if(base1 == NULL)
base1 =nv;
至少我会在这里放
return nv
。否则,您的代码将被设置为nv->next
到nv
。 (或者尝试在nv
之后插入base1
,该设置将在`nv之后设置。)从广义上讲,请注意您的
insert_last
为O(n),因为它必须在插入之前找到列表的末尾。这意味着插入N个元素是O(N2)。体面的链表实现将跟踪内存中的tail元素并以恒定的时间插入。更新:阅读其余代码。这也是无效的:
nodo *base1;
put2memory(base1);
base1
尚未初始化,这是一个垃圾值。您正在尝试将其用作指针。以下是有关解决方法的建议:
将
return
语句添加到insert_last
。我建议返回列表的开头。最好同时存储头部和尾部,并避免插入O(N)。将您的呼叫更改为
insert_last
以执行以下操作:list_head = insert_last(base1,nv);
在
main
中,您可以执行以下操作:list_head = put2memory(NULL);
再次更新:为了说明O(1)的插入,这是对
put2memory
的调整。请注意,您最终将不得不在每个列表节点上调用free()
。nodo* put2memory()
{
nodo *head = NULL, *prev = NULL, *nv;
FILE *fp1=fopen(xxx,"r");
char *tok;
while(fgets((buffer, sizeof(buffer),fp1) != NULL))
{
nv = (nodo*) malloc (sizeof(nodo));
nv->next=NULL;
tok = strtok(buffer,",");
nv->row1=tok;
tok = strtok(NULL,",");
nv->row2=tok;
tok = strtok(NULL,",");
nv->row3=tok;
if (prev)
prev = prev->next = nv;
else
head = prev = nv;
}
return head;
}