https://zhuanlan.zhihu.com/p/112286505
结构体
typedef struct listNode
{
struct listNode * prev;
int data;
struct listNode * next;
}listNode;
初始化链表
listNode* initlistNode(listNode * head, int arr[], int n){
head=(listNode*)malloc(sizeof(listNode));//创建链表第一个结点(首元结点)
head->prev=NULL;
head->next=NULL;
head->data=arr[0];
listNode * curr=head;
for (int i=1; i<=n-1; i++) {
//创建并初始化一个新结点
listNode * temp=(listNode*)malloc(sizeof(listNode));
temp->prev=NULL;
temp->next=NULL;
temp->data=arr[i];
curr->next=temp;//直接前趋结点的next指针指向新结点
temp->prev=curr;//新结点指向直接前趋结点
curr=curr->next;
}
return head;
}
遍历
void printList(listNode * head){
listNode * curr=head;
int i=0;
while (curr) {
printf("i=%d data=%d",i,curr->data);
curr=curr->next;
i++;
}
}
插入到链表头
插入到链表中间
插入到链表尾
listNode * insertlistNode(listNode * head,int data,int add){
//新建数据域为data的结点
listNode * temp=(listNode*)malloc(sizeof(listNode));
temp->data=data;
temp->prev=NULL;
temp->next=NULL;
//插入到链表头
if (add==1) {
temp->next=head;
head->prev=temp;
head=temp;
}else{
listNode * curr=head;
//找到要插入位置的前一个结点
for (int i=1; i<add-1; i++) {
curr=curr->next;
}
//插入位置为链表尾
if (curr->next==NULL) {
curr->next=temp;
temp->prev=curr;
}else{ //插入到中间
curr->next->prev=temp;
temp->next=curr->next;
body->next=temp;
temp->prev=curr;
}
}
return head;
}
插入到两个结点之间
listNode * insertlistNode(listNode * elem,listNode * prev, listNode * next) {
prev->next = elem;
elem->prev = prev;
elem->next = next;
next->prev = elem;
}
删除链表
listNode * list_del(listNode * head,int data){
listNode * curr=head;
//遍历链表
while (curr) {
//判断当前结点中数据域和data是否相等,若相等,摘除该结点
if (curr->data==data) {
curr->prev->next=curr->next;
curr->next->prev=curr->prev;
free(curr);
return head;
}
curr=curr->next;
}
return head;
}
void list_del(struct listNode *elem)
{
struct listNode *prev, *next;
prev = elem->prev;
next = elem->next;
prev->next = next;
next->prev = prev;
elem->prev = NULL;
elem->next = NULL;
}
int list_empty(struct listNode *elem)
{
return elem->next == elem;
}