当前位置:网站首页>双向链表(我们只需要关注插入和删除函数)
双向链表(我们只需要关注插入和删除函数)
2022-07-03 12:58:00 【fitpolo】

Dlink_list.h
#ifndef _DLINKLIST_H_
#define _DLINKLIST_H_
#include "stdio.h"
#include "stdlib.h"
typedef struct _tag_Dlink_list_node Dlink_list_node;
struct _tag_Dlink_list_node
{
Dlink_list_node *next;
Dlink_list_node *pre;
};
typedef struct _tag_Dlink_list TDlink_list;
struct _tag_Dlink_list
{
Dlink_list_node header;
int length;
};
typedef struct _tag_Dlink_list_value Dlink_list_value;
struct _tag_Dlink_list_value
{
Dlink_list_node node;
int value;//可以替换复杂的结构体
};
TDlink_list* DLinkList_Create(void);
int DLinkList_Insert(TDlink_list* list, Dlink_list_node* node, int pos);
Dlink_list_node* DLinkList_Get(TDlink_list* list, int pos);
Dlink_list_node* DLinkList_Delete(TDlink_list* list, int pos);
//额外扩展的函数
Dlink_list_node* DLinkList_DeleteNode(TDlink_list* list, Dlink_list_node* node);
void DLinkList_printf(TDlink_list* list);
#endif
Dlink_list.c
#include "Dlink_list.h"
TDlink_list* DLinkList_Create(void)
{
TDlink_list* ret = (TDlink_list*)malloc(sizeof(TDlink_list));
if( ret != NULL )
{
ret->length = 0;
ret->header.next = NULL;
ret->header.pre = NULL;
}
return ret;
}
int DLinkList_Insert(TDlink_list* list, Dlink_list_node* node, int pos)
{
int i;
Dlink_list_node* next = NULL;
Dlink_list_node* current = &(list->header);
if (current==NULL && list->length==0)
{
list->header.next = node;
list->header.pre = NULL;
node->next = NULL;
node->pre = NULL;
}else
{
for (i=0; i<pos&&(current->next!=NULL); i++)
{
current = current->next;
}
next = current->next;
//自己画图看看
current->next = node;
node->next = next;
if (next!=NULL)
{
next->pre = node;
}
node->pre = current;
}
list->length++;
return 0;
}
Dlink_list_node* DLinkList_Get(TDlink_list* list, int pos)
{
int i = 0;
Dlink_list_node *ret = NULL;
if (list->length>pos)
{
ret = list->header.next;
for (i=0; i<pos; i++)
{
ret = ret->next;
}
}
return ret;
}
Dlink_list_node* DLinkList_Delete(TDlink_list* list, int pos)
{
int i = 0;
Dlink_list_node *current = NULL;
Dlink_list_node *ret = NULL;
Dlink_list_node *next = NULL;
if (list->length && list->length>pos)
{
current = &(list->header);
for (i=0; i<pos; i++)
{
current = current->next;
}
ret = current->next;
next = ret->next;
current->next = next;
if (next!=NULL)
{
if (current == &(list->header) )
{
next->pre = NULL;
}else
{
next->pre = current;
}
}
list->length--;
}else
{
printf("DLinkList_Delete error %d-%d\n",list->length,pos);
}
return ret;
}
Dlink_list_node* DLinkList_DeleteNode(TDlink_list* list, Dlink_list_node* node)
{
int i;
Dlink_list_node *ret = NULL;
Dlink_list_node *current = &(list->header);
for (i=0; i<list->length; i++)
{
if (current->next == node)
{
ret = current->next;
break;
}
current = current->next;
}
if (ret != NULL)
{
DLinkList_Delete(list,i);
}
return ret;
}
void DLinkList_printf(TDlink_list* list)
{
int i;
Dlink_list_node *current = list->header.next;
Dlink_list_value *tmp;
printf("len:%d-",list->length);
if (current != NULL)
{
for (i=0; i<list->length; i++)
{
tmp = (Dlink_list_value*)current;
printf("[i:%d-v:%d]-",i,tmp->value);
current = current->next;
}
printf("\n");
}
}
测试代码
#include "stdio.h"
#include "stdint.h"
#include "Dlink_list.h"
int main(void)
{
#define BUF_SIZE 10
int i;
TDlink_list *head;
Dlink_list_value buf[BUF_SIZE];
printf("hello \r\n");
for (i=0; i<BUF_SIZE; i++)
{
buf[i].value = i+1;
}
head = DLinkList_Create();
for (i=0; i<BUF_SIZE; i++)
{
DLinkList_Insert(head,(Dlink_list_node*)&buf[i],0);
}
DLinkList_printf(head);
// for (i=0; i<BUF_SIZE; i++)
// {
// DLinkList_Delete(head,0);
// DLinkList_printf(head);
// }
for (i=BUF_SIZE-1; i>=0; i--)
{
DLinkList_Delete(head,i);
DLinkList_printf(head);
}
while(1)
{
}
}
边栏推荐
- Kivy教程之 如何自动载入kv文件
- Sword finger offer 12 Path in matrix
- This math book, which has been written by senior ml researchers for 7 years, is available in free electronic version
- Annotation and reflection
- Flick SQL knows why (10): everyone uses accumulate window to calculate cumulative indicators
- KEIL5出现中文字体乱码的解决方法
- Elk note 24 -- replace logstash consumption log with gohangout
- Red Hat Satellite 6:更好地管理服务器和云
- 使用Tensorflow进行完整的深度神经网络CNN训练完成图片识别案例2
- Kotlin - improved decorator mode
猜你喜欢

Flink SQL knows why (VIII): the wonderful way to parse Flink SQL tumble window

Finite State Machine FSM

STM32 and motor development (from MCU to architecture design)

刚毕业的欧洲大学生,就能拿到美国互联网大厂 Offer?
![[sort] bucket sort](/img/52/95514b5a70cea75821883e016d8adf.jpg)
[sort] bucket sort

The 35 required questions in MySQL interview are illustrated, which is too easy to understand

Detailed explanation of multithreading

PowerPoint tutorial, how to save a presentation as a video in PowerPoint?

The principle of human voice transformer
![[today in history] July 3: ergonomic standards act; The birth of pioneers in the field of consumer electronics; Ubisoft releases uplay](/img/18/b06e2e5a2f76dc2da1c2374b8424b3.png)
[today in history] July 3: ergonomic standards act; The birth of pioneers in the field of consumer electronics; Ubisoft releases uplay
随机推荐
Will Huawei be the next one to fall
Servlet
KEIL5出现中文字体乱码的解决方法
Anan's doubts
R language uses the data function to obtain the sample datasets available in the current R environment: obtain all the sample datasets in the datasets package, obtain the datasets of all packages, and
Mysql database basic operation - regular expression
Useful blog links
【被动收入如何挣个一百万】
[Database Principle and Application Tutorial (4th Edition | wechat Edition) Chen Zhibo] [Chapter 6 exercises]
Flink SQL knows why (17): Zeppelin, a sharp tool for developing Flink SQL
Finite State Machine FSM
JSP and filter
使用tensorflow进行完整的DNN深度神经网络CNN训练完成图片识别案例
Kivy tutorial how to load kV file design interface by string (tutorial includes source code)
父亲和篮球
When updating mysql, the condition is a query
研发团队资源成本优化实践
正则表达式
elk笔记24--用gohangout替代logstash消费日志
刚毕业的欧洲大学生,就能拿到美国互联网大厂 Offer?