⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.c

📁 数据结构的C语言实现
💻 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 + -