链表

链表


双向链表的结点是结构体,由数据本体(key),指向前一元素的指针(prev)和指向后一元素的指针(next)组成,这些结构体通过指针连接成一个链,形成了双向链表。
双向链表 的结点:

struct Node{
int key;
Node *prev,*next
};

另外,在表头设置了一个头结点,头结点不包含实际数据,让我们轻松对链表进行修改。
init函数用于初始化链表:

Node *nil;

void init()
{
	nil = (Node *)malloc(sizeof(Node));  //动态申请指定大小的内存空间
	nil->next = nil;                                   //箭头运算符
	nil->prev = nil;
}

insert函数用于生成包含所输入键值的结点,并将该结点插入表的开头
往双向链表中插入元素:

void insert(int key)
{
	Node *x = (Node *)malloc(sizeof(Node));
    x->key = key;
    //在头结点后加入元素
	x->next = nil->next;//将x与除了头结点的下一元素链接 
	nil->next->prev = x;// 下一元素向上链接 
    nil->next = x;    //头结点向x元素链接 
    x->prev = nil;    //x元素向上链接 
}

listSearch函数用于搜索元素,可以在链表中寻找包含指定键值的结点,并返回其指针,假设cur为当前位置结点的指针,那么只要从头结点的next所指的结点,即链表开头元素开始逐个执行 cur = cur->next,即可逐一访问每一个结点。
在双向链表中搜索元素:

Node *listSearch(int key) 
{
	Node *cur = nil->next;//从头结点后面的元素开始访问 
	while(cur != nil && cur->key != key) //找到key或者回到头结点时结束
	{
		cur=cur->next;
	}
	return cur;
}

deleteNode 函数会改变指针所指的位置,从而删除指定结点t。
从双向链表中删除元素:

void deleteNode(Node *t)
{
	if( t == nil) return;//t为头结点时,不做处理 
	t->prev->next = t->next; 
	t->next->prev = t->prev;
	free(t);//释放不需要的内存空间 
}

void deleteNodeFirst()//删除第一个元素
{
	deleteNode(nil->next);
 } 
 
void deleteNodeLast()删除最后一个元素
{
	deleteNode(nil->prev);
}

void deleteKey(int key)//删除搜索到的元素
{
	deleteNode(listSearch(key));
}

C语言版本的直观链表创建和读取工具,隐藏了链表的操作细节 可以非常方便地在单片机等平台做FIFO应用,前提是不要用的太嗨,在极小内存的平台上建立好多个FIFO 支持多线程程序,目前尚未发现BUG /*---------------------------- 版本 : V0.01 作者 : ICARUS 日期 : 2019年6月3日 ------------------------------*/ //--------------------------------------------------------------------------------------------// 内置函数 int SL_Create( ) 创建一个数据链表,返回其在系统内的ID值,创建不成功则返回 SL_R_ERR int SL_Delete(int ID) 删除某个使用SL_Create()函数创建过的链表 int SL_InsertInturn(int ID,char* chain,int len,char ** NewNode) 向链表序号为ID的链表尾部插入chain为首地址,长度为len的数据块,数据块在系统中的内存地址将被NewNode返回,若想得到该内存地址,用(*NewNode) 使用示例: char * NewNode; SL_InsetInturn(5,"Hey,boy",strlen("HeyBoy\r\n"),&NewNode;); printf("%s",*NewNode); //------------------------------------------------------------------------------------------// int SL_ReadInturn(int ID,char * chain) 从链表序号为ID的链表头部读取数据到chain中,若返回值大于0,则返回值为数据长度,否则读取失败或链表中已无数据可读。 这一读操作会把数据节点从链表中移除 使用示例: int ReadLen; char chain[1500]; ReadLen = SL_ReadInturn(5,chain); if(ReadLen > 0) { ..... } 注意:由于时间原因,没有来得及修改SL_NodeModify()函数的实现,代码中注释掉的部分请先不要使用,请等待下一版本发布 使用时配合自定义的数据类型效果更佳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工具人来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值