#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct load_src {
void *obj;
struct load_src *pNext;
} DATASR;
typedef struct tab1 {
char idno[18 + 1] ;
} TAB1;
typedef struct tab2 {
char acountno[30 + 1];
double bal;
}TAB2;
typedef struct line {
struct tab1 stTab1;
struct tab2 stTab2;
} LINE;
int getcol(int n, char *buf, char *col )
{
char *s = NULL;
char *e = NULL;
s = e = buf;
for (int i = 0; i < n; i++)
{
e = strchr(s, '|');
if (e == NULL)
return -1;
else
if (i == n - 1) strncpy(col, s, e-s) ;
s = e + 1;
}
return 0;
}
void List_list(DATASR **ppH)
{
DATASR *pCurNode = NULL;
for (pCurNode = *ppH; pCurNode; pCurNode = pCurNode->pNext)
printf("身份证号:%s 的客户名下所有卡账户总余额为:%.2f\n", ((LINE*)pCurNode->obj)->stTab1.idno, ((LINE*)pCurNode->obj)->stTab2.bal);
}
int Free(DATASR *ppH)
{
DATASR *pCurNode = NULL;
for (; ppH; ppH = pCurNode)
{
pCurNode = ppH->pNext;
free(ppH->obj);
free(ppH);
}
return 0;
}
int NodeAgent(DATASR **ppH, LINE *pstLine)
{
DATASR *pCurNode = NULL;
for (pCurNode = *ppH; pCurNode; pCurNode = pCurNode->pNext)
{
if (!strcmp(pstLine->stTab1.idno, ((LINE *)pCurNode->obj)->stTab1.idno))
{
((LINE *)pCurNode->obj)->stTab2.bal += pstLine->stTab2.bal;
return 1;
}
}
return 0;
}
int Loadfile( DATASR **ppH )
{
char acFileName[100 + 1];
char buf[100 + 1];
char bal[23 + 1];
LINE stLine;
FILE *fp = NULL;
DATASR *pCurNode = NULL;
DATASR *pNode = NULL;
memset(acFileName, 0x00,sizeof(acFileName));
memset(buf, 0x00, sizeof(buf));
sprintf(acFileName, "%s/%s", "/home/xiaotufei/user/code", "dat");
fp = fopen(acFileName, "r");
if (fp == NULL)
{
printf("打开文件报错\n");
return -1;
}
while(!feof(fp))
{
memset(buf, 0x00, sizeof(buf));
if (!fgets(buf, sizeof(buf), fp))
break;
memset(&stLine, 0x00, sizeof(stLine));
getcol(1, buf, stLine.stTab1.idno);
getcol(2, buf, stLine.stTab2.acountno);
getcol(3, buf, bal);
stLine.stTab2.bal = atof(bal);
if (NodeAgent(ppH, &stLine)) continue;
pNode = (DATASR *)malloc(sizeof(DATASR ));
if (pNode == NULL)
{
printf("分配DATASR失败");
return -1;
}
memset(pNode, 0x00, sizeof(DATASR));
pNode->obj = (LINE *)malloc(sizeof(LINE));
if (pNode->obj == NULL)
{
printf("分配LINE失败");
return -1;
}
memset(pNode->obj, 0x00, sizeof(LINE));
memcpy(pNode->obj,&stLine,sizeof(stLine));
if (*ppH == NULL)
{
*ppH = pNode;
pCurNode = pNode;
}
else
{
pCurNode->pNext = pNode;
pCurNode = pCurNode->pNext;
}
}
}
int main(void)
{
DATASR *pH = NULL;
Loadfile(&pH );
List_list(&pH);
Free(pH);
return 0;
}
编译如下:
功能说明:
1、将dat 文件内容装进void *链表;
2、身份证信息相同时,累加账户余额(即求每人名下资产);
技能点:
1、链表节点中包含 void *指针(或其他指针)时,需要为指针malloc内存;
2、任何其他类型的指针可以赋值给void **指针,可以利用这个实现通用接口;
3、free内存的时候,先将链表的next节点保存,然后释放当前节点,然后重复此动作;