📄 list.c
字号:
/*****************************************************************/
/*
* Copyright (c) 2008,北京归创科技有限公司技术部
* All rights reserved.
*
* 文件名称:list.c
* 用 途:单链表的实现
* 创建日期:2008年5月29日
*/
/*****************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <memory.h>
#include "list.h"
#include "ds_define.h"
list *list_create()
{
list *dl = MALLOC(list,1);
if(dl)
{
dl->length = 0;
dl->head = NULL;
return dl;
}
return NULL;
}
DS_RESULT list_insert(void *data,list *dl)
{
assert(dl);
return list_insert_position(data,dl,dl->length);
}
DS_RESULT list_insert_position(void *data,list *dl,int position)
{
list_node *ln,*nln,*nextln;
int pos = position;
int posindex = 0;
assert(dl);
if(pos < 0) pos = 0;
if(pos > dl->length) pos = dl->length;
nln = MALLOC(list_node,1);
if(!nln) return DS_MEMORY_ERROR;
dl->length++;
nln->data = data;
nln->next = NULL;
ln = dl->head;
if(!ln)
{
dl->head = nln;
return DS_SUCCESS;
}
if(pos == 0)
{
dl->head = nln;
nln->next = ln;
}
else
{
for(nextln = ln->next;posindex < pos - 1;posindex++,ln = ln->next,nextln = ln->next);
ln->next = nln;
nln->next = nextln;
}
return DS_SUCCESS;
}
void *list_remove(void *data,int data_length,list *dl)
{
void *r_data;
list_node *ln,*preln;
assert(dl);
preln = NULL;
ln = dl->head;
while(ln)
{
if(memcmp(ln->data,data,data_length))
{
if(!preln) dl->head = ln->next;
else preln->next = ln->next;
r_data = ln->data;
free(ln);
dl->length--;
return r_data;
}
preln = ln;
ln = ln->next;
}
return NULL;
}
void *list_remove_position(int position,list *dl)
{
void *data;
list_node *ln,*preln;
int pos = 0;
assert(dl);
if(position < 0 || position > dl->length - 1) return;
for(preln = NULL,ln = dl->head;pos < position;pos++,preln=ln,ln=ln->next);
if(!preln) dl->head = ln->next;
else preln->next = ln->next;
dl->length--;
data = ln->data;
free(ln);
return data;
}
void *list_getdata(int index,list *dl)
{
int i = 0;
list_node *ln;
assert(dl);
if(index < 0 || index > dl->length - 1) return NULL;
for(ln = dl->head;i < index;i++,ln = ln->next);
return ln->data;
}
void list_free(list *dl,BOOL freedata)
{
list_node *ln,*nextln;
if(!dl) return;
ln = dl->head;
while(ln)
{
nextln = ln->next;
if(freedata) free(ln->data);
free(ln);
ln = nextln;
}
free(dl);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -