#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LENGTH 100000
int i = 0;
struct _Token;
typedef struct _Token{
int id;
struct _Token *next;
}Token;
/* Token池管理,防止内存泄漏,优化创建链表速度 */
typedef struct {
Token *head;
Token *tail;
int count;
} TOKPool;
int new_tok(Token **tok)
{
if (NULL == tok)
{
printf("ERROR: alloc a token with NULL\n");
return -1;
}
*tok = (Token*)malloc(sizeof(Token));
Token *t = *tok;
if (NULL == t)
{
printf("ERROR: alloc a token failed without mem\n");
return -1;
}
t->next = NULL;
t->id = i;
return 0;
}
/*扩展Token池*/
int append_tok(TOKPool *p, Token *t)
{
if (NULL == p)
{
printf("ERROR: append a tok into NULL pool\n");
return -1;
}
if (NULL == t) return 0;
if (NULL == p->head)
{
p->head = t;
p->tail = t;
p->count = 1;
}
else
{
p->tail->next = t;
p->tail = t;
p->count++;
}
return 0;
}
/*注销Token池*/
int destroy_statement_list(TOKPool *p)
{
if(NULL == p) return -1;
else
{
Token *tmp;
while(NULL != p->head)
{
tmp = p->head->next;
free(p->head);
p->head = tmp;
}
free(p);
return 0;
}
}
/*打印Token池*/
void print_TOKPool(TOKPool *p)
{
printf("\n==============print statement list================= \n");
if(NULL == p) return ;
Token *h = p->head;
while(NULL != h)
{
printf("id = %d \n", h->id);
h = h->next;
}
printf("============print statement list end=============== \n\n");
}
int main()
{
/*错误检查略*/
Token *t = NULL;
TOKPool *p = (TOKPool *)malloc(sizeof(TOKPool));
for(i = 0; i < MAX_LENGTH; i++)
{
/*创建一个Token结构节点*/
new_tok(&t);
/*将新建节点扩展到Token池后*/
append_tok(p, t);
t = NULL;
}
/*打印Token池*/
print_TOKPool(p);
/*注销Token池*/
destroy_statement_list(p);
return 0;
}
#include<stdlib.h>
#include<string.h>
#define MAX_LENGTH 100000
int i = 0;
struct _Token;
typedef struct _Token{
int id;
struct _Token *next;
}Token;
/* Token池管理,防止内存泄漏,优化创建链表速度 */
typedef struct {
Token *head;
Token *tail;
int count;
} TOKPool;
int new_tok(Token **tok)
{
if (NULL == tok)
{
printf("ERROR: alloc a token with NULL\n");
return -1;
}
*tok = (Token*)malloc(sizeof(Token));
Token *t = *tok;
if (NULL == t)
{
printf("ERROR: alloc a token failed without mem\n");
return -1;
}
t->next = NULL;
t->id = i;
return 0;
}
/*扩展Token池*/
int append_tok(TOKPool *p, Token *t)
{
if (NULL == p)
{
printf("ERROR: append a tok into NULL pool\n");
return -1;
}
if (NULL == t) return 0;
if (NULL == p->head)
{
p->head = t;
p->tail = t;
p->count = 1;
}
else
{
p->tail->next = t;
p->tail = t;
p->count++;
}
return 0;
}
/*注销Token池*/
int destroy_statement_list(TOKPool *p)
{
if(NULL == p) return -1;
else
{
Token *tmp;
while(NULL != p->head)
{
tmp = p->head->next;
free(p->head);
p->head = tmp;
}
free(p);
return 0;
}
}
/*打印Token池*/
void print_TOKPool(TOKPool *p)
{
printf("\n==============print statement list================= \n");
if(NULL == p) return ;
Token *h = p->head;
while(NULL != h)
{
printf("id = %d \n", h->id);
h = h->next;
}
printf("============print statement list end=============== \n\n");
}
int main()
{
/*错误检查略*/
Token *t = NULL;
TOKPool *p = (TOKPool *)malloc(sizeof(TOKPool));
for(i = 0; i < MAX_LENGTH; i++)
{
/*创建一个Token结构节点*/
new_tok(&t);
/*将新建节点扩展到Token池后*/
append_tok(p, t);
t = NULL;
}
/*打印Token池*/
print_TOKPool(p);
/*注销Token池*/
destroy_statement_list(p);
return 0;
}
核心思想:
1.用一个专用的tail指针来标记链表最后一个节点,可以省去每次查找最后节点的时间.
2.使用了内存池的方法,方便管理内存,降低内存泄漏的机率